๋ฐ์ํ
์๋ ํ์ธ์ yunamom ์ ๋๋ค :D
์ด๋ฒ ํฌ์คํ ์์๋ ํ์ผ์ ๋ก๋(Mysql) , ํ์ผ ๋ชฉ๋ก, ํ์ผ ์์ธ๋ณด๊ธฐํ๋ฉด์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๐ฉ๐ป๐ป
Mysql ํ ์ด๋ธ ์์ฑ ๋ฐ webapp/images ํด๋ ์์ฑ
CREATE TABLE fileboard(
unq INT unsigned NOT NULL AUTO_INCREMENT,
name VARCHAR(50),
title VARCHAR(100),
fileName VARCHAR(200),
hits INT unsigned default '0',
uploadDate DATETIME,
PRIMARY KEY(unq)
);
INSERT INTO fileboard VALUES(1, 'ํ
์คํธ', 'ํ์ผ์
๋ก๋ ํ
์คํธ ์
๋๋ค.', 'file2.png', 0, sysdate());
controller/Controller.java
[ OPEN ]
package controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import service.FileListService;
import service.FileSelectOneService;
import service.Service;
import service.UploadService;
@WebServlet("*.do")
public class Controller extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
execute(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
execute(request, response);
}
private void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String uri = request.getRequestURI();
String conPath = request.getContextPath();
String command = uri.substring(conPath.length());
String site = null;
Service service = null;
switch(command) {
case "/Main.do" :
site = "fileupload/main.jsp";
break;
case "/Upload.do" :
site = "fileupload/upload.jsp";
break;
case "/FileList.do" :
service = new FileListService();
service.execute(request, response);
site = "fileupload/list.jsp";
break;
case "/FileSelect.do" :
service = new FileSelectOneService();
service.execute(request, response);
site = "fileupload/detail.jsp";
break;
case "/UploadService.do" :
service = new UploadService();
service.execute(request, response);
site = "fileupload/main.jsp";
break;
}
RequestDispatcher dis = request.getRequestDispatcher(site);
dis.forward(request, response);
}
}
model/File.java
[ OPEN ]
package model;
public class File {
private int no; //๊ฒ์๋ฌผ๋ฒํธ
private int unq;
private String name;
private String title;
private String fileName;
private int hits;
private String uploadDate;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public int getUnq() {
return unq;
}
public void setUnq(int unq) {
this.unq = unq;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public int getHits() {
return hits;
}
public void setHits(int hits) {
this.hits = hits;
}
public String getUploadDate() {
return uploadDate;
}
public void setUploadDate(String string) {
this.uploadDate = string;
}
}
model/Paging.java
[ OPEN ]
package model;
public class Paging {
private int view;
private int range;
private int start;
private int end;
private int endPage;
public int getView() {
return view;
}
public void setView(int view) {
this.view = view;
}
public int getRange() {
return range;
}
public void setRange(int range) {
this.range = range;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public int getEndPage() {
return endPage;
}
public void setEndPage(int endPage) {
this.endPage = endPage;
}
}
model/FileDAO.java
[ OPEN ]
package model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
public class FileDAO {
private Connection conn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
private int result = 0;
String mvURL = null;
private static FileDAO instance = new FileDAO();
public static FileDAO getInstance() {
return instance;
}
//DB ์ฐ๊ฒฐํ๊ธฐ
public static Connection getConnection() throws Exception {
String url = "jdbc:mysql://localhost:3306/database"; //๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ
String id = "root";
String pw = "root";
//์ ์๋๋ผ์ด๋ฒ ์ฐ๊ฒฐ
Class.forName("com.mysql.cj.jdbc.Driver");
//์ ์์ ๋ณด ์ธํ
Connection con = DriverManager.getConnection(url, id, pw);
//์ ์ํ MySQL์ SQL์คํ ๊ฒฐ๊ณผ๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ๋ณด
return con;
}
//DB ์ฐ๊ฒฐ ์ข
๋ฃํ๊ธฐ
public void close() throws SQLException {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
}
//ํ์ผ์
๋ก๋ ํ๊ธฐ
public int insert(String name, String title, String file){
try {
conn = getConnection();
String sql = " INSERT INTO fileboard ";
sql+= " (name, title, fileName, hits, uploadDate) ";
sql+= " VALUES( ?, ?, ?, 0, sysdate() )";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, title);
pstmt.setString(3, file);
result = pstmt.executeUpdate();
close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
//ํ์ผ์ด๊ฐฏ์
public int countAll() {
int total = 0;
try {
conn = getConnection();
String sql = "SELECT COUNT(*) FROM fileboard";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
if(rs.next()) total = rs.getInt(1);
}catch(Exception e) {
e.printStackTrace();
}
return total;
}
//ํ์ผ๋ชฉ๋ก ์กฐํ (start, end)
public ArrayList<File> selectAll(int start, int end, int total) {
ArrayList<File> list = new ArrayList<>();
try {
conn = getConnection();
String sql = " SELECT ";
sql+= " unq, ";
sql+= " name, ";
sql+= " title, ";
sql+= " fileName, ";
sql+= " hits, ";
sql+= " DATE_FORMAT(uploadDate, '%y/%m/%d')uploadDate ";
sql+= " FROM fileboard ";
sql+= " ORDER BY unq DESC LIMIT ?,?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, start);
pstmt.setInt(2, end);
rs = pstmt.executeQuery();
int count = start;
while(rs.next()) {
File file = new File();
file.setNo(total-count++);
file.setUnq(rs.getInt(1));
file.setName(rs.getString(2));
file.setTitle(rs.getString(3));
file.setFileName(rs.getString(4));
file.setHits(rs.getInt(5));
file.setUploadDate(rs.getString(6));
list.add(file);
}
close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
//์ ํ๋ ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
public File selectOne(String unq) {
File file = new File();
try {
conn = getConnection();
String sql = " SELECT ";
sql+= " unq, ";
sql+= " name, ";
sql+= " title, ";
sql+= " fileName, ";
sql+= " hits, ";
sql+= " DATE_FORMAT(uploadDate, '%y/%m/%d')uploadDate ";
sql+= " FROM fileboard ";
sql+= " WHERE unq ="+unq;
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
rs.next();
file.setUnq(rs.getInt(1));
file.setName(rs.getString(2));
file.setTitle(rs.getString(3));
file.setFileName(rs.getString(4));
file.setHits(rs.getInt(5));
file.setUploadDate(rs.getString(6));
close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return file;
}
public void updateHit(String unq) {
// ์กฐํ์์ฆ๊ฐ
try {
conn = getConnection();
String sql = " UPDATE fileboard ";
sql+= " SET hits = hits+1 ";
sql+= " WHERE unq ="+unq;
pstmt = conn.prepareStatement(sql);
pstmt.executeUpdate();
close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
service/Service.java
[ OPEN ]
package service;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Service {
public void execute(HttpServletRequest request, HttpServletResponse response) throws IOException;
}
service/UploadService.java
[ OPEN ]
package service;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
import model.FileDAO;
public class UploadService implements Service {
public void execute(HttpServletRequest request, HttpServletResponse response) throws IOException {
String saveDir = request.getSession().getServletContext().getRealPath("images");
System.out.println("์ ๋๊ฒฝ๋ก : " + saveDir);
int maxSize = 1024*1024*15;
String encoding = "UTF-8";
// saveDir: ๊ฒฝ๋ก
// maxSize: ํฌ๊ธฐ์ ํ ์ค์
// encoding: ์ธ์ฝ๋ฉํ์
์ค์
// new DefaultFileRenamePolicy(): ์ค๋ณต์ด๋ฆ ๋ฐฉ์ง
MultipartRequest multi = new MultipartRequest(request, saveDir, maxSize, encoding, new DefaultFileRenamePolicy());
/* URL check */
String uri = request.getRequestURI();
String con = request.getContextPath();
String command = uri.substring(con.length());
System.out.println(command);
String name = multi.getParameter("name");
String title = multi.getParameter("title");
String file = multi.getFilesystemName("file");
FileDAO dao = FileDAO.getInstance(); // static ์์ญ์ ์ฌ๋ ค์ง ๊ฐ์ฒด๋ฅผ ๋ฉ์๋๋ก ์ป์ด์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๋ ์ฑ๊ธํค ํจํด
int result = dao.insert(name, title, file);
if(result > 0) {
System.out.println("์ ์ฅ์๋ฃ!");
}else {
System.out.println("์ ์ฅ์คํจ!");
}
}
}
service/FileListService.java
[ OPEN ]
package service;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.File;
import model.FileDAO;
import model.Paging;
public class FileListService implements Service {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
FileDAO dao = FileDAO.getInstance();
String view = request.getParameter("view");
/* ํ์ฌ ํ์ด์ง */
int viewPage = (view == null) ? 1 : Integer.parseInt(view);
/* ํ ๋ธ๋ญ( range : ๋ฒ์ ) ์ ํ์ด์ง ์ */
int rangeSize = 5;
int end = 5; // ํ ํ์ด์ง์ ๊ฒ์๋ฌผ ์
int start = (viewPage-1)*rangeSize;
/* ์ด ํ์ผ ๊ฐฏ์ */
int total = dao.countAll();
// ๋ง์ง๋ง ํ์ด์ง
int endPage = (int)Math.ceil((double)total/5);
// ( range : ๋ฒ์ )
int Range = (viewPage % rangeSize == 0)?viewPage/rangeSize:(viewPage/rangeSize)+1;
// ์ด์ ๋ฒํผ ๋ธ๋ญ( range : ๋ฒ์ )
int startRange = (Range-1)*rangeSize+1;
// ๋ค์๋ฒํผ ๋ธ๋ญ( range : ๋ฒ์ )
int endRange = startRange + rangeSize-1;
// ๋ง์ง๋ง ๋ธ๋ฝ์์ ์ดํ์ด์ง์๋ฅผ ๋์ด๊ฐ๋ฉด ๋ ํ์ด์ง๋ฅผ ๋ง์ง๋ง ํ์ด์ง ์ซ์๋ก ๋ฃ์ด์ค๋๋ค.
endRange = (endRange >= endPage) ? endPage : endRange;
ArrayList<File> list = dao.selectAll(start, end, total);
Paging paging = new Paging();
paging.setView(viewPage);
paging.setRange(rangeSize);
paging.setStart(startRange);
paging.setEnd(endRange);
paging.setEndPage(endPage);
request.setAttribute("list", list);
request.setAttribute("paging", paging);
}
}
service/FileSelectoneService.java
[ OPEN ]
package service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.File;
import model.FileDAO;
public class FileSelectOneService implements Service {
public void execute(HttpServletRequest request, HttpServletResponse response) {
String unq = request.getParameter("unq");
FileDAO dao = FileDAO.getInstance();
dao.updateHit(unq); // ์กฐํ์์ฆ๊ฐ
request.setAttribute("file", dao.selectOne(unq));
}
}
index.jsp
[ OPEN ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<% response.sendRedirect("Main.do"); %>
</body>
</html>
css/style.css
[ OPEN ]
@charset "UTF-8";
*{
margin: 0;
padding: 0;
}
body{
background: #ebecfa;
}
header{
height: 100px;
line-height: 100px;
background: #444;
text-align: center;
}
nav ul{
height: 50px;
line-height: 50px;
background: #837b93;
}
li{
float: left;
list-style: none;
padding: 0 10px;
}
a{
text-decoration: none;
color: rgb(104, 105, 105);
font-weight: 900;
}
li a{
color: #fff;
}
.Boxfile{ /* ์ ์ค์ */
margin: 3rem;
display: grid;
place-items: center;
min-height: 50vh;
background-color: rgba(255,255,255,0.7);
padding: 1rem;
border-radius: 0.3rem;
}
.input{
font-size: 1rem;
padding: 0.5rem 1rem;
border-radius: 0.3rem;
border: 1px solid #333;
}
.Boxbtn{
text-align: center;
padding: 1rem;
}
.btn{
padding: 0.4rem 1rem;
cursor: pointer;
border-radius: 0.3rem;
border: 1px solid #8e8f8f;
}
.btn:hover{
opacity: 0.6;
}
.imgList{
width:50px;
height:50px;
}
.wrapper{
display: flex;
justify-content: center;
align-items: center;
margin:1rem;
}
section{
height: 100%;
width: 100%;
}
.title{
margin: 3rem;
font-size: 30px;
font-weight: 900;
text-align: center;
color: #615d6f;
}
.legend{
font-size: 20px;
text-align: center;
font-weight: 900;
color: #615d6f;
}
.Boxtitle{
width:50px;
height:50px;
}
.Box{
height: 300px;
}
.Box table{
width: 600px;
text-align: center;
}
.Box table, .Box th, .Box td{
border: 1px solid #544952;
border-collapse: collapse;
padding: 0.5rem;
}
.unq{
font-size: 15px;
color: #aeb0b2;
}
.Box th{
background: #837b93;
color: #fff;
}
.range{
margin: 0 10px;
font-size: 20px;
cursor: pointer;
}
.range:hover{
opacity: 0.6;
}
.Boxrange{
width: 200px;
text-align: center;
}
.Boxprev{
width: 80px;
text-align: right;
}
.Boxnext{
width: 80px;
text-align: left;
}
.Filetitle {
display: inline-block;
width: 200px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
cursor: pointer;
text-align: left;
}
.Filetitle:hover{
opacity: 0.6;
}
.Filetitle a{
font-weight: 0;
}
.Boxdetail{
width: 100%;
text-align:center;
background: #fff;
font-size: 12px;
color: #333;
}
.Boxfile img{
width: 300px;
}
/* ๋ง์ค์ํ */
.target {
display: inline-block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
border: none;
}
include/topmenu.jsp
[ OPEN ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>topmenu</title>
</head>
<body>
<nav>
<ul>
<li><a href="FileList.do">List</a></li>
<li><a href="Upload.do">Upload</a></li>
<li><a href="Main.do">Main</a></li>
</ul>
</nav>
</body>
</html>
fileupload/main.jsp
[ OPEN ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="css/style.css">
<title>๋ฉ์ธ</title>
</head>
<body>
<%@ include file="/include/topmenu.jsp" %>
<section>
<div class="title">* ํ์ผ ์
๋ก๋ ๋ฉ์ธ *</div>
</section>
</body>
</html>
fileupload/upload.jsp
[ OPEN ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="css/style.css?ver=1">
<script src="script/script.js"></script>
<title>ํ์ผ ์
๋ก๋</title>
</head>
<body>
<%@ include file="/include/topmenu.jsp" %>
<section>
<div class="title"> </div>
<div class="wrapper">
<fieldset >
<legend class="legend">* ํ์ผ ์
๋ก๋ *</legend>
<form class="Boxfile" method="post" action="UploadService.do" enctype="multipart/form-data">
<!-- ์๋ฒ์ ํ์ผ์ ๋ณด๋ผ๊ฒ ์ด๋ผ๊ณ ์๋ ค์ฃผ๊ธฐ ์ํด enctype ์ต์
์ multipart/form-data ์ ์ธํด์ฃผ๊ธฐ -->
<table>
<tr>
<td>Title : </td>
<td><input class="input" type="text" name="title"/></td>
</tr>
<tr>
<td>Name : </td>
<td><input class="input" type="text" name="name"/></td>
</tr>
<tr>
<td>File : </td>
<td><input type="file" name="file"/></td>
</tr>
<tr>
<td colspan="2" class="Boxbtn">
<Button class="btn" type="submit" >Upload</Button>
<Button class="btn" type="Button" onclick="location='Upload.do'">Reset</Button>
</td>
</tr>
</table>
</form>
</fieldset>
</div>
</section>
</body>
</html>
fileupload/list.jsp
[ OPEN ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="C"%>
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="css/style.css?ver=1">
<meta charset="UTF-8">
<title>File List</title>
</head>
<body>
<%@ include file="/include/topmenu.jsp" %>
<section>
<div class="title"><img class="Boxtitle" src="images/file2.png"/>
</div>
<div class="wrapper">
<div class="Box">
<table>
<tr>
<th>No</th>
<th>Title</th>
<th>Name</th>
<th>Date</th>
<th>hits</th>
</tr>
<C:forEach var="i" items="${list }">
<tr>
<td class="unq">${i.no }</td>
<td><a href="FileSelect.do?unq=${i.unq }" class="Filetitle">
${i.title }</a></td>
<td><p class="target" style="width:80px">${i.name }</p></td>
<td><p class="target" style="width:80px">${i.uploadDate }</p></td>
<td>${i.hits }</td>
</tr>
</C:forEach>
</table>
</div>
</div>
<div class="wrapper">
<div class="Boxprev">
<C:if test="${paging.start != 1 }">
<a class="range" href="?view=${paging.start-1}">์ด์ </a>
</C:if>
</div>
<div class="Boxrange">
<C:forEach var="status" begin="${paging.start }" end="${paging.end }">
<a class="range" href="?view=${status }">${status }</a>
</C:forEach>
</div>
<div class="Boxnext">
<C:if test="${paging.end < paging.endPage}">
<a class="range" href="?view=${paging.end+1}">๋ค์</a>
</C:if>
</div>
</div>
</section>
</body>
</html>
fileupload/detail.jsp
[ OPEN ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="C"%>
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="css/style.css?ver=1">
<meta charset="UTF-8">
<title>File Detail</title>
</head>
<body>
<%@ include file="/include/topmenu.jsp" %>
<section>
<div class="title"> </div>
<div class="wrapper">
<fieldset >
<legend class="legend">์ ๋ชฉ : ${file.title }</legend>
<div class="Boxdetail">์์ฑ์ : ${file.name } โ ${file.uploadDate} โ ์กฐํ์ : ${file.hits }</div>
<div class="Boxfile">
<img src="images/${file.fileName }"/>
</div>
</fieldset>
</div>
<div class="Boxbtn">
<Button class="btn" type="Button" onclick="history.back()">๋ชฉ๋ก์ผ๋ก</Button>
</div>
</section>
</body>
</html>
WEB-INF/lib/web.xml
[ OPEN ]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">
<display-name>file</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
WEB-INF/lib
ํ ์คํธ์ ๋ก๋ ํ์ผ
์ด๋ ๊ฒ ํ์ผ ์ ๋ก๋/ํ์ผ ๋ชฉ๋ก/์์ธ๋ณด๊ธฐ๋ฅผ ๊ตฌํํด๋ณด์๋๋ฐ์,
๋ค์ ๊ธ์์๋ ํ์ผ ์์ /์ญ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ์ฌ ํฌ์คํ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.๐ฉ๐ป๐ป๐
300x250
'๊ฐ๋ฐ์ธ์ด > JSP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JSTL] JSTL ๊ธฐ์ด ์ ๋ฆฌ (๋ฌธ๋ฒ / ์์ฑ๋ฒ) (0) | 2022.04.07 |
---|---|
[JSP/Servlet] css, js ์ ์ฉ์ด ์๋จ ํด๊ฒฐํ๊ธฐ (1) | 2022.04.05 |
[JSP] ๊ฒ์๊ธ ์ค๋ฐ๊ฟํ๊ธฐ - ( c:out / <pre> ํ๊ทธ ) (0) | 2022.03.30 |
JSP - ์๋ธ๋ฆฟ ๊ธฐ์ด ( model 2 ๋ฐฉ์ ) STEP 2 (0) | 2022.03.28 |
JSP - ์๋ธ๋ฆฟ ๊ธฐ์ด ( model 2 ๋ฐฉ์ ) STEP 1 (0) | 2022.03.28 |