14. List.jsp (링크 삽입) (컨트롤러로 연결)
title 클릭시 view.do로 이동
다운로드
글쓰기 버튼 onclick
a태그는 href 속성 정의 시 이동할 수 있으나
click은 location.href 속성으로 페이지 이동 기능을 구현할 수 있다
<td><a href="view.do">${row.title }</a></td>
<td><a href="download.do">[DOWNLOAD]</a></td>
<button type="button" onclick="write.do">글쓰기</button>
--------------------------------글쓰기(p497)------------------------------------
15. WriteController 생성(/write.do)
요청이 들어오면 입력폼을 표시해주는 역할 (입력폼 페이지로 이동 처리)
package model2.mvcboard;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/write.do")
public class WriteController extends HttpServlet {
private static final long serialVersionUID = 1L;
public WriteController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("./Write.jsp").forward(request, response);
}
}
16. write.jsp (글쓰기 폼) 작성
17. src/fileupload/FileUtil.java
파일 업로드 기능(MultipartRequest 부분을 분리)
18. Uploads 폴더 생성(파일이 저장되는 실제 물리적 위치)
19. writecontroller
doPost 작성
//application은 jsp의 내장객체이기 때문에 여기서 application을 바로 쓸수 없다
//그래서 request를 통해 application의 객체를 받아올 수 있다
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String saveDirectory = request.getServletContext().getRealPath("/Uploads");
int maxPostSize = 1024*1000; //기존에는 xml에 정의
MultipartRequest mr = FileUtil.uploadFile(request, saveDirectory, maxPostSize);
//application은 jsp의 내장객체이기 때문에 여기서 application을 바로 쓸수 없다
//그래서 request를 통해 application의 객체를 받아올 수 있다
if(mr == null) {
JSFunction.alertLocation(response, "첨부 파일이 제한 용량을 초과합니다", "write.do");
return ;
}
}
20. utils/JSFunction.java
mr에 파일이 없을 경우 이동하게 하는 역할
servlet에서 사용할 수 있도록 alertLocation 수정
public static void alertLocation(HttpServletResponse resp, String msg, String url) {
try {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
String script = ""
+ "<script>"
+ " alert('" + msg + "');"
+ " location.href'"+url+"';"
+ "</script>";
writer.print(script);
}catch(Exception e) {
}
21. WriteController 에 uploadprocess 부분 가져오기
파일 이름 dto 에 담기까지
if(mr == null) {
JSFunction.alertLocation(response, "첨부 파일이 제한 용량을 초과합니다", "write.do");
return ;
}
MVCBoardDTO dto = new MVCBoardDTO();
dto.setName(mr.getParameter("name"));
dto.setTitle(mr.getParameter("title"));
dto.setContent(mr.getParameter("content"));
dto.setPass(mr.getParameter("pass"));
String fileName = mr.getFilesystemName("ofile");
if(fileName != null ) {
String ext = fileName.substring(fileName.lastIndexOf(".")); //확장자 추출(. 기준으로 파일명, 확장자 분리)
//새로운 파일명 생성
String now = new SimpleDateFormat("yyyMMdd_HmsS").format(new Date());
String newFileName = now + ext; //겹칠일 없이 now로 생성
//파일명 변경
File oldFile = new File(saveDirectory + File.separator + fileName);//file.separator:경로를 구분하는 특수기호
File newFile = new File(saveDirectory + File.separator + newFileName);
oldFile.renameTo(newFile);
dto.setOfile(fileName);
dto.setSfile(newFileName);
}
22. MVCBoardDAO 수정
dto 넘겨주는 작업
public int insertWrite(MVCBoardDTO dto) {
int result = 0;
String query = " insert into mvcboard (idx,name,title,content,ofile,sfile,pass) "
+" values (seq_board_num.nextval,?,?,?,?,?,?)";
try {
psmt = con.prepareStatement(query);
psmt.setString(1, dto.getName());
psmt.setString(2, dto.getTitle());
psmt.setString(3, dto.getContent());
psmt.setString(4, dto.getOfile());
psmt.setString(5, dto.getSfile());
psmt.setString(6, dto.getPass());
result = psmt.executeUpdate();
}catch(Exception e) {
System.out.println("게시물 입력 중 예외 발생");
e.printStackTrace();
}return result;
}
--------------------------------상세보기(p510)------------------------------------
23. list.jsp
dto에서 idx 값을 받아서 a태그 몇번째 게시물인지 전달
<td><a href="view.do?idx=${row.idx }">${row.title }</a></td>
24. src/model2.mvcboard/view.do 작성 (ViewController.java)
//service : get, post 를 구분하지 않고 모든 요청이 들어올 때마다 호출되는 메소드 (doget사용해도 무관)
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
MVCBoardDAO dao = new MVCBoardDAO();
String idx = request.getParameter("idx"); //이 번호로 상세보기를 조회한다
//idx번호를 가진 글에 상세 보기 누르면 카운트 증가시킴
dao.updateVisitCount(idx);
//특정글 하나 조회하는메소드
MVCBoardDTO dto = dao.selectView(idx); //넘어오는 하나의 idx에 대한 값
dao.close();
}
25. MVCBoardDAO 메소드 추가
- 조회수 증가 updateVisitCount
public void updateVisitCount(String idx) {
String query = "update mvcboard"
+ " set visitcount = visitcount + 1"
+ " where idx=?";
try {
psmt = con.prepareStatement(query);
psmt.setString(1, idx);
psmt.executeQuery();
}catch(Exception e) {
System.out.println("게시물 조회수 증가 중 예외 발생");
e.printStackTrace();
}
}
- 상세보기 selectView
public MVCBoardDTO selectView(String idx) {
MVCBoardDTO dto = new MVCBoardDTO();
String query = "select * from mvcboard where idx=?";
try {
psmt = con.prepareStatement(query);
psmt.setString(1, idx);
rs = psmt.executeQuery();
if(rs.next()) {
dto.setIdx(rs.getString(1));
dto.setName(rs.getString(2));
dto.setTitle(rs.getString(3));
dto.setContent(rs.getString(4));
dto.setPostdate(rs.getDate(5));
dto.setOfile(rs.getString(6));
dto.setSfile(rs.getString(7));
dto.setDowncount(rs.getInt(8));
dto.setPass(rs.getString(9));
dto.setVisitcount(rs.getInt(10));
}
}catch(Exception e) {
System.out.println("게시물 조회 중 예외 발생");
e.printStackTrace();
}
return dto;
}
}
26. ViewController.java
하나의 idx 값의 상세보기 내용을 view.jsp페이지로 전달
dto.setContent(dto.getContent().replace("\r\n","<br/>"));
request.setAttribute("dto", dto);
request.getRequestDispatcher("./View.jsp").forward(request, response);
27. View.jsp 파일 생성(dao 통해 조회된 하나의 게시물을 표현) jstl사용 -213p
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 첨부형 게시판</title>
</head>
<body>
<h2>파일 첨부형 게시판 - 상세보기(View)</h2>
<table border="1" width="90%">
<colgroup>
<col width="15%"/><col width="35%"/>
<col width="15%"/><col width="*" />
</colgroup>
<!-- 게시글 정보 -->
<tr>
<td>번호</td> <td>${ dto.idx }</td>
<td>작성자</td> <td>${ dto.name }</td>
</tr>
<tr>
<td>작성일</td> <td>${ dto.postdate }</td>
<td>조회수</td> <td>${ dto.visitcount }</td>
</tr>
<tr>
<td>제목</td>
<td colspan="3">${ dto.title }</td>
</tr>
<tr>
<td>내용</td>
<td colspan="3" height="100">${ dto.content }</td>
</tr>
<!-- 첨부파일 -->
<tr>
<td>첨부파일</td>
<td>아직 작성하지 않았으니까 없어요</td>
<td>다운로드 수</td>
<td>${ dto.downcount }</td>
</tr>
<!-- 하단 메뉴(버튼) -->
<tr>
<td colspan="4" align="center">
<button type="button" onclick="">
수정하기</button>
<button type="button" onclick="">
삭제하기</button>
<button type="button" onclick="location.href='list.do';">
목록 바로가기</button>
</td>
</tr>
</table>
</body>
</html>
--------------------------------파일 다운로드(p517)------------------------------------
27. src/fileupload/FileUtil.java
fileUpload/Download.jsp 코드 사용
download -> view가 필요없는 컨트롤러
public static void download(HttpServletRequest req, HttpServletResponse resp, String directory, String sfileName, String ofileName) {
String sDirectory = req.getServletContext().getRealPath(directory); //jsp에서의 내장객체 이용한 String saveDirectory = application.getRealPath("/Uploads"); 와 같음
try {
File file = new File(sDirectory, sfileName); //서버에 잇는 파일정보를 가져오고
InputStream inStream = new FileInputStream(file); //inputstram으로 저장하면 buffer공간에 저장
//한글처리
String client = req.getHeader("User-Agent");
if(client.indexOf("WOW64") == -1){ //클라이언트 정보에 WOW64 값이 있으면 인터넷 익스플로러 브라우저
ofileName = new String(ofileName.getBytes("UTF-8"),"ISO-8859-1");
}else{
ofileName = new String(ofileName.getBytes("KSC5601"),"ISO-8859-1");
}
//다운로드 창 보여주는 역할
resp.reset();
resp.setContentType("application/otent-stream");
resp.setHeader("Content-Disposition","attachment; filename=\"" + ofileName + "\"");
resp.setHeader("Content-Length", "" + file.length());
//out.clear();
OutputStream outStream = resp.getOutputStream();
}catch(FileNotFoundException e){
System.out.println("파일을 찾을 수 없습니다.");
e.printStackTrace();
}
catch(Exception e){
System.out.println("예외가 발생했습니다.");
e.printStackTrace();
}
}
28. view.jsp
첨부파일 링크 삽입
<!-- 첨부파일 -->
<tr>
<td>첨부파일</td>
<td>
<c:if test="${ not empty dto.ofile }">
${ dto.ofile }
<a href="download.do?ofile=${ dto.ofile }&sfile=${ dto.sfile }&idx=${ dto.idx }">[다운로드]</a>
</c:if>
</td>
<td>다운로드 수</td>
<td>${ dto.downcount }</td>
</tr>
<!-- 하단 메뉴(버튼) -->
<tr>
<td colspan="4" align="center">
<button type="button" onclick="">
수정하기</button>
<button type="button" onclick="">
삭제하기</button>
<button type="button" onclick="location.href='list.do';">
목록 바로가기</button>
</td>
</tr>
29. downloadController 생성
.download.do
@WebServlet("/download.do")
public class DownloadController extends HttpServlet {
private static final long serialVersionUID = 1L;
public DownloadController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String ofile = request.getParameter("ofile");
String sfile = request.getParameter("sfile");
int idx = Integer.parseInt(request.getParameter("idx"));
FileUtil.download(request, response, "/Uploads", sfile, ofile);
MVCBoardDAO dao = new MVCBoardDAO();
dao.downCountPlus(idx);
dao.close();
}
30. MVCBoardDAO 메소드 추가 - downCountPlus
public void downCountPlus(int idx) {
String query = "update mvcboard"
+ " set downcount = downcount +1"
+ " where idx=?";
try {
psmt = con.prepareStatement(query);
psmt.setLong(1, idx);
psmt.executeQuery();
}catch(Exception e) {
System.out.println("게시물 조회수 증가 중 예외 발생");
e.printStackTrace();
}
---------------------------------------여기까지 파일구성--------------------------------------------
'jsp' 카테고리의 다른 글
네이버 API 사용하기 (0) | 2022.12.13 |
---|---|
SMTP 활용 이메일 전송 (0) | 2022.12.12 |
서블릿.do 에서 -> 액션.jsp (0) | 2022.12.07 |
게시판_model2_1 (0) | 2022.12.07 |
@WebServlet, @WebInitParam (0) | 2022.12.07 |