@Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("BoardDetailAction"); ActionForward forward = null; // 파라미터로 전달된 게시물 번호(board_num) 가져오기 int board_num = Integer.parseInt(request.getParameter("board_num")); // BoardDetailService 인스턴스 생성 후 getArticle() 메서드 호출하여 상세내용 가져오기 // => 파라미터 : 게시물 번호(board_num), 리턴타입 : BoardBean(article) BoardDetailService boardDetailService = new BoardDetailService(); BoardBean article = boardDetailService.getArticle(board_num); // board 폴더 내의 qna_board_view.jsp 페이지로 포워딩 // => 요청된 서블릿 주소가 유지되므로 Dispatcher 방식으로 포워딩 forward = new ActionForward(); forward.setPath("/board/qna_board_view.jsp"); return forward; }
번호도 찍힘!
590
< BoardDetailAction.java >
// request 객체에 BoardBean 객체 저장 request.setAttribute("article", article); // page 파라미터는 setAttribute() 메서드로 전달하지 않아도 URL 이 유지되므로 생략 가능 // ==> Dispatcher 방식이기 때문에 URL 유지
Page 번호 유지됨
< BoardDetailService.java >
Connection con = getConnection(); BoardDAO boardDAO = BoardDAO.getInstance(); boardDAO.setConnection(con); close(con);
package action; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import svc.BoardModifyProService; import vo.ActionForward; import vo.BoardBean; publicclass BoardModifyProAction implements Action { @Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { // 특정 게시물 수정을 위한 Action 클래스 System.out.println("BoardModifyProAction"); ActionForward forward = null; // 게시물 수정에 필요한 게시물 번호(board_num), 페이지 번호(page) 파라미터 가져오기 int board_num = Integer.parseInt(request.getParameter("board_num")); String page = request.getParameter("page"); System.out.println(board_num + ", " + page); String board_pass = request.getParameter("board_pass"); // BoardModifyProService 클래스 인스턴스 생성 // => isArticleWriter() 메서드를 호출하여 적합한 사용자인지 판별 // => 파라미터 : 게시물번호(board_num), 패스워드(String), 리턴타입 : boolean(isRightUser) BoardModifyProService boardModifyProService = new BoardModifyProService(); //boolean isRightUser = boardModifyProService.isArticleWriter(request.getParameter("board_pass");); boolean isRightUser = boardModifyProService.isArticleWriter(board_num, board_pass); //System.out.println("isRightUser : " + isRightUser); if(!isRightUser) { // 패스워드가 틀릴 경우(= 적합한 사용자가 아닐 경우) // 자바 스크립트를 사용하여 "수정 권한이 없습니다!" 띄운 후 이전페이지로 돌아가기 // 1. response 객체를 사용하여 문서 타입 및 인코딩 설정 response.setContentType("text/html;charset=UTF-8"); // 2. response 객체의 getWriter() 메서드를 호출하여 // 출력스트림 객체(PrintWriter)를 리턴받음 PrintWriter out = response.getWriter(); // 3. PrintWriter 객체의 println() 메서드를 호출하여 // 웹에서 수행할 작업(자바스크립트 출력 등)을 기술 out.println("<script>"); // 자바스크립트 시작 태그 out.println("alert('수정 권한이 없습니다!')"); // 다이얼로그 메세지 출력 out.println("history.back();"); // 이전 페이지로 돌아가기 out.println("</script>"); // 자바스크립트 끝 태그 } else { // 패스워드가 맞을 경우 //System.out.println("올바른 사용자입니다"); // BoardBean 객체 생성하여 수정폼에서 입력된 데이터 가져와서 저장 BoardBean article = new BoardBean(); article.setBoard_num(board_num); article.setBoard_name(request.getParameter("board_name")); article.setBoard_subject(request.getParameter("board_subject")); article.setBoard_content(request.getParameter("board_content")); // BoardModifyProService 클래스의 modifyArticle() 메서드 호출하여 글 수정 // => 파라미터 : BoardBean, 리턴타입 : boolean(isModifySuccess) // 수정 결과에 따른 처리 // => isModifySuccess 가 false 일 경우 // 자바스크립트 사용하여 "수정 실패!" 출력 후 이전페이지로 이동 // => 아니면 ActionForward 객체를 사용하여 BoardDetail.bo 로 포워딩 // => Redirect 방식 이동(URL 에 파라미터를 함께 전달 => 글번호, 페이지번호) boolean isModifySuccess = boardModifyProService.modifyArticle(article); System.out.println("isModifySuccess : " + isModifySuccess); if(!isModifySuccess) { // 자바 스크립트를 사용하여 "수정 실패!" 띄운 후 이전페이지로 돌아가기 // 1. response 객체를 사용하여 문서 타입 및 인코딩 설정 response.setContentType("text/html;charset=UTF-8"); // 2. response 객체의 getWriter() 메서드를 호출하여 // 출력스트림 객체(PrintWriter)를 리턴받음 PrintWriter out = response.getWriter(); // 3. PrintWriter 객체의 println() 메서드를 호출하여 // 웹에서 수행할 작업(자바스크립트 출력 등)을 기술 out.println("<script>"); // 자바스크립트 시작 태그 out.println("alert('수정 실패!')"); // 다이얼로그 메세지 출력 out.println("history.back();"); // 이전 페이지로 돌아가기 out.println("</script>"); // 자바스크립트 끝 태그 } else { System.out.println("글 수정 성공!"); forward = new ActionForward(); forward.setRedirect(true); forward.setPath("BoardDetail.bo?board_num="+board_num+"&page="+page); } } return forward; } }
package action; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import svc.BoardReplyProService; import vo.ActionForward; import vo.BoardBean; publicclass BoardReplyProAction implements Action { @Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { //System.out.println("BoardReplyProAction"); /* * 답변글 작성 요청하기 * 1. BoardReplyPro.bo => BoardReplyProAction 으로 이동 * => 전달받은 파라미터(답글 작성에 필요한 모든 파라미터) 가져오기 * 모든 파라미터를 BoardBean 객체에 저장 * * 2. BoardReplyProService 클래스의 replyArticle() 메서드 호출 * => BoardBean 객체 전달, boolean 타입 리턴(isReplySuccess) * * 3. isReplySuccess 가 false 일 경우 "답글 등록 실패" 출력 * 아니면 BoardList.bo?page=x 페이지로 포워딩 => 페이지번호 함께 전달 * => Redirect 방식 포워딩 */ ActionForward forward = null; BoardBean article = new BoardBean(); article.setBoard_num(Integer.parseInt(request.getParameter("board_num"))); article.setBoard_re_ref(Integer.parseInt(request.getParameter("board_re_ref"))); article.setBoard_re_lev(Integer.parseInt(request.getParameter("board_re_lev"))); article.setBoard_re_seq(Integer.parseInt(request.getParameter("board_re_seq"))); article.setBoard_name(request.getParameter("board_name")); article.setBoard_pass(request.getParameter("board_pass")); article.setBoard_subject(request.getParameter("board_subject")); article.setBoard_content(request.getParameter("board_content")); BoardReplyProService boardReplyProService = new BoardReplyProService(); boolean isReplySuccess = boardReplyProService.replyArticle(article); if(!isReplySuccess) { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<script>"); out.println("alert('답글 등록 실패!')"); out.println("history.back();"); out.println("</script>"); } else { System.out.println("답글 등록 성공!"); forward = new ActionForward(); forward.setRedirect(true); forward.setPath("BoardList.bo?page=" + request.getParameter("page")); } return forward; } }
BoardReplyProAction 완성시키고 메서드 자동완성
======== BoardReplyProService.java
package svc; importstatic db.jdbcUtil.*; import java.sql.Connection; import dao.BoardDAO; import vo.BoardBean; publicclassBoardReplyProService { publicbooleanreplyArticle(BoardBean article) { System.out.println("BoardReplyProService - replyArticle()"); boolean isReplySuccess = false; Connection con = getConnection(); BoardDAO boardDAO = BoardDAO.getInstance(); boardDAO.setConnection(con); // BoardDAO 객체의 insertReplyArticle() 메서드를 호출하여 답변글 등록 작업 수행 // => 파라미터 : BoardBean 객체 리턴타입 : int(insertCount) int insertCount = boardDAO.insertReplyArticle(article); // insertCount 가 0보다 크면 commit 수행, isReplySuccess 를 true 로 변경 // 아니면 rollback 수행 if(insertCount > 0) { commit(con); isReplySuccess = true; } else { rollback(con); } close(con); return isReplySuccess; } }
BoardDAO 에 insertReplyArticle() 메서드 자동완성!
< BoardDAO.java >
public int insertReplyArticle(BoardBean article) { int insertCount = 0; PreparedStatement pstmt = null; ResultSet rs = null; try { intnum = 1; // 새 글 번호를 저장할 변수 // 새 글 번호 계산을 위해 기존 글 중 가장 큰 번호 조회 String sql = "SELECT max(board_num) FROM board"; pstmt = con.prepareStatement(sql); rs = pstmt.executeQuery(); if(rs.next()) { // 기존 게시물 중 가장 큰 번호 조회 성공 시 num = rs.getInt(1) + 1; // 가장 큰 번호 + 1 값을 새 글 번호로 지정 } // 답변글 등록에 필요한 번호 정보 가져오기(ref, lev, seq) int board_re_ref = article.getBoard_re_ref(); int board_re_lev = article.getBoard_re_lev(); int board_re_seq = article.getBoard_re_seq(); // 기존 답변글의 seq 번호를 1씩 증가시키기 // => 참조글번호(ref)가 같은 게시물 중 기존 순서번호(seq) 보다 큰 게시물만 증가 sql = "UPDATE board SET board_re_seq=board_re_seq+1 WHERE board_re_ref=? AND board_re_seq>?"; pstmt = con.prepareStatement(sql); pstmt.setInt(1, board_re_ref); pstmt.setInt(2, board_re_seq); int updateCount = pstmt.executeUpdate(); // updateCount > 0 일 경우 commit 작업 수행 if(updateCount > 0) { commit(con); } // 답변글(새글) 추가 후 결과를 insertCount 에 저장 // => 단, 추가 전 순서번호(seq) 와 들여쓰기레벨(lev) 값 1씩 증가시킴 // => 파일 업로드는 생략이므로, 널스트링("") 값 전달 board_re_seq++; board_re_lev++; sql = "INSERT INTO board VALUES(?,?,?,?,?,?,?,?,?,?,now())"; pstmt = con.prepareStatement(sql); pstmt.setInt(1, num); pstmt.setString(2, article.getBoard_name()); pstmt.setString(3, article.getBoard_pass()); pstmt.setString(4, article.getBoard_subject()); pstmt.setString(5, article.getBoard_content()); pstmt.setString(6, ""); // board_file 업로드x pstmt.setInt(7, board_re_ref); pstmt.setInt(8, board_re_lev); pstmt.setInt(9, board_re_seq); pstmt.setInt(10, 0); insertCount = pstmt.executeUpdate(); } catch (SQLException e) { //e.printStackTrace(); System.out.println("BoardDAO - insertReplyArticle() 실패! : " + e.getMessage()); } finally { close(pstmt); close(rs); } return insertCount; }