JSP-MVC model2
Jsp-MVC2-WriteProAction
프리덕
2020. 8. 10. 20:15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
package action;
import java.io.PrintWriter;
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;
import com.sun.org.apache.bcel.internal.generic.MULTIANEWARRAY;
import svc.BoardWriteProService;
import vo.ActionForward;
import vo.BoardDTO;
public class BoardWriteProAction implements Action{
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("BoardWriteProAction");
//게시판 글 작성 후 DB작업을 위한 준비 작업
//준비 완료 후 BoardWriteProService 클래스 인스턴스 생성하여 작업 수행
ActionForward forward=null;
String saveFolder="/boardUpload";//업로드 폴더(가상의 폴더) 이름 지정
ServletContext context=request.getServletContext();//request 객체로부터 현재 서블릿 컨텍스트 객체를 가져오기
String realFolder=context.getRealPath(saveFolder);// 지정된 이름의 실제 폴더 위치 가져오기
//이클립스 실제 업로드 폴더는 워크스페이스/.D:\Dropbox\workspace_jsp_Model2\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\MVC_Board
// 자신의 프로젝트명 내에 실제 폴더 구조가 만들어짐.
// System.out.println("가상 폴더 : "+saveFolder);
// System.out.println("실제 폴더 : "+realFolder);
int maxSize=10*1024*1024;// 최대업로드 가능 크기 (10 MB)
//byte 단위를 기준으로 원하는 사이즈를 단위별로 계산
//1024byte=1KByte * 1024=1MByte * 10 = 10MB
//파일 업로드를 다루기 위한 ultipartRequest 객체 생성
MultipartRequest multi=new MultipartRequest(request,//requst 객체
realFolder,//계산된 실제 업로드 폴더 위치 전달
maxSize,//최대 업로드 가능 파일 크기
"utf-8",//캐릭터셋
new DefaultFileRenamePolicy());//동일한 파일이름 존재 시 이름 변경 기능 객체
//게시물 1개 정보를 저장할 BoardDTO 객체 생성
BoardDTO boardDTO=new BoardDTO();
//업로드 될 게시물 정보를 저장
//일반적인 텍스트는 multi.getParameter() 메서드로 가져오기
boardDTO.setBoard_name(multi.getParameter("board_name"));
boardDTO.setBoard_pass(multi.getParameter("board_pass"));
boardDTO.setBoard_subject(multi.getParameter("board_subject"));
boardDTO.setBoard_content(multi.getParameter("board_content"));
//업로드될 파일의 경우 getOrginalfileName() 또는 getFilesystemName() 으로 가져오기
// System.out.println(multi.getOriginalFileName((String)multi.getFileNames().nextElement()));
// System.out.println(multi.getFilesystemName((String)multi.getFileNames().nextElement()));
// 1) 업로드 하는 파일의 원본 이름을 사용할 경우
boardDTO.setBoard_file(multi.getOriginalFileName((String)multi.getFileNames().nextElement()));
// 2) 업로드 하는 파일의 실제 업로드 된 파일명을 사용할 경우
// boardDTO.setBoard_file(multi.getFilesystemName((String)multi.getFileNames().nextElement()));
//1번과 2번의 형식으로 DB에 컬럼을 만들어서 파일을 관리해줌.
//BoardWriteProService 클래스의 인스턴스를 생성하여
//registArticle() 메서드를 호출하고, 글쓰기를 위한 BoardBean 객체 전달
//-> 글쓰기 작업 요청 처리 후 결과를 boolean 타입으로 리턴받아 포워딩 처리
BoardWriteProService boardWriteProService= new BoardWriteProService();
boolean isWirteSuccess=boardWriteProService.registArticle(boardDTO);
// System.out.println("isWritesuccess = "+ isWirteSuccess);
//글쓰기 작업 요청 처리 결과(isWriteSuccess)를 통해 오류 메세지 출력 및 포워딩 수행
if(!isWirteSuccess) {// 요청 실패했을 경우
//자바 스크립트를 사용하여 오류메세지 출력 후 이전 페이지로 이동
//Printwirter 객체를 사용하여 자바스크립트 코드를 출력
//response 객체를 사용하여 문서 타입 설정 및 Printwriter 객체 가져오기
response.setContentType("text/html;charset=UTF-8");//문서 타입 설정
PrintWriter out= response.getWriter();//PrintWriter 객체 가져오기
//println() 메서드를 사용하여 자바스크립트를 문자열로 출력
out.println("<script>");//자바 스크립트 시작
out.println("alert('글 등록 실패')");//오류 메세지 출력
out.println("history.back()");//이전 페이지 이동
out.println("</script>");//자바 스크립트 끝
}else {// 요청 성공했을 경우
//ActionForward 객체를 생성하여 포워딩 방식 및 URL 지정
forward=new ActionForward();
//BoardList.bo 서블릿 주소를 새로 요청하고, request 객체 유지할 필요가 없음
//-> Redirect 방식으로 포워딩 처리
forward.setPath("BoardList.bo");
forward.setRedirect(true);
}
System.out.println("forward객체 리턴");
return forward;
}
}
|
cs |
FrontController에서 주소 값을 인식해서 포워딩 방식을 정해주기 위해 사용하는 ActionForward의 값을 여기서 정해 준다. 리턴 타입을 ActionForward로 해서 주소 값과 포워딩 방식을 저장해 리턴을 해주면 FrontController에서 받아서 그 값을 식별해서 sendRedirect로 할지 Dispatch방식으로 할지를 정해서 이동해야 할 곳으로 이동을 시켜준다. DB에 File을 업로드할 때 어떤 메서드를 사용하냐에 따라 원본 이름을 구하는지 아니면 DefaultFileRenamePolicy() 이 메서드로 인해 자동으로 변경되어 저장된 File이름을 구하는지가 정해지는데 DB에는 두가지 방식으로 다 따로 저장해서 유지보수 시에 엉뚱한 File이 삭제되지 않게 관리해주기 위해 두 가지 방식으로 저장을 해야 한다. 그리고 이 페이지는 jsp 문법을 사용할 수 없기 때문에 따로 PrintWriter 객체를 선언하여서 Write기능이 작동되지 않았을 때에 alert를 표시하기 위해 out.println()을 사용해서 표시해 준다. 그리고 성공했을 경우에는 ActionForward에 다음으로 이동해야 할 주소 값을 저장해 주고 포워딩 방식을 true와 false 중에서 저장해서 리턴으로 넘겨주면 된다.