MVC2 - (4)

2022. 10. 7. 16:32Dev.Program/Java & Spring

728x90

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++){ %>
&nbsp; <%} %><%}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){ %>
[이전]&nbsp;
<%}else{ %>
<a href="BoardList.bo?page=<%=nowPage-1 %>">[이전]</a>&nbsp;
<%} %>

<%for(int a=startPage;a<=endPage;a++){
if(a==nowPage){%>
[<%=a %>]
<%}else{ %>
<a href="BoardList.bo?page=<%=a %>">[<%=a %>]
</a>&nbsp;
<%} %>
<%} %>

<%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 = "삭제"/>
&nbsp;&nbsp;
<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="답변글등록"/>&nbsp;&nbsp;
<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;
}

 

> 실행해서 답변을 달았을 때

  • 이렇게 뜨면 됨!






728x90

'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