차근차근 개발자 되기

JSP

73일차: Model 2 게시판(1): 글 작성 / 글 목록_ 2021.09.29

wellow 2021. 9. 29. 20:06

 

목차

1.     글 작성

2.     글 목록

 

 

1. 글 작성

 

1) 뷰 페이지(qna_board_write.jsp)

- 첨부 파일을 업로드 하게 되므로, <form> 태그에서 전송 방식은 ‘post’로 해야하며, enctype 속성을 포함해야 한다.

(ex. <form method="post" action="<%=request.getContextPath() %>/BoardAddAction.do"

enctype="multipart/form-data"> )

- 글 작성 양식에서는 글쓴이(board_name), 비밀번호(board_pass_, 제목(board_subject), 내용(board_content), 파일 첨부(board_file) 값이 전달된다.

- “/BoardAddAction.do” 로 컨트롤러를 호출한다.

- qna_board_write.jsp BoardFrontController.java

 

 

 

2) 컨트롤러 클래스(BoardFrontController.java)

- 글 작성 폼(qna_board_write.jsp)에서 "/BoardAddAction.do"로 요청한 값을 받아 처리한다.

- 서비스 클래스인 BoardAddAction의 객체를 생성하고 execute() 메소드를 호출한다.

- BoardAddAction으로부터 forward 값을 리턴받으면 뷰 페이지로 포워딩한다.

- BoardFrontController.java → BoardAddAction.java

 

3) 서비스 클래스(BoardAddAction.java)

- 글 작성 폼(qna_board_write.jsp)에서 첨부파일을 업로드하는 기능이 있으므로, MultipartRequest 객체를 생성한다.

- 글 작성 폼에서 입력한 값은 생성된 MultipartRequest 객체를 통해 getParameter() 메소드로 불러온다.

- 글 작성(insert) 후 테이블에 데이터가 입력되었는지 확인하고, path 값으로 업로드 폴더에 데이터가 있는지 확인한다.

- 글 작성을 성공하면 "./BoardListAction.do"로 컨트롤러를 호출한다.

- BoardAddAction.java BoardFrontController.java

 

2. 글 목록

 

1) 컨트롤러 클래스(BoardFrontController.java)

- 서비스 클래스(BoardAddAction.java)에서 "./BoardListAction.do"로 요청한 값을 받아 처리한다.

- 서비스 클래스인 BoardListAction의 객체를 생성하고 execute() 메소드를 호출한다.

- BoardListAction으로부터 forward 값을 리턴받으면 뷰 페이지로 포워딩한다.

- BoardFrontController.javaBoardListAction.java

 

2) 서비스 클래스(BoardListAction.java)

- 게시판 목록을 보여주기 위한 서비스 클래스에서는 기본 변수와 생성된 기본 변수에서 파생되는 파생 변수를 설정한다. (ex. 현재 페이지 번호, 한 화면에 출력할 데이터 개수 등)

- 필요한 값들을 설정하는 과정에서 DAO 객체를 생성하고 필요한 메소드를 호출한다.

- 구해온 값들은 request 객체로 공유 설정한다.

(ex. request.setAttribute("page", page); )

- ActionForward 객체를 생성하고 전송 방식과 경로를 설정한 후 리턴한다.

- request 객체로 공유한 값을 포워딩된 페이지에서 사용하기 위해서는 전송 방식이 dispatcher 방식으로 설정되어야 한다.

- “/board/qna_board_list.jsp”로 컨트롤러를 호출한다.

- BoardListAction.java BoardFrontController.java

 

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
package service;
 
import java.util.List;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import dao.BoardDAO;
import model.BoardBean;
 
public class BoardListAction implements Action {
 
    @Override
    public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("BoardListAction");
        
        int page = 1;        // 현재 페이지 번호
        int limit = 10;        // 한 화면에 출력할 데이터 개수
        
        if(request.getParameter("page"!= null) {
            page = Integer.parseInt(request.getParameter("page"));
        }
        
        // page = 1 : startRow = 1, endRow = 10;
        // page = 2 : startRow = 11, endRow = 20;
        int startRow = (page - 1* limit + 1;
        int endRow = page * limit;
        
        BoardDAO dao = BoardDAO.getInstance();        // DAO 객체 생성해서 DB 연동
        // 총 데이터 개수
        int listcount = dao.getCount();    
        System.out.println("listcount:"+listcount);    // index 파일 실행하고 콘솔 창 확인
        
        List<BoardBean> boardlist = dao.getList(startRow, endRow);
        System.out.println("boardlist:"+boardlist);
        
        // 총 페이지 수
        int pageCount = listcount/limit + ((listcount%limit == 0) ? 0 : 1);
        
        int startPage = ((page - 1)/10* limit + 1;    // 1, 11, 21 ...
        int endPage = startPage + 10 - 1;                // 10, 20, 30 ...
        
        if(endPage > pageCount) {
            endPage = pageCount;
        }
        
        // 공유 설정
        request.setAttribute("page", page);
        request.setAttribute("listcount", listcount);
        request.setAttribute("boardlist", boardlist);
        request.setAttribute("pageCount", pageCount);
        request.setAttribute("startPage", startPage);
        request.setAttribute("endPage", endPage);
        
        ActionForward forward = new ActionForward();
        
        // request 객체로 공유를 한 경우에는 dispatcher 방식으로 포워딩이 되어야
        // 포워딩되는 view 페이지에서 공유한 값에 접근할 수 있다.
        forward.setRedirect(false);         // dispatcher 방식으로 포워딩
        forward.setPath("./board/qna_board_list.jsp");
        
        return forward;
    }
 
}
 
cs

 

 

3) 컨트롤러 클래스(BoardFrontController.java)

- BoardListAction으로부터 forward 값을 리턴받으면 dispatcher 방식으로 뷰 페이지(qna_board_list.jsp)로 포워딩한다.

- BoardFrontController.java qna_board_list.jsp

 

4) 뷰 페이지(qna_board_list.jsp)

- 글 목록을 보여주는 뷰 페이지에서는 JSTL 코어 라이브러리와 국제화 라이브러리를 사용하게 되므로, 각각의 라이브러리를 불러오는 코드를 추가해야 한다.

(ex. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> )

- 게시판 목록을 보여주기 위한 서비스 클래스(BoardListAction.java)에서 request 객체로 공유한 값은 EL 태그로 가져올 수 있다.( ${listcount} )

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
 
 
글 쓰기 <br>
글 개수 : ${listcount}개 <br>
 
<table border=1 width=700 align=center>
    <caption><h3>게시판 목록</h3></caption>
      <tr>
        <th>번호</th>
        <th>제목</th>
        <th>작성자</th>
        <th>날짜</th>
        <th>조회수</th>
      </tr>
 
 
</table>
 
cs