2022. 10. 7. 16:32ㆍDev.Program/Java & Spring
621p
< qna_board_list.jsp >
<%@page import="vo.BoardBean"%> <%@page import="vo.PageInfo"%> <%@page import="java.util.ArrayList"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <% ArrayList<BoardBean> articleList=(ArrayList<BoardBean>)request.getAttribute("articleList"); PageInfo pageInfo = (PageInfo)request.getAttribute("pageInfo"); int listCount=pageInfo.getListCount(); int nowPage=pageInfo.getPage(); int maxPage=pageInfo.getMaxPage(); int startPage=pageInfo.getStartPage(); int endPage=pageInfo.getEndPage(); %> <html> <head> <meta charset="UTF-8" /> <title>MVC 게시판</title> <style type="text/css"> #registForm { width: 500px; height: 600px; border: 1px solid red; margin: auto; } h2 { text-align: center; } table { margin: auto; width: 450px; } #tr_top { background: pink; text-align: center; } #pageList { margin: auto; width: 500px; text-align: center; } #emptyArea { margin: auto; width: 500px; text-align: center; } </style> </head> <body> <!-- 게시판 리스트 --> <section id="listForm"> <h2> 글 목록<input type="button" value="게시판글쓰기" onclick="location.href='BoardWriteForm.bo'"/> </h2> <table> <% if(articleList != null && listCount > 0){ %> <tr id="tr_top"> <td>번호</td> <td>제목</td> <td>작성자</td> <td>날짜</td> <td>조회수</td> </tr> <% for(int i=0;i<articleList.size();i++){ %> <tr> <td><%=articleList.get(i).getBoard_num()%></td> <td> <%if(articleList.get(i).getBoard_re_lev()!=0){ %> <%for(int a=0;a<=articleList.get(i).getBoard_re_lev()*2;a++){ %> <%} %> ▶ <%}else{ %> ▶ <%} %> <a href="BoardDetail.bo?board_num=<%=articleList.get(i).getBoard_num()%>&page=<%=nowPage%>"> <%=articleList.get(i).getBoard_subject()%> </a> </td> <td><%=articleList.get(i).getBoard_name() %></td> <td><%=articleList.get(i).getBoard_date() %></td> <td><%=articleList.get(i).getBoard_readcount() %></td> </tr> <%} %> </table> </section> <section id="pageList"> <%if(nowPage<=1){ %> [이전] <%}else{ %> <a href="BoardList.bo?page=<%=nowPage-1 %>">[이전]</a> <%} %> <%for(int a=startPage;a<=endPage;a++){ if(a==nowPage){%> [<%=a %>] <%}else{ %> <a href="BoardList.bo?page=<%=a %>">[<%=a %>] </a> <%} %> <%} %> <%if(nowPage>=maxPage){ %> [다음] <%}else{ %> <a href="BoardList.bo?page=<%=nowPage+1 %>">[다음]</a> <%} %> </section> <% } else { %> <section id="emptyArea">등록된 글이 없습니다.</section> <% } %> </body> </html> |
< BoardFrontController.java >
else if(command.equals("/BoardDetail.bo")) { action = new BoardDetailAction(); // 공통 메서드인 execute() 메서드를 호출하여 request, response 객체 전달 try { forward = action.execute(request, response); } catch (Exception e) { e.printStackTrace(); } } |
- 추가
======== action 패키지에 BoardDetailAction.java 만들기
@Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("BoardDetailAction"); ActionForward forward = new ActionForward(); return forward; } |
- 글 눌렀을 때 BoardDetal.bo 로 넘어가는 지 확인
- 콘솔창도 확인!
======== qna_board_view.jsp
<h1>글 상세내용</h1> |
- 확인을 위해 h1 태그 걸어주기
< BoardDetailAction.java >
@Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("BoardDetailAction"); ActionForward forward = new ActionForward(); forward.setPath("/board/qna_board_view.jsp"); return forward; } |
- 추가
- 글 눌렀을 때 이렇게 보여주면 됨!
- 주소가 바뀌지 않으므로 Dispatcher 방식!
======== svc 패키지에 BoardDetailService.java 만들기
package svc; import java.sql.Connection; import static db.jdbcUtil.*; import vo.BoardBean; public class BoardDetailService { public BoardBean getArticle(int board_num) { System.out.println("BoardDetailService - getArticle()"); System.out.println("Board_num : " + board_num); BoardBean article = null; return article; } } |
< BoardDetailAction.java >
@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); |
- 공통작업
602
< BoardDetailService.java >
- 빨간 줄 클릭해서 자동으로 메서드 만들기!
- BoardDAO 에
- 이렇게 자동완성해줌!
< BoardDAO.java - selectArticle() >
public BoardBean selectArticle(int board_num) { PreparedStatement pstmt = null; ResultSet rs = null; BoardBean article = null; try { // 게시물 번호(board_num)에 해당하는 게시물 상세 내용 조회 후 BoardBean 객체에 저장 String sql = "SELECT * FROM board WHERE board_num = ?"; pstmt = con.prepareStatement(sql); pstmt.setInt(1, board_num); rs = pstmt.executeQuery(); if(rs.next()) { article = new BoardBean(); article.setBoard_num(rs.getInt("board_num")); article.setBoard_name(rs.getString("board_name")); article.setBoard_pass(rs.getString("board_pass")); article.setBoard_subject(rs.getString("board_subject")); article.setBoard_content(rs.getString("board_content")); article.setBoard_file(rs.getString("board_file")); article.setBoard_re_ref(rs.getInt("board_re_ref")); article.setBoard_re_lev(rs.getInt("board_re_lev")); article.setBoard_re_seq(rs.getInt("board_re_seq")); article.setBoard_readcount(rs.getInt("board_readcount")); article.setBoard_date(rs.getDate("board_date")); // System.out.println(rs.getString("board_content")); } } catch (SQLException e) { // e.printStackTrace(); System.out.println("BoardDAO - selectArticle() 실패! : " + e.getMessage()); } finally { close(rs); close(pstmt); } return article; } |
- 메서드 완성
< BoardDAO - updateReadcount() >
// 게시물 조회수 증가 public int updateReadcount(int board_num) { int updateCount = 0; // 게시물 번호(board_num) 에 해당하는 레코드의 board_readcount 값을 1 증가시킴 PreparedStatement pstmt = null; try { String sql = "UPDATE board SET board_readcount = board_readcount+1 WHERE board_num = ?"; pstmt = con.prepareStatement(sql); pstmt.setInt(1, board_num); updateCount = pstmt.executeUpdate(); } catch (SQLException e) { // e.printStackTrace(); System.out.println("BoardDAO - updateReadcount() 실패! : " + e.getMessage()); } finally { close(pstmt); } return updateCount; } |
- 메서드 완성
626p
< qna_board_view.jsp >
<%@page import="vo.BoardBean"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <% BoardBean article = (BoardBean)request.getAttribute("article"); String nowPage = request.getParameter("page"); %> <html> <head> <meta charset="UTF-8"> <title>MVC 게시판</title> <style type="text/css"> #articleForm { width: 500px; height: 500px; border: 1px solid red; margin: auto; } h2 { text-align: center; } #basicInfoArea { height: 40px; text-align: center; } #articleContentArea { background: pink; margin-top: 20px; height: 350px; text-align: center; overflow: auto; } #commandList { margin: auto; width: 500px; text-align: center; } </style> </head> <body> <!-- 게시판 수정 --> <section id="articleForm"> <h2>글 내용 상세보기</h2> <section id="basicInfoArea"> 제 목 : <%=article.getBoard_subject()%> 첨부파일 : <%=article.getBoard_file() %> </section> <section id="articleContentArea"> <%=article.getBoard_content() %> </section> </section> <section id="commandList"> <input type="button" value="답변" onclick="location.href='BoardReplyForm.bo?board_num=<%=article.getBoard_num() %>&page=<%=nowPage%>'"> <input type="button" value="수정" onclick="location.href='BoardModifyForm.bo?board_num=<%=article.getBoard_num() %>'"> <input type="button" value="삭제" onclick="location.href='BoardDeleteForm.bo?board_num=<%=article.getBoard_num() %>&page=<%=nowPage%>'"> <input type="button" value="목록" onclick="location.href='BoardList.bo?page=<%=nowPage%>'"> </section> </body> </html> |
- 우리는 setAttribute 로 객체를 넘기지 않았기 때문에 (내장객체 사용) getParameter 로 page 값을 파라미터로 받아온다! (책이랑 좀 다르게 받아옴!)
- getParameter 로 받아왔기 때문에 형변환이 필요없다
< BoardFrontController.java >
else if(command.equals("/BoardReplyForm.bo")) { action = new 아직 안만든 Action(); // 공통 메서드인 execute() 메서드를 호출하여 request, response 객체 전달 try { forward = action.execute(request, response); } catch (Exception e) { e.printStackTrace(); } } else if(command.equals("/BoardModifyForm.bo")) { action = new 아직 안만든 Action(); // 공통 메서드인 execute() 메서드를 호출하여 request, response 객체 전달 try { forward = action.execute(request, response); } catch (Exception e) { e.printStackTrace(); } } else if(command.equals("/BoardDeleteForm.bo")) { action = new 아직 안만든 Action(); // 공통 메서드인 execute() 메서드를 호출하여 request, response 객체 전달 try { forward = action.execute(request, response); } catch (Exception e) { e.printStackTrace(); } } |
======== JSP 시간에 했던 file_down.jsp 필요함!
D:\workspace_jsp\FunWeb\WebContent\center 에 file_down.jsp
- board 에 집어넣기!
- 수정!
< qna_board_view.jsp >
- 여기 jsp 넣고 실행해보기
- 주소 잘 보기! 우리가 원하는 위치가 아니다(board 안에 있어야함!)
- 경로 지정을 안했기 때문에 WEB-Content 로 가는거….
- 경로 설정해주기 (board 폴더로 가야하기 때문에 앞에 board/ 적어줌)
- 이제 다운 잘 됨!
======== action 패키지에 BoardModifyFormAction.java 만들기
package action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import vo.ActionForward; public class BoardModifyFormAction implements Action { @Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("BoardModifyFormAction"); ActionForward forward = null; return forward; } } |
- 틀 만들기
< BoardFrontController.java >
else if(command.equals("/BoardModifyForm.bo")) { action = new BoardModifyFormAction(); // 공통 메서드인 execute() 메서드를 호출하여 request, response 객체 전달 try { forward = action.execute(request, response); } catch (Exception e) { e.printStackTrace(); } } |
- 경로 추가
> 실행해서 수정 눌렀을 때
- 콘솔창에 뜨는 지 확인
- 우리가 필요한 건 board_num!
< BoardModifyFormAction.java >
- 추가
> 게시물 하나 가져오는 getArticle()메서드를 만들어놓음! (BoardDetailService 에서!)
→ 그래서 우리가 Service 를 만드는 거!
- 추가
- 게시판에 수정 눌렀을 때
- 제목 찍힘
- 추가
======== board 폴더에 qna_board_modify.jsp 만들기
<qna_board_modify.jsp>
<h1>글수정</h1>
- 확인을 위해 추가하기
- 설정이 잘 되었다면 넘어간다!
632
< qna_board_modify.jsp >
<%@page import="vo.BoardBean"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>MVC 게시판</title> <style type="text/css"> #registForm{ width: 500px; height: 600px; border : 1px solid red; margin:auto; } h2{ text-align: center; } table{ margin:auto; width: 450px; } .td_left{ width: 150px; background:orange; } .td_right{ width: 300px; background:skyblue; } #commandCell{ text-align: center; } </style> </head> <body> <% String nowPage = request.getParameter("page"); BoardBean article = (BoardBean)request.getAttribute("article"); %> <!-- 게시판 등록 --> <section id = "writeForm"> <h2>게시판글수정</h2> <form action="BoardModifyPro.bo" method="post" name = "modifyform" > <input type="hidden" name="board_num" value="<%=article.getBoard_num()%>"/> <input type="hidden" name="page" value="<%=nowPage %>"/> <table> <tr> <td class="td_left"> <label for = "board_name">글쓴이</label> </td> <td class="td_right"> <input type = "text" name="board_name" id = "board_name" value = "<%=article.getBoard_name()%>"/> </td> </tr> <tr> <td class="td_left"> <label for = "board_pass">비밀번호</label> </td> <td class="td_right"> <input name="board_pass" type="password" id = "board_pass"/> </td> </tr> <tr> <td class="td_left"> <label for = "board_subject">제 목</label> </td> <td class="td_right"> <input name="board_subject" type="text" id = "board_subject" value = "<%=article.getBoard_subject()%>"/> </td> </tr> <tr> <td class="td_left"> <label for = "board_content">내 용</label> </td> <td> <textarea id = "board_content" name="board_content" cols="40" rows="15"><%=article.getBoard_content()%></textarea> </td> </tr> </table> <section id = "commandCell"> <input type="submit" value="수정"> <input type="button" value="뒤로" onclick="history.back(-1)"> </section> </form> </section> </body> </html> |
======== action 패키지에 BoardModifyProAction.java 만들기
- 객체 생성 전 패스워드 일치 여부 확인하러 가기
======== service 패키지에 BoardModifyProService.java 만들기
- 메서드 자동생성하기 → boardDAO 로 감!
< BoardDAO.java >
- false 리턴
- 실행시켰을 때
- 콘솔창에도 잘 뜨는지 확인
- true로 변경할 경우 콘솔창도 바뀌어야함
< BoardModifyProAction.java >
- 패스워드 판별
- 틀릴 경우
- alert 창 뜸!
< BoardDAO.java >
// 게시물 수정을 위한 적합한 사용자 판별(게시물 패스워드 일치여부 확인) public boolean isArticleBoardWriter(int board_num, String board_pass) { boolean isArticleWriter = false; PreparedStatement pstmt = null; ResultSet rs = null; try { String sql = "SELECT * FROM board WHERE board_num=?"; pstmt = con.prepareStatement(sql); pstmt.setInt(1, board_num); rs = pstmt.executeQuery(); if(rs.next()) { if(rs.getString("board_pass").equals(board_pass)) { isArticleWriter = true; } } } catch (SQLException e) { // e.printStackTrace(); System.out.println("BoardDAO - isArticleBoardWriter() 실패! : " + e.getMessage()); } return isArticleWriter; } |
- 실행했을 때 비밀번호가 맞다면
- 올바른 사용자입니다 콘솔창에 뜸!
< BoardModifyProAction.java >
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; public class 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; } } |
< BoardDAO.java >
public int updateArticle(BoardBean article) { int updateCount = 0; PreparedStatement pstmt = null; try { String sql = "UPDATE board SET board_name=?, board_subject=?, board_content=? WHERE board_num=?"; pstmt = con.prepareStatement(sql); pstmt.setString(1, article.getBoard_name()); pstmt.setString(2, article.getBoard_subject()); pstmt.setString(3, article.getBoard_content()); pstmt.setInt(4, article.getBoard_num()); updateCount = pstmt.executeUpdate(); } catch (SQLException e) { // e.printStackTrace(); System.out.println("BoardDAO - updateArticle() 실패! : " + e.getMessage()); } finally { close(pstmt); } return updateCount; } |
< BoardModifyProService.java >
// 글 수정 작업 public boolean modifyArticle(BoardBean article) { // System.out.println("BoardModifyProService - modifyArticle()"); boolean isModifySuccess = true; Connection con = getConnection(); BoardDAO boardDAO = BoardDAO.getInstance(); boardDAO.setConnection(con); // System.out.println("수정할 제목 : " + article.getBoard_subject()); // BoardDAO 클래스의 updateArticle() 메서드를 호출하여 게시물 수정 // => 파라미터 : BoardBean, 리턴타입 : int(updateCount) int updateCount = boardDAO.updateArticle(article); // 리턴받은 updateCount 가 0보다 크면 commit, isModifySuccess 를 true 로 변경 // 아니면 rollback 수행 if(updateCount > 0) { commit(con); isModifySuccess = true; } else { rollback(con); } close(con); return isModifySuccess; } |
> 다시 실행해서 수정해보기
- 수정 성공했을 때 콘솔창에 성공 뜨면 됨!
======== qna_board_delete.jsp 만들기
<h1>글 삭제</h1>
- 확인용으로 하나 적어놓기
< BoardFrontController.java >
else if(command.equals("/BoardDeleteForm.bo")) {
forward = new ActionForward();
forward.setPath("/board/qna_board_delete.jsp");
}
- 추가
> 다시 실행해서 삭제했을 때
- 글 삭제 나오면 됨!
635
< qna_board_delete.jsp >
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>MVC 게시판</title> <style> #passForm{ width:400px; margin:auto; border : 1px solid orange; } </style> </head> <body> <% int board_num = Integer.parseInt(request.getParameter("board_num")); String nowPage = (String)request.getParameter("page"); %> <section id ="passForm"> <form name="deleteForm" action="BoardDeletePro.bo?board_num=<%=board_num %>" method="post"> <input type ="hidden" name ="page" value ="<%=nowPage %>"/> <table> <tr> <td> <label>글 비밀번호 : </label> </td> <td> <input name="board_pass" type="password"> </td> </tr> <tr> <td> <input type="submit" value = "삭제"/> <input type = "button" value = "돌아가기" onClick ="history.back()"/> </td> </tr> </table> </form> </section> </body> </html> |
======== action 패키지에 BoardDeleteProAction.java 만들기
System.out.println("BoardDeleteProAction"); |
- 확인을 위해 syso 찍어보기
< BoardFrontController.java >
else if(command.equals("/BoardDeletePro.bo")) { action = new BoardDeleteProAction(); // 공통 메서드인 execute() 메서드를 호출하여 request, response 객체 전달 try { forward = action.execute(request, response); } catch (Exception e) { e.printStackTrace(); } } |
- 추가
> 실행 후 글삭제를 눌렀을 때
- 콘솔창에 찍히는 거 확인!
< BoardDeleteProAction >
int board_num = Integer.parseInt(request.getParameter("board_num")); String board_pass = request.getParameter("board_pass"); System.out.println("board_num : " + board_num + ", board_pass : " + board_pass); |
- 추가
- 값 잘 받아오는 거 확인!
// BoardDeleteProService 클래스의 인스턴스 생성 BoardDeleteProService boardDeleteProService = new BoardDeleteProService(); // isArticleWriter() 메서드를 호출하여 적합한 사용자인지 판별 // => 파라미터 : 글번호, 패스워드 리턴타입 : boolean(isArticleWriter) boolean isArticleWriter = boardDeleteProService.isArticleWriter(board_num, board_pass); |
- 추가
- 메서드 자동완성으로 만들기
======== svc 패키지에 BoardDeleteProService.java 만들기
- 공통작업 복붙해오기!
// BoardDAO 클래스의 isArticleBoardWriter() 메서드를 호출하여 적합한 사용자인지 판별 // => 파라미터 : 게시물번호(board_num), 패스워드(board_pass) // 리턴타입 : boolean(isArticleWriter) isArticleWriter = boardDAO.isArticleBoardWriter(board_num, board_pass); |
- 지난번에 수정작업할 때 썼던 DAO 그대로 들고옴
< BoardDeleteProAction.java >
if(!isArticleWriter) { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<script>"); out.println("alert('삭제 권한이 없습니다!')"); out.println("history.back();"); out.println("</script>"); } |
- 비밀번호 틀렸을 경우 삭제 권한이 없다고 alert 창 띄우기
< BoardDeleteProAction.java >
package action; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import svc.BoardDeleteProService; import vo.ActionForward; public class BoardDeleteProAction implements Action { @Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("BoardDeleteProAction"); ActionForward forward = null; int board_num = Integer.parseInt(request.getParameter("board_num")); String board_pass = request.getParameter("board_pass"); // System.out.println("board_num : " + board_num + ", board_pass : " + board_pass); // BoardDeleteProService 클래스의 인스턴스 생성 BoardDeleteProService boardDeleteProService = new BoardDeleteProService(); // isArticleWriter() 메서드를 호출하여 적합한 사용자인지 판별 // => 파라미터 : 글번호, 패스워드 리턴타입 : boolean(isArticleWriter) boolean isArticleWriter = boardDeleteProService.isArticleWriter(board_num, board_pass); // 만약, isArticleWriter 가 false 일 경우 // 자바스크립트를 사용하여 "삭제 권한이 없습니다!" 출력 후 이전페이지로 돌아가기 if(!isArticleWriter) { 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 { // isArticleWriter 가 true 일 경우 // removeArticle() 메서드를 호출하여 글 삭제 작업 수행 // => 파라미터 : 글번호 리턴타입 : boolean(isDeleteSuccess) boolean isDeleteSuccess = boardDeleteProService.removeArticle(board_num); if(!isDeleteSuccess) { // 만약, isDeleteSuccess 가 false 일 경우 // 자바스크립트를 사용하여 "삭제 실패!" 출력 후 이전페이지로 돌아가기 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 { // 아니면 ActionForward 객체를 생성하여 BoardList.bo 서블릿 주소 지정(Redirect) // => 포워딩 시 URL 주소 뒤에 page 파라미터 결합하여 전달 System.out.println("글 수정 성공!"); forward = new ActionForward(); forward.setRedirect(true); forward.setPath("BoardList.bo?page="+request.getParameter("page")); } } return forward; } } |
- redirect 방식이므로 주소에 page 번호 같이 들고가기
< BoardDeleteProService.java >
public boolean removeArticle(int board_num) { System.out.println("BoardDeleteProService - removeArticle()"); boolean isDeleteSuccess = false; Connection con = getConnection(); BoardDAO boardDAO = BoardDAO.getInstance(); boardDAO.setConnection(con); int deleteCount = boardDAO.deleteArticle(board_num); if(deleteCount > 0) { commit(con); isDeleteSuccess = true; } else { rollback(con); } close(con); return isDeleteSuccess; } |
- 추가
< BoardDAO.java >
public int deleteArticle(int board_num) { int deleteCount = 0; PreparedStatement pstmt = null; try { String sql = "DELETE FROM board WHERE board_num=?"; pstmt = con.prepareStatement(sql); pstmt.setInt(1, board_num); deleteCount = pstmt.executeUpdate(); } catch (SQLException e) { // e.printStackTrace(); System.out.println("BoardDAO - deleteArticle() 실패! : " + e.getMessage()); } finally { close(pstmt); } return deleteCount; } |
- 메서드 완성시키기
- 비밀번호 입력 후 글삭제시
- 글목록 리스트로 넘어감! (page 번호 들고!)
======== action 패키지에 BoardReplyFormAction.java 추가
System.out.println("BoardReplyFormAction"); |
- 확인을 위해 syso 추가
< BoardFrontController.java >
else if(command.equals("/BoardReplyForm.bo")) { action = new BoardReplyFormAction(); // 공통 메서드인 execute() 메서드를 호출하여 request, response 객체 전달 try { forward = action.execute(request, response); } catch (Exception e) { e.printStackTrace(); } } |
> 실행 시
- 콘솔창에 뜨면 정상작동!
======== qna_board_reply.jsp 만들기
<h1>qna_board_reply.jsp</h1>
- 확인을 위해 하나 적어놓기
< BoardReplyFormAction.java >
package action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import svc.BoardDetailService; import vo.ActionForward; import vo.BoardBean; public class BoardReplyFormAction implements Action { @Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { // 답변글 작성을 위한 원본 게시물 정보 가져오기 System.out.println("BoardReplyFormAction"); ActionForward forward = null; int board_num = Integer.parseInt(request.getParameter("board_num")); // BoardDetailService 클래스의 인스턴스 생성 BoardDetailService boardDetailService = new BoardDetailService(); // getArticle() 메서드를 호출하여 원본 게시물 정보 가져오기 // => 파라미터 : 글번호 리턴타입 : BoardBean(article) BoardBean article = boardDetailService.getArticle(board_num); // request 객체에 BoardBean 객체 저장(article) request.setAttribute("article", article); // board 폴더 내의 qna_board_reply.jsp 페이지로 포워딩 => Dispatcher 방식 forward = new ActionForward(); forward.setPath("/board/qna_board_reply.jsp"); return forward; } } |
> 실행해서 답변버튼을 눌렀을 때
- 이 화면이 뜨면 됨!
629p
< qna_board_reply.jsp >
<%@page import="vo.BoardBean"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>MVC 게시판</title> <style type="text/css"> #registForm { width: 500px; height: 610px; border: 1px solid red; margin: auto; } h2 { text-align: center; } table { margin: auto; width: 450px; } .td_left { width: 150px; background: orange; } .td_right { width: 300px; background: skyblue; } #commandCell { text-align: center; } </style> </head> <body> <% BoardBean article=(BoardBean)request.getAttribute("article"); String nowPage = request.getParameter("page"); %> <!-- 게시판 답변 --> <section id="writeForm"> <h2>게시판 답변글등록</h2> <form action="BoardReplyPro.bo" method="post" name="boardform"> <input type="hidden" name="page" value="<%=nowPage %>"/> <input type="hidden" name="board_num" value="<%=article.getBoard_num() %>"> <input type="hidden" name="board_re_ref" value="<%=article.getBoard_re_ref() %>"> <input type="hidden" name="board_re_lev" value="<%=article.getBoard_re_lev() %>"> <input type="hidden" name="board_re_seq" value="<%=article.getBoard_re_seq() %>"> <table> <tr> <td class="td_left"><label for="board_name">글쓴이</label></td> <td class="td_right"><input type="text" name="board_name" id="board_name"/></td> </tr> <tr> <td class="td_left"><label for="board_pass">비밀번호</label></td> <td class="td_right"><input name="board_pass" type="password" id="board_pass"/></td> </tr> <tr> <td class="td_left"><label for="board_subject">제 목</label></td> <td class="td_right"><input name="board_subject" type="text" id="board_subject"/></td> </tr> <tr> <td class="td_left"><label for="board_content">내 용</label></td> <td><textarea id="board_content" name="board_content" cols="40" rows="15">-------원본 글 내용------- <%=article.getBoard_content() %> </textarea></td> </tr> </table> <section id="commandCell"> <input type="submit" value="답변글등록"/> <input type="reset" value="다시작성"/> </section> </form> </section> </body> </html> |
======== BoardReplyProAction.java 만들기
@Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { // 답변글 작성요청하기 System.out.println("BoardReplyProAction"); ActionForward forward = null; return forward; } |
- 확인을 위해 syso 찍어보기
> 실행해서 답변글 등록 눌렀을 때
콘솔창
실행창
- 잘 넘어가는지 확인
< BoardReplyProAction.java >
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; public class 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; import static db.jdbcUtil.*; import java.sql.Connection; import dao.BoardDAO; import vo.BoardBean; public class BoardReplyProService { public boolean replyArticle(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 { int num = 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; } |
> 실행해서 답변을 달았을 때
- 이렇게 뜨면 됨!
'Dev.Program > Java & Spring' 카테고리의 다른 글
데이터 입출력 : IO(Input/Output) (0) | 2022.10.07 |
---|---|
MVC2 - (5) (0) | 2022.10.07 |
MVC2 - (3) (0) | 2022.10.07 |
MVC2 - (2) Service 클래스 (0) | 2022.10.07 |
MVC2 - (1) (0) | 2022.10.07 |