Jsp-MVC2-WriteProAction

2020. 8. 10. 20:15JSP-MVC model2

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 중에서 저장해서 리턴으로 넘겨주면 된다.

'JSP-MVC model2' 카테고리의 다른 글

Jsp-MVC2- ListAction, paging(페이징)  (0) 2020.08.10
Jsp-MVC2- ProService  (0) 2020.08.10
Jsp-MVC2-JdbcUtil  (0) 2020.08.10
Jsp-MVC2 -DAO  (0) 2020.08.10
Jsp -MVC2- Action,ActionForward  (0) 2020.08.10