게시판#2
(답변글, 게시물 삭제 제외하고 완료)
첨부파일 이미지
![](https://velog.velcdn.com/images/9t06/post/8b9db138-5549-48cc-ad52-89fae72c51f0/image.png)
Mgr 파일 추가
(게시물 가져오기, 조회수 증가, 게시물 삭제, 게시물 수정)
BoardMgr.java
package ch15;
import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;
import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.ssi.SSICommand;
import com.mysql.cj.util.Util;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
public class BoardMgr {
private DBConnectionMgr pool;
public static final String SAVEFOLDER = "C:/Jsp/myapp/src/main/webapp/ch15/fileupload/";
public static final String ENCODING = "UTF-8";
public static final int MAXSIZE = 1024*1024*20; //20MB
public BoardMgr() {
pool = DBConnectionMgr.getInstance();
}
// board Insert
public void insertBoard(HttpServletRequest req) {
Connection con = null;
PreparedStatement pstmt = null;
String sql = null;
try {
File dir = new File(SAVEFOLDER);
if(!dir.exists()/*존재하지 않으면*/) {
dir.mkdirs(); // mkdirs는 상위폴더가 없어도 생성
// mkdir은 상위폴더가 없으면 생성 불가
}
MultipartRequest multi =
new MultipartRequest(req, SAVEFOLDER, MAXSIZE, ENCODING
,new DefaultFileRenamePolicy());
String filename = null;
int filesize=0;
if(multi.getFilesystemName("filename")!=null) {
filename = multi.getFilesystemName("filename");
filesize = (int)multi.getFile("filename").length();
}
String content = multi.getParameter("content");
String contentType = multi.getParameter("contentType");
if(contentType.equals("TEXT")) {
content = UtilMgr.replace(content, "<", "%lt;");
}
int ref = getMaxNum()+1; //답변을 위한 ref값 설정
con = pool.getConnection();
sql = "insert tblBoard(name,content,subject,ref,pos,depth,";
sql += "regdate,pass,count,ip,filename,filesize)";
sql += "values(?, ?, ?, ?, 0, 0, now(), ?, 0, ?, ?, ?)";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, multi.getParameter("name"));
pstmt.setString(2, content);
pstmt.setString(3, multi.getParameter("subject"));
pstmt.setInt(4, ref);
pstmt.setString(5, multi.getParameter("pass"));
pstmt.setString(6, multi.getParameter("ip"));
pstmt.setString(7, filename);
pstmt.setInt(8, filesize);
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt);
}
}
// board Max Num : num의 현재 최대값
public int getMaxNum() {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
int maxNum = 0;
try {
con = pool.getConnection();
sql = "select max(num) from tblBoard";
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
if(rs.next()) maxNum = rs.getInt(1);
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt, rs);
}
return maxNum;
}
// board Total Count : 총 게시물 수
public int getTotalCount(String keyField, String keyWord) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
int totalCount = 0;
try {
con = pool.getConnection();
if(keyWord.trim().equals("")||keyWord==null) {
//검색이 아닌경우
sql = "select count(*) from tblBoard";
pstmt = con.prepareStatement(sql);
}else {
sql = "select count(*) from tblBoard where "
+ keyField + " like ? ";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, "%"+keyWord+"%");
}
rs = pstmt.executeQuery();
if(rs.next())
totalCount = rs.getInt(1);
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt, rs);
}
return totalCount;
}
// board List : 검색기능, 페이징 및 블록
// limit 시작번호, 가져올 개수
public Vector<BoardBean> getBoardList(String keyField, String keyWord, int start, int cnt) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
Vector<BoardBean> vlist = new Vector<BoardBean>();
try {
con = pool.getConnection();
if(keyWord.trim().equals("")||keyWord==null) {
//검색이 아닌 경우
sql = "select * from tblBoard order by ref desc, pos limit ?, ?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, start);
pstmt.setInt(2, cnt);
}else {
sql = "select * from tblBoard where "
+ keyField + " like ? order by ref desc, pos limit ?, ? ";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, "%"+keyWord+"%");
pstmt.setInt(2, start);
pstmt.setInt(3, cnt);
}
rs = pstmt.executeQuery();
while(rs.next()) {
BoardBean bean = new BoardBean();
bean.setNum(rs.getInt("num"));
bean.setName(rs.getString("name"));
bean.setSubject(rs.getString("subject"));
bean.setPos(rs.getInt("pos"));
bean.setRef(rs.getInt("ref"));
bean.setDepth(rs.getInt("depth"));
bean.setRegdate(rs.getString("regdate"));
bean.setCount(rs.getInt("count"));
bean.setFilename(rs.getString("filename"));
vlist.addElement(bean);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt, rs);
}
return vlist;
}
// board Get : 게시물 한개 읽어오기(13개의 컬럼 리턴){
public BoardBean getBoard(int num) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
BoardBean bean = new BoardBean();
try {
con = pool.getConnection();
sql = "select * from tblboard where num = ?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
rs = pstmt.executeQuery();
if(rs.next()) {
bean.setNum(rs.getInt("num"));
bean.setName(rs.getString("name"));
bean.setSubject(rs.getString("subject"));
bean.setContent(rs.getString("content"));
bean.setPos(rs.getInt("pos"));
bean.setRef(rs.getInt("ref"));
bean.setDepth(rs.getInt("depth"));
bean.setRegdate(rs.getString("regdate"));
bean.setPass(rs.getString("pass"));
bean.setIp(rs.getString("ip"));
bean.setCount(rs.getInt("count"));
bean.setFilename(rs.getString("filename"));
bean.setFilesize(rs.getInt("filesize"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt, rs);
}
return bean;
}
// Count up : 조회수 증가
public void upCount(int num) {
Connection con = null;
PreparedStatement pstmt = null;
String sql = null;
try {
con = pool.getConnection();
sql = "UPDATE tblboard SET COUNT = COUNT+1 WHERE num = ? ";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt);
}
}
// board delete : 파일업로드 파일까지 삭제
public void deleteBoard(int num) {
Connection con = null;
PreparedStatement pstmt = null;
String sql = null;
try {
BoardBean bean = getBoard(num);
String filename = bean.getFilename();
if(filename!=null&&!filename.equals("")) {
File f = new File(SAVEFOLDER+filename);
if(f.exists()) {
UtilMgr.delete(SAVEFOLDER+filename);
}
}
con = pool.getConnection();
sql = "delete from tblboard where num = ?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt);
}
}
// board Update : 파일업로드 수정
// 파일이 업로드 수정이 되면 기존에 파일은 삭제되어야 한다.
public void updateBoard(MultipartRequest multi) {
Connection con = null;
PreparedStatement pstmt = null;
String sql = null;
try {
con = pool.getConnection();
int num = Integer.parseInt(multi.getParameter("num"));
String name = multi.getParameter("name");
String subject = multi.getParameter("subject");
String content = multi.getParameter("content");
String filename = multi.getFilesystemName("filename");
if(filename!=null&&!filename.equals("")) {
//파일 업로드 수정 선택
BoardBean bean = getBoard(num);
String tempfile = bean.getFilename();
if(tempfile!=null&&!tempfile.equals("")) {
File f = new File(SAVEFOLDER+tempfile);
if(f.exists()) {
UtilMgr.delete(SAVEFOLDER+tempfile);
}
}
int filesize = (int)multi.getFile("filename").length();
sql = "update tblBoard set name=?, subject=?, content=?,"
+ "filename=?, filesize=? where num=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, subject);
pstmt.setString(3, content);
pstmt.setString(4, filename);
pstmt.setInt(5, filesize);
pstmt.setInt(6, num);
}else {
// 수정 페이지에서 파일 업로드를 선택하지 않은 때
sql = "update tblBoard set name=?, subject=?, content=?"
+ " where num=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, subject);
pstmt.setString(3, content);
pstmt.setInt(4, num);
}
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt);
}
return;
}
// board Reply : 답변글 입력
// board Reply Up : 답변글 위치값 수정
// 게시물 1000개 입력
public void post1000(){
Connection con = null;
PreparedStatement pstmt = null;
String sql = null;
try {
con = pool.getConnection();
sql = "insert tblBoard(name,content,subject,ref,pos,depth,regdate,pass,count,ip,filename,filesize)";
sql+="values('aaa', 'bbb', 'ccc', 0, 0, 0, now(), '1234',0, '127.0.0.1', null, 0);";
pstmt = con.prepareStatement(sql);
for (int i = 0; i < 1000; i++) {
pstmt.executeUpdate();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt);
}
}
public static void main(String[] args) {
BoardMgr mgr = new BoardMgr();
mgr.post1000();
System.out.println("입력성공");
}
}
Servlet 파일 추가(update, delete)
BoardUpdateServlet.java
package ch15;
import java.io.IOException;
import java.io.PrintWriter;
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 javax.servlet.http.HttpSession;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
@WebServlet("/ch15/boardUpdate")
public class BoardUpdateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//세션에 저장된 bean 객체 리턴
HttpSession session = request.getSession();
BoardBean bean = (BoardBean)session.getAttribute("bean");
String dbPass = bean.getPass();
MultipartRequest multi=
new MultipartRequest(request, BoardMgr.SAVEFOLDER, BoardMgr.MAXSIZE,
BoardMgr.ENCODING, new DefaultFileRenamePolicy());
//update.jsp 입력한 값
String inPass = multi.getParameter("pass");
if(dbPass.equals(inPass)) {
BoardMgr mgr = new BoardMgr();
mgr.updateBoard(multi);
String nowPage = multi.getParameter("nowPage");
String numPerPage = multi.getParameter("numPerPage");
response.sendRedirect("read.jsp?nowPage="+nowPage
+"&numPerPage="+numPerPage+"&num="+bean.getNum());
}else {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<script>");
out.println("alert('입력하신 비밀번호가 아닙니다')");
out.println("history.back()");
out.println("</script>");
}
}
}
BoardDeleteServlet.java
package ch15;
import java.io.IOException;
import java.io.PrintWriter;
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 javax.servlet.http.HttpSession;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
@WebServlet("/ch15/boardDelete")
public class BoardDeleteServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
BoardBean bean = (BoardBean)session.getAttribute("bean");
String dbPass = bean.getPass();
// read.jsp 입력한 값
String inPass = request.getParameter("pass");
if(dbPass.equals(inPass)) {
BoardMgr mgr = new BoardMgr();
mgr.deleteBoard(bean.getNum());
String numPerPage = request.getParameter("numPerPage");
String nowPage = request.getParameter("nowPage");
String keyField = request.getParameter("keyField");
String keyWord = request.getParameter("keyWord");
String url = "list.jsp?numPerPage="+numPerPage;
url+="&nowPage="+nowPage;
if(!(keyWord==null||keyWord.equals(""))) {
url+="&keyField="+keyField;
url+="&keyWord="+keyWord;
}
response.sendRedirect(url);
}else {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<script>");
out.println("alert('입력하신 비밀번호가 아닙니다')");
out.println("history.back()");
out.println("</script>");
}
}
}
JSP 파일 추가(검색, 조회수, 수정파일)
![](https://velog.velcdn.com/images/9t06/post/fb5f4a30-8aae-486f-8c1a-e91a494d867e/image.png)
list.jsp 추가
전체 코드
<%@page import="com.mysql.cj.util.Util"%>
<%@page import="ch15.BoardBean"%>
<%@page import="java.util.Vector"%>
<%@page import="ch15.UtilMgr"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<jsp:useBean id="mgr" class="ch15.BoardMgr"/>
<%
int totalRecord = 0; // 총 게시물 수
int numPerPage = 10; // 페이지 당 게시물 개수(5,10,20,30)
int pagePerBlock = 15; // 페이지 모음 블록
int totalPage = 0; // 총 페이지 개수
int totalBlock = 0; // 총 블럭 개수
int nowPage = 1; // 현재 페이지
int nowBlock = 1; // 현재 블록
// 요청된 numPerPage 처리
if(request.getParameter("numPerPage")!=null){
numPerPage = UtilMgr.parseInt(request, "numPerPage");
}
// 검색에 필요한 변수
String keyField = "", keyWord = "";
if(request.getParameter("keyWord")!=null){
keyField = request.getParameter("keyField");
keyWord = request.getParameter("keyWord");
}
// 검색 후에 다시 reset 요청
if(request.getParameter("reload")!=null&&
request.getParameter("reload").equals("true")){
keyField=""; keyWord="";
}
totalRecord = mgr.getTotalCount(keyField, keyWord);
//out.print(totalRecord);
if(request.getParameter("nowPage")!=null){
nowPage = UtilMgr.parseInt(request, "nowPage");
}
// sql문에 들어가는 start, cnt선언
int start = (nowPage*numPerPage)-numPerPage;
int cnt = numPerPage;
// 전체 페이지 개수
totalPage = (int)Math.ceil((double)totalRecord/numPerPage);
// 전체 블록 개수
totalBlock = (int)Math.ceil((double)totalRecord/pagePerBlock);
// 현재 블럭 개수
nowBlock = (int)Math.ceil((double)nowPage/pagePerBlock);
//out.println("totalPage : "+totalPage+"<br>");
//out.println("totalBlock : "+totalBlock+"<br>");
//out.println("nowBlock : "+nowBlock+"<br>");
%>
<!DOCTYPE html>
<html>
<head>
<title>JSP Board</title>
<link href="style.css" rel="stylesheet" type="text/css">
<script type="text/javascript">
function block(block){
document.readFrm.nowPage.value = <%=pagePerBlock%>*(block-1)+1;
document.readFrm.submit();
}
function paging(page){
document.readFrm.nowPage.value = page;
document.readFrm.submit();
}
function check() {
if(document.searchFrm.keyWord.value==""){
alert("검색어를 입력하세요.");
document.searchFrm.keyWord.focus();
return;
}
document.searchFrm.submit();
}
function list() {
document.listFrm.action = "list.jsp";
document.listFrm.submit();
}
function numPerFn(numPerPage){
document.readFrm.action="list.jsp";
document.readFrm.numPerPage.value=numPerPage;
document.readFrm.submit();
}
function read(num){
document.readFrm.num.value=num;
document.readFrm.action="read.jsp";
document.readFrm.submit();
}
</script>
</head>
<body bgcolor="#FFFFCC" >
<div align="center"><br/>
<h2>JSP Board</h2><br/>
<table>
<tr>
<td width="600">
Total : <%=totalRecord%>Articles(<font color="red">
<%=nowPage+"/"+totalPage%>Pages</font>)
</td>
<td align="right">
<form name="npFrm" method="post">
<select name="numPerPage" size="1"
onchange="javascript:numPerFn(this.form.numPerPage.value)">
<option value="5">5개 보기</option>
<option value="10" selected>10개 보기</option>
<option value="15">15개 보기</option>
<option value="30">30개 보기</option>
</select>
<script>document.npFrm.numPerPage.value=<%=numPerPage%></script>
</form>
</td>
</tr>
</table>
<table>
<tr>
<td align="center" colspan="2">
<%
Vector<BoardBean> vlist = mgr.getBoardList(keyField, keyWord, start, cnt);
int listSize = vlist.size();
if(vlist.isEmpty()){
out.println("등록된 게시물이 없습니다.");
}else{
%>
<table cellspacing="0">
<tr align="center" bgcolor="#D0D0D0">
<td width="100">번 호</td>
<td width="250">제 목</td>
<td width="100">이 름</td>
<td width="150">날 짜</td>
<td width="100">조회수</td>
</tr>
<%
for(int i=0;i<numPerPage;i++){
if(i==listSize)break;
BoardBean bean = vlist.get(i);
int num = bean.getNum();
String subject = bean.getSubject();
String name = bean.getName();
String regdate = bean.getRegdate();
int depth = bean.getDepth();
int count = bean.getCount();
String filename = bean.getFilename();
%>
<tr align="center">
<td><%=totalRecord-start-i %></td>
<td align="left">
<a href="javascript:read('<%=num %>')">
<%=subject %>
</a>
<%if(filename!=null&&!filename.equals("")){ %>
<img alt="첨부파일" src="img/icon.gif" align="middle">
<%} %>
</td>
<td><%=name %></td>
<td><%=regdate %></td>
<td><%=count %></td>
</tr>
<% }//--for%>
</table>
<% }//--if-else%>
</td>
</tr>
<tr>
<td colspan="2"><br><br></td>
</tr>
<tr>
<td>
<%if(nowBlock>1){ %>
<a href="javascript:block('<%=nowBlock-1 %>')">prev...</a>
<%} %>
<%
int pageStart = (nowBlock-1)*pagePerBlock+1;
int pageEnd = (pageStart+pagePerBlock)<totalPage ?
pageStart+pagePerBlock:totalPage+1;
for(;pageStart<pageEnd;pageStart++){
%>
<a href="javascript:paging('<%=pageStart %>')">
<%if(nowPage==pageStart){ %><font color="blue"><%} %>
[<%=pageStart %>]
<%if(nowPage==pageStart){ %></font><%} %>
</a>
<% }%>
<%if(totalBlock>nowBlock){ %>
<a href="javascript:block('<%=nowBlock+1 %>')">...next</a>
<%} %>
</td>
<td align="right">
<a href="post.jsp" >[글쓰기]</a>
<a href="javascript:list()">[처음으로]</a>
</td>
</tr>
</table>
<form name="searchFrm">
<table width="600" cellpadding="4" cellspacing="0">
<tr>
<td align="center" valign="bottom">
<select name="keyField" size="1" >
<option value="name"> 이 름</option>
<option value="subject"> 제 목</option>
<option value="content"> 내 용</option>
</select>
<input size="16" name="keyWord">
<input type="button" value="찾기" onClick="javascript:check()">
<input type="hidden" name="nowPage" value="1">
</td>
</tr>
</table>
</form>
<hr width="750">
<form name="listFrm" method="post">
<input type="hidden" name="reload" value="true">
<input type="hidden" name="nowPage" value="1">
</form>
<form name="readFrm">
<input type="hidden" name="nowPage" value="<%=nowPage%>">
<input type="hidden" name="numPerPage" value="<%=numPerPage%>">
<input type="hidden" name="keyField" value="<%=keyField%>">
<input type="hidden" name="keyWord" value="<%=keyWord%>">
<input type="hidden" name="num">
</form>
</div>
</body>
</html>
첨부파일 아이콘
<td align="left">
<%=subject %>
<%if(filename!=null&&!filename.equals("")){ %>
<img alt="첨부파일" src="img/icon.gif" align="middle">
<%} %>
</td>
보기 개수 정하기
![](https://velog.velcdn.com/images/9t06/post/41023d18-2c6a-41bd-8ef6-6976a79623b2/image.png)
function numPerFn(numPerPage){
//alert(numPerPage);
document.readFrm.action="list.jsp";
document.readFrm.numPerPage.value=numPerPage;
document.readFrm.submit();
}
//
<table>
<tr>
<td width="600">
Total : <%=totalRecord%>Articles(<font color="red">
<%=nowPage+"/"+totalPage%>Pages</font>)
</td>
<td align="right">
<form name="npFrm" method="post">
<select name="numPerPage" size="1"
onchange="javascript:numPerFn(this.form.numPerPage.value)">
<option value="5">5개 보기</option>
<option value="10" selected>10개 보기</option>
<option value="15">15개 보기</option>
<option value="30">30개 보기</option>
</select>
<script>document.npFrm.numPerPage.value=<%=numPerPage%></script>
</form>
</td>
</tr>
</table>
검색 기능
function check() {
if(document.searchFrm.keyWord.value==""){
alert("검색어를 입력하세요.");
document.searchFrm.keyWord.focus();
return;
}
document.searchFrm.submit();
}
//
orm name="searchFrm">
<table width="600" cellpadding="4" cellspacing="0">
<tr>
<td align="center" valign="bottom">
<select name="keyField" size="1" >
<option value="name"> 이 름</option>
<option value="subject"> 제 목</option>
<option value="content"> 내 용</option>
</select>
<input size="16" name="keyWord">
<input type="button" value="찾기" onClick="javascript:check()">
<input type="hidden" name="nowPage" value="1">
</td>
</tr>
</table>
</form>
![](https://velog.velcdn.com/images/9t06/post/169b79f0-1fc2-4626-9c78-fb8d5de5cfb5/image.png)
read.jsp
전체코드
<%@page import="ch15.BoardBean"%>
<%@page import="ch15.UtilMgr"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<jsp:useBean id="mgr" class="ch15.BoardMgr"/>
<%
String nowPage = request.getParameter("nowPage");
String numPerPage = request.getParameter("numPerPage");
String keyField = request.getParameter("keyField");
String keyWord = request.getParameter("keyWord");
int num = UtilMgr.parseInt(request, "num");
mgr.upCount(num);
BoardBean bean = mgr.getBoard(num);
String name = bean.getName();
String subject = bean.getSubject();
String regdate = bean.getRegdate();
String content = bean.getContent();
String filename = bean.getFilename();
int filesize = bean.getFilesize();
String ip = bean.getIp();
int count = bean.getCount();
// 읽어온 게시물을 수정과 삭제를 위해서 세션에 저장을 하겠습니다.
session.setAttribute("bean", bean);
%>
<!DOCTYPE html>
<html>
<head>
<title>JSP Board</title>
<link href="style.css" rel="stylesheet" type="text/css">
<script type="text/javascript">
function list() {
document.listFrm.action = "list.jsp";
document.listFrm.submit();
}
function down(filename) {
document.downFrm.filename.value=filename;
document.downFrm.submit();
}
function delFn(){
const pass = document.getElementById("passId");
if(pass.value.length==0){
alert("비밀번호 입력하세요");
pass.focus();
return;
}
document.delFrm.pass.value=pass.value;
document.delFrm.submit();
}
</script>
</head>
<body bgcolor="#FFFFCC">
<br/><br/>
<table align="center" width="600" cellspacing="3">
<tr>
<td bgcolor="#9CA2EE" height="25" align="center">글읽기</td>
</tr>
<tr>
<td colspan="2">
<table cellpadding="3" cellspacing="0" width="100%">
<tr>
<td align="center" bgcolor="#DDDDDD" width="10%"> 이 름 </td>
<td bgcolor="#FFFFE8"><%=name%></td>
<td align="center" bgcolor="#DDDDDD" width="10%"> 등록날짜 </td>
<td bgcolor="#FFFFE8"><%=regdate%></td>
</tr>
<tr>
<td align="center" bgcolor="#DDDDDD"> 제 목</td>
<td bgcolor="#FFFFE8" colspan="3"><%=subject%></td>
</tr>
<tr>
<td align="center" bgcolor="#DDDDDD">첨부파일</td>
<td bgcolor="#FFFFE8" colspan="3">
<%if(filename!=null&&!filename.equals("")){ %>
<a href="javascript:down('<%=filename%>')"><%=filename %></a>
<font color="blue">(<%=UtilMgr.intFormat(filesize)%>bytes) </font>
<%}else { out.print("첨부된 파일이 없습니다.");}%>
</td>
<tr>
<td align="center" bgcolor="#DDDDDD">비밀번호</td>
<td bgcolor="#FFFFE8" colspan="3">
<input type="password" name="pass" id="passId">
</td>
</tr>
</tr>
<tr>
<td colspan="4"><br/><pre><%=content%></pre><br/></td>
</tr>
<tr>
<td colspan="4" align="right">
<%=ip%>로 부터 글을 남기셨습니다./ 조회수 <%=count%>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="center" colspan="2">
<hr/>
[ <a href="javascript:list()" >리스트</a> |
<a href="update.jsp?nowPage=<%=nowPage%>&num=<%=num%>&numPerPage=<%=numPerPage%>" >수 정</a> |
<a href="reply.jsp?nowPage=<%=nowPage%>&numPerPage=<%=numPerPage%>" >답 변</a> |
<a href="javascript:delFn()">삭 제</a> ]<br/>
</td>
</tr>
</table>
<form method="post" name="downFrm" action="download.jsp">
<input type="hidden" name="filename">
</form>
<form name="listFrm">
<input type="hidden" name="nowPage" value="<%=nowPage%>">
<input type="hidden" name="numPerPage" value="<%=numPerPage%>">
<%if(!(keyWord==null||keyWord.equals(""))){%>
<input type="hidden" name="keyField" value="<%=keyField%>">
<input type="hidden" name="keyWord" value="<%=keyWord%>">
<%}%>
</form>
<form name="delFrm" action="boardDelete" method="post">
<input type="hidden" name="nowPage" value="<%=nowPage%>">
<input type="hidden" name="numPerPage" value="<%=numPerPage%>">
<%if(!(keyWord==null||keyWord.equals(""))){%>
<input type="hidden" name="keyField" value="<%=keyField%>">
<input type="hidden" name="keyWord" value="<%=keyWord%>">
<%}%>
<input type="hidden" name="pass">
</form>
</body>
</html>
게시물 읽기
![](https://velog.velcdn.com/images/9t06/post/59cc2752-43c3-450f-b69c-7d6ddfd42909/image.png)
function read(num){
document.readFrm.num.value=num;
document.readFrm.action="read.jsp";
document.readFrm.submit();
}
//
<form name="readFrm">
<input type="hidden" name="nowPage" value="<%=nowPage%>">
<input type="hidden" name="numPerPage" value="<%=numPerPage%>">
<input type="hidden" name="keyField" value="<%=keyField%>">
<input type="hidden" name="keyWord" value="<%=keyWord%>">
<input type="hidden" name="num">
</form>
게시물 파일 다운로드
function down(filename) {
document.downFrm.filename.value=filename;
document.downFrm.submit();
}
//
<td align="center" bgcolor="#DDDDDD">첨부파일</td>
<td bgcolor="#FFFFE8" colspan="3">
<%if(filename!=null&&!filename.equals("")){ %>
<a href="javascript:down('<%=filename%>')"><%=filename %></a>
<font color="blue">(<%=UtilMgr.intFormat(filesize)%>bytes) </font>
<%}else { out.print("첨부된 파일이 없습니다.");}%>
</td>
download.jsp
<%@page contentType="application; charset=UTF-8"%>
<%@page import="java.io.BufferedOutputStream"%>
<%@page import="java.io.FileInputStream"%>
<%@page import="java.io.BufferedInputStream"%>
<%@page import="java.io.File"%>
<%@page import="ch15.BoardMgr"%>
<%
try{
String filename = request.getParameter("filename");
File file = new File(BoardMgr.SAVEFOLDER+
File.separator+filename);
byte b[] = new byte[(int)file.length()];
response.setHeader("Accept-Ranges", "bytes");
String strClient = request.getHeader("User-Agent");
if (strClient.indexOf("Trident") > 0 || strClient.indexOf("MSIE") > 0) {
response.setContentType("application/smnet;charset=UTF-8");
response.setHeader("Content-Disposition", "filename="
+ new String(filename.getBytes("EUC-KR"),"8859_1") + ";");
} else {
response.setContentType("application/smnet;charset=UTF-8");
response.setHeader("Content-Disposition",
"attachment;filename="
+ new String(filename.getBytes("UTF-8"),"ISO-8859-1") + ";");
}
out.clear();
if (file.isFile()) {
BufferedInputStream fin = new BufferedInputStream(
new FileInputStream(file));
BufferedOutputStream outs = new BufferedOutputStream(
response.getOutputStream());
int read = 0;
while ((read = fin.read(b)) != -1) {
outs.write(b, 0, read);
}
outs.close();
fin.close();
}
}catch(Exception e){
e.printStackTrace();
}
%>
update.jsp
![](https://velog.velcdn.com/images/9t06/post/4ad3a559-02d9-4d3f-bc64-1c8c53597329/image.png)
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="ch15.BoardBean"%>
<%
int num = Integer.parseInt(request.getParameter("num"));
String nowPage = request.getParameter("nowPage");
String numPerPage = request.getParameter("numPerPage");
BoardBean bean = (BoardBean)session.getAttribute("bean");
String subject = bean.getSubject();
String name = bean.getName();
String content = bean.getContent();
//read.jsp에서 session에 빈즈 단위로 저장 했기 때문에 파일명도 가져 올 수 있다.
String filename = bean.getFilename();
%>
<html>
<head>
<title>JSP Board</title>
<link href="style.css" rel="stylesheet" type="text/css">
<script>
function check() {
if (document.updateFrm.pass.value == "") {
alert("수정을 위해 비밀번호를 입력하세요.");
document.updateFrm.pass.focus();
return false;
}
document.updateFrm.submit();
}
</script>
</head>
<body bgcolor="#FFFFCC">
<div align="center"><br/><br/>
<table width="600" cellpadding="3">
<tr>
<td bgcolor="#FF9018" height="21" align="center">수정하기</td>
</tr>
</table>
<form name="updateFrm" method="post" action="boardUpdate" enctype="multipart/form-data">
<table width="600" cellpadding="7">
<tr>
<td>
<table>
<tr>
<td width="20%">성 명</td>
<td width="80%">
<input name="name" value="<%=name%>" size="30" maxlength="20">
</td>
</tr>
<tr>
<td>제 목</td>
<td>
<input name="subject" size="50" value="<%=subject%>" maxlength="50">
</td>
<tr>
<td>내 용</td>
<td>
<textarea name="content" rows="10" cols="50"><%=content%></textarea>
</td>
</tr>
<tr>
<td>첨부파일</td>
<td>
<%=filename!=null?filename:"첨부된 파일이 없습니다."%>
<input type="file" name="filename" size="50" maxlength="50">
</td>
</tr>
<tr>
<td>비밀 번호</td>
<td><input type="password" name="pass" size="15" maxlength="15">
수정 시에는 비밀번호가 필요합니다.</td>
</tr>
<tr>
<td colspan="2" height="5"><hr/></td>
</tr>
<tr>
<td colspan="2">
<input type="button" value="수정완료" onClick="check()">
<input type="reset" value="다시수정">
<input type="button" value="뒤로" onClick="history.go(-1)">
</td>
</tr>
</table>
</td>
</tr>
</table>
<input type="hidden" name="nowPage" value="<%=nowPage %>">
<input type='hidden' name="num" value="<%=num%>">
<input type='hidden' name="numPerPage" value="<%=numPerPage%>">
</form>
</div>
</body>
</html>