기초단계/JSP&Servlet

2023.03.26 JSP

춘핑이 2023. 3. 26. 21:11

JSP 쇼핑몰 만들기

4. BoardWriteProc,게시글 저장

실제 글쓰기 처리
글쓰기 boardwirteform -> 글쓰기 처리 boardwriteproc
-> 글쓰기 저장 boarddao -> 전체 글보기 boardlist

4.1 boardwriteproc

있는거만 들어오고 나머지는 null처리
db에 빈클래스를 넘겨주면된다.

<%
    request.setCharacterEncoding("UTF-8"); //한글처리
%>
<!-- 게시글 작성한 데이터를 한번에 읽기 useBean -->
<jsp:useBean id="boardBean" class="model.BoardBean" >
    <jsp:setProperty name="boardBean" property="*"/>
</jsp:useBean>

<%
    BoardDAO bddao = new BoardDAO();
    // 데이터 저장 메소드 호출
    bddao.insertBoard(boardBean);
%>

4.2 insertBoard

BoardDAO의 insertBoard 메소드
하나의 새로운 게시글이 넘어와서 저장되는 메소드이다.
빈클래스에 넘어오지 않았던 데이터를 초기화해야한다.

REGDATE는 SYSDATE기준으로 처리
REF는 현재 가장큰 REF값을 더해서 처리 (새글이기때문)
READCOUNT처음에는 0

public void insertBoard(BoardBean bean) {
    getCon();
    // 빈클래스에 넘어오지 않았던 데이터를 초기화
    int ref = 0; // 글 그룹 의미 = 퀴리에서 가장 큰 ref값 가져오고 +1
    int re_step = 1; // 새글이기에 = 부모글이기에
    int re_level = 1;

    try {
        // 가장 큰 ref값을 읽어오는 쿼리준비
        String refsql = "SELECT MAX(REF) FROM BOARD";
        // 쿼리실행
        pstmt = con.prepareStatement(refsql);
        // 쿼리실행후 결과를 리턴
        rs = pstmt.executeQuery();
        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();

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

44. BoardList 글목록보기

게시판 전체 내용을 확인해보자.
글쓰기를 완료하면 전체게시글 보기 BoardList.jsp가 나오게하면된다.

전체 게시글 내용 jsp로 가져오면된다.

게시글 이전 다음 필요로하니 count소스(페이징)도 나중에 달아줄것이다.

// 모든 게시글을 리턴해주는 메소드 작성
public List<BoardBean> getAllBoard() {
    // 리턴할 객체 선언
    List<BoardBean> list = new ArrayList<>();

    getCon();

    try {
        String sql = "SELECT * FROM BOARD ORDER BY REF DESC, RE_STEP ASC, RE_LEVEL ASC";

        pstmt = con.prepareStatement(sql);
        rs = pstmt.executeQuery();
        while (rs.next()) {
            BoardBean 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));

            list.add(bean);

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

45. BoardList 글목록보기

받아온 데이터를 뿌려주자.
숫자는 get.num하면 순서가 뒤죽박죽 될 수 있다. 그러니 그냥 i+1로 뿌려주자.
Num은 그냥 식별하기 위한것임을 알아두자.

<%
//전체 게시글 내용 jsp로 가져오기
BoardDAO bdao = new BoardDAO();

//전체 게시글을 리턴 받아주는 소스
List<BoardBean> list = bdao.getAllBoard();
%>
<div align="center">
    <h2>전체 게시글 보기</h2>
    <table border="1">
        <tr height="40">
            <td align="center" width="50px"> 번호 </td>
            <td align="center" width="320px"> 제목 </td>
            <td align="center" width="100px"> 작성자 </td>
            <td align="center" width="150px"> 작성일 </td>
            <td align="center" width="80px"> 조회수 </td>
        </tr>

        <%
            for (int i = 0; i < list.size(); i++){
                BoardBean bean = list.get(i); //저장된걸 하나씩 가져오기
        %>        
            <tr height="40">
                <td align="center" width="50px"> <%= i + 1 %> </td>
                <td align="left" width="320px"> <a href="BoardInfo.jsp?num=<%= bean.getNum() %>"><%= bean.getSubject() %></a></td>
                <td align="center" width="100px"> <%= bean.getWriter() %> </td>
                <td align="center" width="150px"> <%= bean.getReg_date() %> </td>
                <td align="center" width="80px"> <%=bean.getReadcount() %> </td>
            </tr>
        <%    }%>
        <tr>
            <td align="center" colspan="5">
                <input type="button" value="글쓰기" onclick="location.href='BoardWriteForm.jsp'"/>
            </td>
        </tr>
    </table>
</div>

46. BoardInfo 게시글보기

제목을 클릭하면 BoardInfo 게시글을 보자.
getOneBoard() 메소드로 얻어와서 뿌려주자.

46.1 BoardInfo

get으로 넘어온 글 목록을 보는데 get요청 문자열이니 일단 문자열로 받아야한다.

<%
    String num_ = request.getParameter("num");
    int num = Integer.parseInt(num_.trim()); //공백제거후 정수형변환
    //데이터 베이스 접근
    BoardDAO bdao = new BoardDAO();
    //BoardBean 타입으로 하나의 게시글 리턴
    BoardBean bean = bdao.getOneBoard(num);
%>

46.2 BoardDAO

//하나의 게시글을 리턴하는 메소드
public BoardBean getOneBoard(int num) {
    BoardBean bean = new BoardBean();
    getCon();

    try {
        //조회수 증가 쿼리
        String readSql = "UPDATE BOARD SET READCOUNT = READCOUNT+1 WHERE NUM = ?";
        pstmt = con.prepareStatement(readSql);
        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.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;
}

46.3 boardinfo

답글쓰기는 부모글의 ref, restep, relevel, num값을 다 알고가야한다.
get요청을 여러개 넣으면 &로 연결해서 담아준다.

이부분은 num만 받아서 게시글을 받아서 처리해도 상관없다.

<%
    String num_ = request.getParameter("num");
    int num = Integer.parseInt(num_.trim()); //공백제거후 정수형변환
    //데이터 베이스 접근
    BoardDAO bdao = new BoardDAO();
    //BoardBean 타입으로 하나의 게시글 리턴
    BoardBean bean = bdao.getOneBoard(num);
%>

<div align="center">
    <h2>게시글 보기</h2>
    <table border="1">
        <tr height="40">
            <td align="center" width="120px"> 글번호 </td>
            <td align="center" width="180px"> <%=bean.getNum() %> </td>
            <td align="center" width="120px"> 조회수 </td>
            <td align="center" width="180px"> <%=bean.getReadcount() %> </td>
        </tr>

        <tr height="40">
            <td align="center" width="120px"> 작성자 </td>
            <td align="center" width="180px"> <%=bean.getWriter() %> </td>
            <td align="center" width="120px"> 작성일 </td>
            <td align="center" width="180px"> <%=bean.getReg_date() %> </td>
        </tr>

        <tr height="40">
            <td align="center" width="120px"> 이메일 </td>
            <td align="center" colspan="3"> <%=bean.getEmail() %> </td>
        </tr>

        <tr height="40">
            <td align="center" width="120px"> 제목 </td>
            <td align="center" colspan="3"> <%=bean.getSubject() %> </td>
        </tr>

        <tr height="80">
            <td align="center" width="120px"> 글내용 </td>
            <td align="center" colspan="3"> <%=bean.getContent() %> </td>
        </tr>

        <tr height="40">
            <td align="center" colspan="45">
                <input type="button" value="답글쓰기" onclick="location.href='BoradReWriteForm.jsp?num=<%= bean.getNum() %>&ref=<%= bean.getRef()%>&re_step=<%= bean.getRe_step()%>&re_level=<%= bean.getRe_level()%>'"/>
                <input type="button" value="수정하기" onclick="location.href='BoardUpdateForm.jsp?num=<%= bean.getNum() %>'"/>
                <input type="button" value="삭제하기" onclick="location.href='BoardDeleteForm.jsp?num=<%= bean.getNum() %>'"/>
                <input type="button" value="목록보기" onclick="location.href='BoardList.jsp'"/>
            </td>
        </tr>
    </table>
</div>

2023.03.26 후기

con.close();을 rs while문 안에 작성해버림
java.sql.SQLException: Operation not allowed after ResultSet closed
rs가 반복하고 있는데 닫아버리니 문제가 되버렸다.
오류문구를 보고 해결하는 것이 중요하다.