본문 바로가기
jsp

게시판_model2_2

by 신방동불주먹 2022. 12. 8.

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