BoardWritePro.bo 에서 BoardList.bo 주소 요청(주소 바뀜 == 리다이렉트)
BoardList.bo ⇒ qna_board_list.jsp 보여줄 거!
< BoardWriteProAction.java >
@Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { //System.out.println("BoardWriteProAction"); // 현재 BoardWritePro.bo 에서 BoardList.bo 서블릿 주소를 요청하여 Redirect 방식으로 포워딩 // 1. ActionForward 객체 생성 ActionForward forward = new ActionForward(); // 2. 포워딩 방식 지정 => Redirect 방식이므로 파라미터에 true 전달(필수) forward.setRedirect(true); // 3. 포워딩 할 주소 지정 => 서블릿 주소 BoardList.bo 요청 forward.setPath("BoardList.bo"); // 4. ActionForward 객체 리턴 return forward; }
→ 이제 이거 들고 FrontController 로 감
< BoardFrontController.java >
추가
elseif(command.equals("/BoardList.bo")) { forward = new ActionForward(); forward.setPath("/board/qna_board_list.jsp"); }
@Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { //System.out.println("BoardWriteProAction"); // 현재 컨텍스트(객체) 정보 가져오기 위해 request 객체로부터 getServletContext() 메서드 호출 ServletContext context = request.getServletContext(); // 프로젝트 상에서의 가상 업로드 폴더 위치 지정 String saveFolder = "/boardUpload"; // 현재 위치(WebContent)의 하위폴더이므로 "/폴더명" 사용 // ServletContext 객체를 사용하여 가상 폴더에 대응하는 실제 폴더 위치 가져오기 // => 이클립스 사용 시 실제 업로드 폴더 위치 // 워크스페이스\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps 폴더 내의 // 프로젝트명에 해당하는 폴더가 있으며 그 폴더 내에 업로드 폴더가 위치함 String realFolder = context.getRealPath(saveFolder); // 업로드 할 최대 파일 사이즈 지정(전체 숫자 입력 보단 단위별로 분리하는 것이 좋다!) int fileSize = 1024 * 1024 * 10; // 1024byte = 1KByte * 1024 = 1MB * 10 = 10MB // MultiPartRequest 객체 생성 => cos.jar 필요 MultipartRequest multi = new MultipartRequest( request, // request 객체 전달 realFolder, // 파일이 업로드 될 실제 폴더 fileSize, // 한 번에 업로드 가능한 파일 최대크기 "UTF-8", // 파일 명에 대한 인코딩 방식 new DefaultFileRenamePolicy() // 파일명 중복 시 중복 파일명을 처리할 객체 ); // 게시글 작성을 위해 입력받은 데이터를 저장할 BoardBean 객체 생성 // => MultiPartRequest 객체로부터 입력받은 데이터를 가져와서 BoardBean 객체에 저장 BoardBean bb = new BoardBean(); bb.setBoard_name(multi.getParameter("board_name")); bb.setBoard_pass(multi.getParameter("board_pass")); bb.setBoard_subject(multi.getParameter("board_subject")); bb.setBoard_content(multi.getParameter("board_content")); bb.setBoard_file(multi.getOriginalFileName((String)multi.getFileNames().nextElement())); System.out.println("작성자 : " + bb.getBoard_name()); System.out.println("패스워드 : " + bb.getBoard_pass()); System.out.println("제목 : " + bb.getBoard_subject()); System.out.println("내용 : " + bb.getBoard_content()); System.out.println("파일명 : " + bb.getBoard_file()); // 현재 BoardWritePro.bo 에서 BoardList.bo 서블릿 주소를 요청하여 Redirect 방식으로 포워딩 // 1. ActionForward 객체 생성 ActionForward forward = new ActionForward(); // 2. 포워딩 방식 지정 => Redirect 방식이므로 파라미터에 true 전달(필수) forward.setRedirect(true); // 3. 포워딩 할 주소 지정 => 서블릿 주소 BoardList.bo 요청 forward.setPath("BoardList.bo"); // 4. ActionForward 객체 리턴 return forward; }
같은 파일을 계속 넣을 경우 파일탐색기 에서 이런식으로 저장됨 (파일명 뒤에 숫자 저장됨)
package svc; import java.sql.Connection; //import db.jdbcUtil; import vo.BoardBean; //static import 기능을 사용하여 db 패키지의 JdbcUtil 클래스명 내에 있는 메서드를 지정시 //클래스명 없이 바로 메서드를 호출할 수 있다! //=> db.JdbcUtil.getConnection; 이라고 지정하면 getConnection() 메서드만 호출 가능하지만 // db.JdbcUtil.*; 형태로 지정하면 JdbcUtil 클래스의 모든 static 메서드를 호출 가능 importstatic db.jdbcUtil.*; //Action 클래스로부터 요청받은 작업을 DAO 클래스를 사용하여 처리하고 그 결과를 리턴하는 클래스 publicclassBoardWriteProService { // 글 등록 요청 처리를 위한 registArticle() 메서드 정의 // => 파라미터 : BoardBean 객체(boardBean) // => 리턴타입 : boolean publicbooleanregistArticle(BoardBean bb) { boolean isWriteSuccess = false; // 글 등록 성공 여부를 리턴할 변수 // DB 작업을 위한 준비 => Connection 객체, DAO 객체, DAO 객체의 메서드 호출 //Connection con = JdbcUtil.getConnection(); Connection con = getConnection(); // static import 로 지정된 메서드 호출 return isWriteSuccess; } }
======== dao 패키지로 가서 BoardDAO.java 만들기
싱글톤 패턴 구현
★ < 싱글톤 패턴 실제 정의할 때의 문법 순서 > ★
1. 멤버변수 선언 및 인스턴스 생성(private static)
2. 생성자 정의(private)
3. Getter 정의(public static)
package dao; import java.sql.Connection; public class BoardDAO { /* * ------------ 싱글톤 디자인 패턴을 활용한 BoardDAO 인스턴스 작업 ------------- * 1. 외부에서 인스턴스 생성이 불가능하도록 private 접근제한자를 사용하여 생성자 정의 * 2. 직접 인스턴스를 생성하여 변수(instance)에 저장 * 3. 외부에서 인스턴스를 전달받을 수 있도록 Getter 메서드 정의 * 4. getInstance() 메서드에 인스턴스 생성없이 접근 가능하도록 static 메서드로 정의 * => 메서드 내에서 접근하는 멤버변수 instance 도 static 변수로 정의 * 5. 인스턴스를 통해 instance 변수에 접근 불가능하도록 접근제한자 private 지정 */ private BoardDAO() {} private static BoardDAO instance; public static BoardDAO getInstance() { // BoardDAO 객체가 없을 경우에만 생성 if(instance == null) { instance = new BoardDAO(); } return instance; } // --------------------------------------------------------------------------------- Connection con; // Connection 객체 전달받아 저장할 변수 선언 // Service 클래스로부터 Connection 객체를 전달받는 메서드 setConnection() 정의 public void setConnection(Connection con) { this.con = con; // 이름이 똑같기 때문에 this. 적음 } }
publicintinsertArticle(BoardBean boardBean) { int insertCount = 0; return insertCount; }
추가!
< BoardWriteProService.java >
이 4개는 무조건 세트! (Service 클래스에선 무조건 쓴다)
package svc; import java.sql.Connection; import dao.BoardDAO; //import db.JdbcUtil; import vo.BoardBean; // static import 기능을 사용하여 db 패키지의 JdbcUtil 클래스명 내에 있는 메서드를 지정시 // 클래스명 없이 바로 메서드를 호출할 수 있다! // => db.JdbcUtil.getConnection; 이라고 지정하면 getConnection() 메서드만 호출 가능하지만 // db.JdbcUtil.*; 형태로 지정하면 JdbcUtil 클래스의 모든 static 메서드를 호출 가능 importstatic db.jdbcUtil.*; // Action 클래스로부터 요청받은 작업을 DAO 클래스를 사용하여 처리하고 그 결과를 리턴하는 클래스 publicclassBoardWriteProService { // 글 등록 요청 처리를 위한 registArticle() 메서드 정의 // => 파라미터 : BoardBean 객체(boardBean) // => 리턴타입 : boolean publicbooleanregistArticle(BoardBean boardBean) { System.out.println("BoardWriteProService - registArticle()"); boolean isWriteSuccess = false; // 글 등록 성공 여부를 리턴할 변수 // DB 작업을 위한 준비 => Connection 객체, DAO 객체, DAO 객체의 메서드 호출 // 1. DB 작업에 필요한 Connection 객체 가져오기 //Connection con = JdbcUtil.getConnection(); Connection con = getConnection(); // static import 로 지정된 메서드 호출 // 2. DB 작업을 위한 BoardDAO 객체 생성 => 싱글톤 패턴으로 생성된 객체 가져오기 BoardDAO boardDAO = BoardDAO.getInstance(); // 3. BoardDAO 객체에 Connection 객체 전달 boardDAO.setConnection(con); // 4. BoardDAO 객체의 insertArticle() 메서드를 호출하여 글 등록 처리 // => 파라미터 : BoardBean 객체, 리턴타입 : int(insertCount) int insertCount = boardDAO.insertArticle(boardBean); // 5. 리턴받은 작업 결과 판별 // => insertCount 가 0보다 크면 commit() 실행, isWriteSuccess 를 true 로 변경 // => 아니면, rollback() 실행 if(insertCount > 0) { commit(con); isWriteSuccess = true; } else { rollback(con); } // 6. Connection 객체 반환 close(con); // 7. 작업 결과 리턴 return isWriteSuccess; } }
< BoardWriteProAction.java >
// BoardWriteProService 클래스의 인스턴스 생성 BoardWriteProService boardWriteProService = new BoardWriteProService(); // registArticle() 메서드를 호출하여 글 등록 요청 // => 파라미터 : BoardBean 객체, 리턴타입 : boolean(isWriteSuccess) boolean isWriteSuccess = boardWriteProService.registArticle(boardBean); // 리턴받은 결과를 사용하여 글 등록 결과 판별 if(!isWriteSuccess) { System.out.println("글 등록 실패!"); } else { System.out.println("글 등록 성공!"); }
추가 해주기!
> Server 재시작 후 다시 글쓰기부터 실행해보기 ⇒ 글등록 눌렀을 때 콘솔창에
이렇게 떠야함(지금은 BoardDAO insertArticle() 메서드에서 insertCount에 0을 return 했기 때문!)