JSP 쇼핑몰 만들기

14. 모델2 게시판 - 게시글 보기 3

14.1 foward

BoardList.jsp객체 쪽으로 request객체에 담아서 넘겨줘야한다.

//BoardList.jsp객체 쪽으로 request객체에 담아서 넘겨줌
request.setAttribute("list", list);
request.setAttribute("number", number);
request.setAttribute("pageSize", pageSize);
request.setAttribute("count", count);
request.setAttribute("currentPage", currentPage);

RequestDispatcher dis = request.getRequestDispatcher("BoardList.jsp");
dis.forward(request, response);

14.2 BoardList.jsp

포워드 받은 데이터로 BoardList.jsp작성

BoardWriteForm.jsp을 컨트롤러를 들려서 가는게 좋긴하겟지만 자바코드가 필요없으니
바로 가게 해주자.

number는 -1씩 줄어들도록 따로 변수를 선언하고 반복문을 돌때마다 -1이 되도록하자.
제목은 들여쓰기를 해야하니 또 c:foreach를 사용해서 넣어주자.
1부터 스텝만큼 띄어쓰기를 해주자.

<div align="center">
    <h2>전체 게시글 보기</h2>
    <table border="1">
        <tr>
            <td align="right" colspan="5">
                <button type="button" onclick="location.href='BoardWriteForm.jsp'">글쓰기</button>
            </td>
        </tr>

        <tr height="40">
            <td align="center" width="50"> 번호 </td>
            <td align="center" width="320"> 제목 </td>
            <td align="center" width="100"> 작성자 </td>
            <td align="center" width="150"> 작성일 </td>
            <td align="center" width="80"> 조회수 </td>
        </tr>

        <c:set var="number" value="${number}"></c:set>
        <c:forEach var="bean" items="${list}" >
            <tr height="40">
                <td align="center" width="50"> ${number} </td>
                <td align="left" width="320"> 
                    <c:if test="${bean.re_step > 1}">
                        <c:forEach var="j" begin="1" end="${(bean.re_step-1) * 5}">
                        &nbsp;
                        </c:forEach>
                    </c:if>
                    <a href="BoardInfoControl.do?num=${bean.num }">${bean.subject }</a>
                </td>
                <td align="center" width="100"> ${bean.writer } </td>
                <td align="center" width="150"> ${bean.reg_date } </td>
                <td align="center" width="80"> ${bean.readcount } </td>
            </tr>
        <c:set var="number" value="${number-1}"></c:set>
        </c:forEach>
    </table>
</div>

15. 모델2 게시판 - 게시글 보기 4

카운터링이 필요하니 카운터링을 넣어줘야한다.
이전에 사용한 카운터링을 가져다 사용하면된다.

받아온 값을 정수로 변경하기 위해 fmt태그를 사용할 수 있다.
tablib fmt를 추가해야한다.
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<fmt:parseNumber var="result" value="${currentPage / 10}" integerOnly="true"/>
number로 파싱을 하는데 이름은 result이고 파싱할값은 value integerOnly은 숫자로만 만들겠다는것이다.

이것을 다시 set해서 startPage변수에 넣어주면된다.

<p>
    <!-- 페이지 카운터링 소스 작성 -->
    <c:if test="${count >0}">
        <c:set var="pageCount" value="${count / pageSize + (count % pageSize == 0 ? 0 : 1) }"/>
        <c:set var="startPage" value="1"/>

        <fmt:parseNumber var="result" value="${currentPage / 10}" integerOnly="true"/>

        <c:if test="${currentPage % 10 !=0}">
            <!-- 결과를 정수형으로 리턴받아야하기에 fmt태그사용 -->
            <c:set var="startPage" value="${result * 10 + 1}"/>
        </c:if>

        <c:if test="${ currentPage % 10 ==0}">
            <c:set var="startPage" value="${(result-1) * 10 + 1}"/>
        </c:if>

        <!-- 화면에 보여질 페이지 처리 숫자를 표현 -->
        <c:set var="pageBlock" value="10" />
        <c:set var="endPage" value="${startPage + pageBlock -1}" />

        <c:if test="${endPage > pageCount}">
            <c:set var="endPage" value="${pageCount}"/>
        </c:if>

        <!-- 이전 링크를 걸지 파악 -->
        <c:if test="${startPage > 10}">
            <a href="BoardListCon.do?pageNum=${startPage - 10}">[이전]</a>
        </c:if>

        <!-- 페이징처리 -->
        <c:forEach var="i" begin="${startPage}" end="${endPage}">
            <a href="BoardListCon.do?pageNum=${i}">[${i}]</a>
        </c:forEach>

        <!-- 다음 링크를 걸지 파악 -->
        <c:if test="${endPage < pageCount}">
            <a href="BoardListCon.do?pageNum=${startPage + 10}">[다음]</a>
        </c:if>
    </c:if>
</p>

16. 모델2 게시판 - 게시글 쓰기

글보기 까지 만들었으니 글쓰기를 만들어보자.
글쓰기를 처리하면 BoardWriteProcCon.do 컨트롤러로 가게 해주자.

BoardWriteProcCon.do에서는 bean클래스로 읽어들이고 db와 연결하는 것을 만들어주면된다.
번호는 자동으로 늘어나고 ref는 현재 값을 가져와야하니 불러온다.

16.1 BoardDAO

// 하나의 게시글을 저장하는 메소드 호출
public void insertBoard(BoardBean bean) {
    getCon();

    int ref = 0;
    // 새글이기에 = 부모글이기에
    int re_step = 1;
    int re_level = 1;

    try {
        String refsql = "SELECT MAX(REF) FROM BOARD";
        pstmt = con.prepareStatement(refsql);
        // 쿼리 실행후 결과를 리턴
        if (rs.next()) {
            ref = rs.getInt(1) + 1; // 가장큰값에 1더하기
        }

        String sql = "INSERT INTO BOARD(WRITER, EMAIL, SUBJECT, PASSWORD, REG_DATE, REF, RE_STEP, RE_LEVEL, READCOUNT, CONTENT)"
                + " VALUES(?, ?, ?, ?, NOW(), ?, ?, ?, 0, ?)";

        pstmt = con.prepareStatement(sql);
        pstmt.setString(1, bean.getWriter());
        pstmt.setString(2, bean.getEmail());
        pstmt.setString(3, bean.getSubject());
        pstmt.setString(4, bean.getPassword());
        pstmt.setInt(5, ref);
        pstmt.setInt(6, re_step);
        pstmt.setInt(7, re_level);
        pstmt.setString(8, bean.getContent());

        pstmt.executeUpdate();

        con.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

16.2 BoardWriteProc

한글이 깨지지 않도록 request.setCharacterEncoding("UTF-8"); 꼭해주자!!

@WebServlet("/BoardWriteProcCon.do")
public class BoardWriteProcCon extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        reqPro(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        reqPro(request, response);
    }

    protected void reqPro(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        //빈클래스로 데이터 읽어들임
        BoardBean bean = new BoardBean();
        bean.setWriter(request.getParameter("writer"));
        bean.setSubject(request.getParameter("subject"));
        bean.setEmail(request.getParameter("email"));
        bean.setPassword(request.getParameter("password"));
        bean.setContent(request.getParameter("content"));

        BoardDAO2 bdao = new BoardDAO2();
        bdao.insertBoard(bean);

        RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
        dis.forward(request, response);
    }
}

17. 모델2 게시판 - 게시글판 보기

제목을 누르면 상세 글을 읽어보자.

17.1 BoardDAO

게시글의 번호를 받아와서 보는 것이다.
일단 글을 읽으면 조회수가 올라야하니 조회수에 +1해주는 쿼리를 실행시키고 데이터를 가져와야한다.

//하나의 게시글을 읽어오는 메소드
public BoardBean getOneBoard(int num) {
    getCon();
    BoardBean bean = null;
    try {
        String countsql = "UPDATE BOARD SET READCOUNT = READCOUNT + 1 WHERE NUM = ?";
        pstmt = con.prepareStatement(countsql);
        pstmt.setInt(1, num);
        pstmt.executeUpdate();

        String sql = "SELECT * FROM BOARD WHERE NUM = ?";
        pstmt = con.prepareStatement(sql);
        pstmt.setInt(1, num);

        rs = pstmt.executeQuery();
        if (rs.next()) {
            bean = new BoardBean();
            bean.setNum(rs.getInt(1));
            bean.setWriter(rs.getString(2));
            bean.setEmail(rs.getString(3));
            bean.setSubject(rs.getString(4));
            bean.setPassword(rs.getString(5));
            bean.setReg_date(rs.getDate(6).toString());
            bean.setRef(rs.getInt(7));
            bean.setRe_step(rs.getInt(8));
            bean.setRe_level(rs.getInt(9));
            bean.setReadcount(rs.getInt(10));
            bean.setContent(rs.getString(11));
        }
        con.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return bean;
}

17.2 BoardInfoCon

bean을 담아서 jsp쪽으로 보내주면된다.

@WebServlet("/BoardInfoCon.do")
public class BoardInfoCon extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        reqPro(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        reqPro(request, response);
    }

    protected void reqPro(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //number값을 리턴
        int num = Integer.parseInt(request.getParameter("num"));

        BoardDAO2 bdao = new BoardDAO2();

        //하나의 게시글 정보 리턴
        BoardBean bean = bdao.getOneBoard(num);

        request.setAttribute("bean", bean);

        //view로 넘겨주기
        RequestDispatcher dis = request.getRequestDispatcher("BoardInfo.jsp");
        dis.forward(request, response);
    }
}

17.3 BoardInfo

EL을 통해서 값을 가져오고 각 컨트롤러로 가지게 하자.

<div align="center">
    <h2>게시글 보기</h2>
    <table border="1">
        <tr height="40">
            <td align="center" width="120px"> 글번호 </td>
            <td align="center" width="180px"> ${bean.num } </td>
            <td align="center" width="120px"> 조회수 </td>
            <td align="center" width="180px"> ${bean.readcount } </td>
        </tr>

        <tr height="40">
            <td align="center" width="120px"> 작성자 </td>
            <td align="center" width="180px"> ${bean.writer } </td>
            <td align="center" width="120px"> 작성일 </td>
            <td align="center" width="180px"> ${bean.reg_date } </td>
        </tr>

        <tr height="40">
            <td align="center" width="120px"> 이메일 </td>
            <td align="center" colspan="3"> ${bean.email } </td>
        </tr>

        <tr height="40">
            <td align="center" width="120px"> 제목 </td>
            <td align="center" colspan="3"> ${bean.subject } </td>
        </tr>

        <tr height="80">
            <td align="center" width="120px"> 글내용 </td>
            <td align="center" colspan="3"> ${bean.content } </td>
        </tr>

        <tr height="40">
            <td align="center" colspan="4">
                <input type="button" value="답글쓰기" onclick="location.href='BoradReWriteCon.do?num=${bean.num }&ref=${bean.ref}&re_step=${bean.re_step}&re_level=${bean.re_step }'"/>
                <input type="button" value="수정하기" onclick="location.href='BoardUpdateCon.do?num=${bean.num}'"/>
                <input type="button" value="삭제하기" onclick="location.href='BoardDeleteCon.do?num=${bean.num}'"/>
                <input type="button" value="목록보기" onclick="location.href='BoardListCon.do.jsp'"/>
            </td>
        </tr>
    </table>
</div>

18. 모델2 게시판 - 답글쓰기

18.1 BoradReWriteCon.do

가져온 부모의 정보들로 BoardReWriteForm.jsp를 보여주면된다.

protected void reqPro(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    int ref = Integer.parseInt(request.getParameter("ref"));
    int re_step = Integer.parseInt(request.getParameter("re_step"));
    int re_level = Integer.parseInt(request.getParameter("re_level"));

    request.setAttribute("ref", ref);
    request.setAttribute("re_step", re_step);
    request.setAttribute("re_level", re_level);

    RequestDispatcher dis = request.getRequestDispatcher("BoardReWriteForm.jsp");
    dis.forward(request, response);
}

18.2 BoardReWriteForm.jsp

BoardReWriteProcCon.do로 가지게 form의 데이터를 넘겨준다.
ref값등은 hidden으로 넘겨준다.

<div align="center">
    <form action="BoardReWriteProc.do" method="post">
        <table border="1">
            <tr height="40">
                <td align="center" width="150px">작성자</td>
                <td width="450px"><input type="text" name="writer" size="60" /></td>
            </tr>

            <tr height="40">
                <td align="center" width="150px">제목</td>
                <td width="450px"><input type="text" name="subject" value="[답변]" size="60" /></td>
            </tr>

            <tr height="40">
                <td align="center" width="150px">이메일</td>
                <td width="450px"><input type="email" name="email" size="60" /></td>
            </tr>

            <tr height="40">
                <td align="center" width="150px">비밀번호</td>
                <td width="450px"><input type="password" name="password" size="60" /></td>
            </tr>

            <tr height="40">
                <td align="center" width="150px">글내용</td>
                <td width="450px"><textarea rows="10" cols="50" name="content"></textarea></td>
            </tr>

            <!-- form에서 사용자로부터 입력받지 않고 데이터를 넘김 -->
            <tr height="40">
                <td align="center" colspan="2">
                    <input type="hidden" name="ref" value="${ref}"/>
                    <input type="hidden" name="re_step" value="${re_step}"/>
                    <input type="hidden" name="re_level" value="${re_level }"/>
                    <input type="submit" value="답글쓰기 완료"> &nbsp;&nbsp; 
                    <input type="reset" value="취소"> &nbsp;&nbsp;
                    <input type="button" value="전체 글 보기"  onclick="location.href='BoardListProc.do'" />
                </td>
            </tr>
        </table>
    </form>
</div>

18.3 BoardReWriteProcCon.do

protected void reqPro(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    BoardBean bean = new BoardBean();

    int ref = Integer.parseInt(request.getParameter("ref"));
    int re_step = Integer.parseInt(request.getParameter("re_step"));
    int re_level = Integer.parseInt(request.getParameter("re_level"));

    bean.setWriter(request.getParameter("writer"));
    bean.setSubject(request.getParameter("subject"));
    bean.setEmail(request.getParameter("email"));
    bean.setPassword(request.getParameter("password"));
    bean.setContent(request.getParameter("content"));
    bean.setRef(ref);
    bean.setRe_step(re_step);
    bean.setRe_level(re_level);

    BoardDAO2 bdao = new BoardDAO2();

    bdao.reInsertBoard(bean);

    RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
    dis.forward(request, response);
}

18.4 BoardDAO2

BoardReWriteProcCon.do에서 만든 bean클래스를 db에 넣어주자.
답글은 부모의 ref와 같게 re_step +1씩늘어나게 re_level은 부모보다 큰애들은 +1해주면된다.
그리고 현재 작성하는 글은 부모보다 +1씩해주면된다.

//답변글을 저장하는 메소드
public void reInsertBoard(BoardBean bean) {
    getCon();

    int ref = bean.getRef();
    // 새글이기에 = 부모글이기에
    int re_step = bean.getRe_step();
    int re_level = bean.getRe_level();

    try {
        //핵심코드 restep +1 relevel부모보다 높으면 +1
        String levelsql = "UPDATE BOARD SET RE_LEVEL = RE_LEVEL + 1 WHERE REF=? AND RE_LEVEL > ? "; 
        pstmt = con.prepareStatement(levelsql);
        pstmt.setInt(1, ref);
        pstmt.setInt(2, re_level);

        pstmt.executeUpdate();

        String sql = "INSERT INTO BOARD(WRITER, EMAIL, SUBJECT, PASSWORD, REG_DATE, REF, RE_STEP, RE_LEVEL, READCOUNT, CONTENT)"
                + " VALUES(?, ?, ?, ?, NOW(), ?, ?, ?, 0, ?)";

        pstmt = con.prepareStatement(sql);
        pstmt.setString(1, bean.getWriter());
        pstmt.setString(2, bean.getEmail());
        pstmt.setString(3, bean.getSubject());
        pstmt.setString(4, bean.getPassword());
        pstmt.setInt(5, ref);
        pstmt.setInt(6, re_step + 1); //기본부모글의 스탭보다 +1
        pstmt.setInt(7, re_level + 1); //기존 부모글의 레벨보다 +1
        pstmt.setString(8, bean.getContent());

        pstmt.executeUpdate();

        con.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

19. 모델2 게시판- 게시판 수정 고급

수정버튼을 누르면 BoardUpdateCon.do서블릿으로 가면된다.

19.1 BoardUpdateCon.do

받은 num을 기준으로 수정폼에 데이터를 얻어오면된다.

@WebServlet("/BoardUpdateCon.do")
public class BoardUpdateCon extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        reqPro(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        reqPro(request, response);
    }

    protected void reqPro(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        int num = Integer.parseInt(request.getParameter("num"));

        BoardDAO2 bdao = new BoardDAO2();
        BoardBean bean = bdao.getOneUpdateBoard(num);

        request.setAttribute("bean", bean);

        RequestDispatcher dis = request.getRequestDispatcher("BoardUpdateForm.jsp");
        dis.forward(request, response);
    }
}

19.2 하나의 게시글 정보

조회수 증가하지 않도록 이전의 게시글 리턴 메소드를 수정해준다.

//조회수 증가하지 않는 하나의 게시글 리턴 메소드
public BoardBean getOneUpdateBoard(int num) {
    getCon();
    BoardBean bean = null;
    try {
        String sql = "SELECT * FROM BOARD WHERE NUM = ?";
        pstmt = con.prepareStatement(sql);
        pstmt.setInt(1, num);

        rs = pstmt.executeQuery();
        if (rs.next()) {
            bean = new BoardBean();
            bean.setNum(rs.getInt(1));
            bean.setWriter(rs.getString(2));
            bean.setEmail(rs.getString(3));
            bean.setSubject(rs.getString(4));
            bean.setPassword(rs.getString(5));
            bean.setReg_date(rs.getDate(6).toString());
            bean.setRef(rs.getInt(7));
            bean.setRe_step(rs.getInt(8));
            bean.setRe_level(rs.getInt(9));
            bean.setReadcount(rs.getInt(10));
            bean.setContent(rs.getString(11));
        }
        con.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return bean;
}

19.3 updateform

hidden으로 bean의 password를 넘겨서 db를 안거치고 비밀번호 확인해서 수정하자.

<div align="center">
    <h2>게시글 수정</h2>
    <form action="BoardUpdateProcCon.do" method="post">
        <table border="1">
            <tr height="40">
                <td align="center" width="120px"> 작성자 </td>
                <td align="center" width="180px"> ${bean.writer } </td>
                <td align="center" width="120px"> 작성일 </td>
                <td align="center" width="180px"> ${bean.reg_date } </td>
            </tr>

            <tr height="40">
                <td align="center" width="120px"> 제목 </td>
                <td width="480px" colspan="3"> &nbsp; <input type="text" name="subject" size="60" value=" ${bean.subject } "/> </td>
            </tr>

            <tr height="40">
                <td align="center" width="120px"> 패스워드 </td>
                <td width="480px" colspan="3"> &nbsp; <input type="password" name="password" size="60"/> </td>
            </tr>

            <tr height="40">
                <td align="center" width="120px"> 글내용 </td>
                <td width="480px" colspan="3"> <textarea rows="10" cols="60" name="content" align="left"/>${bean.content }</textarea></td>
            </tr>

            <tr height="40">
                <td align="center" colspan="4">
                    <input type="hidden" name="num" value="${bean.num}"/>
                    <input type="hidden" name="dbpassword" value="${bean.password}"/>
                    <input type="submit" value="글수정" /> &nbsp;&nbsp;
                    <input type="button" value="전체글보기" onclick="location.href='BoardListCon.do'"/>
                </td>
            </tr>
        </table>
    </form>
</div>

20. 모델2 게시판 - 수정과 삭제

수정을 하기 위해서 전체 값을 받아올 필요는 없다.
바꿀 제목과 컨텐츠만 받아오고 받아온 비밀번호를 비교해서 일치하면수정 불일치하면 돌아가도록하자.

20.1 updateBoard()

bean을 넣어도되지만 간단하게 subject와 content를 받고 직접 수정하자.

//업데이트하기
public void UpdateBoard(int num, String subject, String content) {
    getCon();
    try {
        String sql = "UPDATE BOARD SET SUBJECT = ?, CONTENT = ? WHERE NUM = ?";
        pstmt = con.prepareStatement(sql);
        pstmt.setString(1, subject);
        pstmt.setString(2, content);
        pstmt.setInt(3, num);

        pstmt.executeUpdate();

        con.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

20.2 BoardUpdateProcCon.do

수정이 완료되었다면 전체게시글보기
비밀번호가 틀리면 이전페이지로 이동하게 해주자.

@WebServlet("/BoardUpdateProcCon.do")
public class BoardUpdateProcCon extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        reqPro(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        reqPro(request, response);
    }

    protected void reqPro(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        int num = Integer.parseInt(request.getParameter("num"));
        String password = request.getParameter("password"); //사용자가 입력한 비밀번호
        String dbpassword = request.getParameter("dbpassword"); //db에 저장되있던 비밀번호
        String subject = request.getParameter("subject");
        String content = request.getParameter("content");

        if (password.equals(dbpassword)) {
            BoardDAO2 bdao = new BoardDAO2();
            bdao.UpdateBoard(num, subject, content);

            request.setAttribute("msg", "수정이 완료되었습니다.");
            RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
            dis.forward(request, response);
        } else {
            request.setAttribute("msg", "비밀번호가 맞지않습니다.");
            RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
            dis.forward(request, response);
        }
    }
}

'기초단계 > JSP&Servlet' 카테고리의 다른 글

2023.04.08 JSP  (0) 2023.04.10
2023.04.06 JSP  (0) 2023.04.06
2023.04.03 JSP  (0) 2023.04.03
2023.04.02 JSP  (0) 2023.04.02
2023.04.01 JSP  (0) 2023.04.02

+ Recent posts