*** 자료실
 * 주요 기능
1. Connection Pool
2. 액션태그    <jsp:useBean>   <jsp:setProperty>
3. DTO, DAO 클래스
4. 페이징 처리 ( inline View )
5. 첨부파일 업로드 -> cos.jar 라이브러리 이용 (중복 처리)


 1. writeForm.jsp
   - 파일은 글씨보다 용량이 크기 때문에, method="post" 방식을 이용해야 함
   - 파일을 MultipartRequest 객체로 받기 위해 enctype="multipart/form-data" 을 추가함
<form method="post" name="writeform" action="writePro.jsp" enctype ="multipart/form data">

 2. writePro.jsp
   - cos.jar 라이브러리를 import -> 파일명 중복 해결 위한 라이브러리
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>

   - upload 디렉토리의 실제 경로(path)를 구해 문자열 변수에 저장
String path=request.getRealPath("upload");  //폴더명을 기입
System.out.println("path="+path);
      --> path=E:\eclipse-workspace\.metadata\.plugins\... 이것

   - 첨부파일의 크기를 설정 (단위: byte)
int size = 10*1024*1024; ---> 1byte=2^10=1024 ---> 10*1024*1024=10MB

try{

   - 첨부파일은 MultipartRequest 객체를 생성하면서 동시에 업로드됨
MultipartRequest multi=new MultipartRequest(request, path, size, "utf-8", new DefaultFileRenamePolicy());
(파일을 업로드할 리퀘스트 객체, 저장될 실제 경로, 파일 최대 용량, 문자 인코딩 타입, 중복인 파일명 변경 객체)
첫번째 매개변수는 HttpServletRequest의 request : 웹브라우저 사용자인 클라이언트로부터 서버로 요청이 들어오면 서버에서는 HttpServletRequest  를 생성하며, 요청정보에 있는 패스로 매핑된 서블릿에게 전달

   - 텍스트 뿐 아니라 파일을 함께 보내야 하기 때문에(멀티파트) 액션태그 사용할 수 없음
     +) MultipartRequest 클래스의 getParameter 메소드를 이용해서 값을 얻어와야 함
      (form에서 enctype="multipart/form-data"을 지정했기 때문에 request 클래스로는 받아올 수 없음

       --> 만약 request로 굳이 받고 싶다면, method="get" 방식으로 보내자)

String writer=multi.getParameter("writer"); .......

   - 파일은 원래 파일명/서버에 저장된 파일명이 분리됨 (중복일 경우가 있으므로)
      //클라이언트가 업로드한 파일명=원래 파일명
         String upload0=multi.getOriginalFileName("upload"); //파일명을 정확히 알고있을 때 사용
      //실제 서버에 저장된 파일명
         String upload=multi.getFilesystemName("upload"); //DB로 넘길땐 얘를 사용할 것

   - 얻어온 값들을 DTO에 저장


 3. updatePro.jsp
   - 다른 파일로 수정을 했다면 새로 업로드, 수정하지 않은 경우 값 유지하도록 처리
BoardDBBean dao=BoardDBBean.getInstance();
BoardDataBean old=dao.getContent(num); //첨부파일 수정 여부 판단 위해 불러옴

if(upload!=null){ //파일명 받은 게 있다 = 파일을 수정했다
board.setUpload(upload); //수정한 파일명을 DTO에 저장
} else { //파일명 받은 게 없다 = 파일 수정 없다 = 기존 파일 사용
board.setUpload(old.getUpload()); //기존 파일명을 DTO에 저장
}

 ※ 글 수정 시 result=0이 반환되는 오류 (sql문이 실행되지 않았다는 뜻)
 ---> 자료실의 경우, 값을 받을 때 useBean이 아니라 multi.getParameter를 사용해 값을 받기 때문에, DTO에 자동으로 값이 할당되지 않아 직접 값을 넣어줘야 함 ---> num도 예외없이 넣어줘야 함!
 나는 num 값을 DTO에 할당해주지 않았기 때문에 sql문이 제대로 실행되지 않았던 것.

+ Recent posts