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가 반복하고 있는데 닫아버리니 문제가 되버렸다.
오류문구를 보고 해결하는 것이 중요하다.
'기초단계 > JSP&Servlet' 카테고리의 다른 글
| 2023.03.28 JSP (0) | 2023.03.29 |
|---|---|
| 2023.03.27 JSP (0) | 2023.03.27 |
| 2023.03.25 JSP (0) | 2023.03.26 |
| 2023.03.23 JSP (0) | 2023.03.23 |
| 2023.03.22 JSP (0) | 2023.03.22 |