** 이전에 JSP로 만들었던 코드를 이용해 이를 서블릿으로 구현해보았다.
[JSP] 12강 - 상세 페이지 구현 + 특수 문자 처리
본 포스팅은 정보 제공용이 아닌 유튜브 동빈나님의 JSP 게시판 만들기 강좌 12강을 바탕으로 보고 배운 것을 직접 정리해본 포스트 입니다. ** 아마 상세 페이지가 가장 쉽지 않나 싶다. 특수 문
egu99.tistory.com
JSP 때에 비해 이번에는 예외처리를 생각해보고 코드를 추가했다.
view는 먼저 이용불가, 즉 bbsAvailable이 0인 게시글은 열람할 수 없게 해야한다.
하지만 기존에는 url에 쿼리스트링으로 접근하면 열람이 가능했는데 새로운 메서드를 만들어 이를 불가능하게 만들었다.
또 등록되지 않은 글의 bbsID값으로 접근시에도 돌려보내야하며, bbsID값이 넘어오지 않았을 때도 돌려보내야한다.
JSP에서 로그인시 수정, 삭제가 보이게 하는 것을 JSTL로 구현하였다.
** ViewControl.java
@WebServlet("/view")
public class ViewControl extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//기본값
int bbsID = 0;
if(request.getParameter("bbsID") != null) {
bbsID = Integer.parseInt(request.getParameter("bbsID"));
}
BbsDAO bao = new BbsDAO();
//해당 게시글이 이용가능인지 아닌지 확인하는 메서드.
int available = bao.getBbsAvailable(bbsID);
//안 넘어왔을 때 혹은 이용불가 게시글일 때.
if(bbsID == 0 || available == 0) {
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('유효하지 않은 글입니다.')");
script.println("location.href = 'bbs'");
script.println("</script>");
}else{
//해당 게시물을 가져오는 메서드.
Bbs bbs = bao.getBbs(bbsID);
request.setAttribute("b", bbs);
request.getRequestDispatcher("/WEB-INF/view.jsp").forward(request, response);
}
}
}
- 게시판에서 제목을 눌렀을 때 bbsID를 가지고 이쪽으로 넘어온다.
- bbsID의 기본값은 0이다. -> 0일 때는 유효한 글이 아니므로 강제 이동 시킨다.
- BbsDAO의 bbsAvailable()로 해당 게시물의 상태값(이용가능은 1, 불가능은 0)을 반환한다.
- 반환된 값이 0이라면 이용불가로 유효하지 않은 글이므로 강제이동 시킨다.
- 유효한 글이라면 BbsDAO의 getBbs()로 게시물을 가져온다.
- 가져온 객체를 b라는 이름으로 담아 forward 해준다.
** BbsDAO - getBbsAvailable()
//게시물 상태를 확인하는 메서드
public int getBbsAvailable(int bbsID) {
String sql = "SELECT bbsAvailable FROM BBS WHERE bbsID = ?";
try {
PreparedStatement pst = conn.prepareStatement(sql);
pst.setInt(1, bbsID);
rs = pst.executeQuery();
if (rs.next()) {
return rs.getInt("bbsAvailable");
}
return 0;
} catch (Exception e) {
e.printStackTrace();
}
return -1;
}
- bbsID를 인자로 해당 게시글의 bbsAvailable값을 반환해주는 메서드를 추가했다.
- 조회가 불가능한 bbsID값이라면 0을 반환, 데이터베이스 오류면 -1을 반환하도록 해주었다.
** BbsDAO - getBbs()
//게시물 가져오기
public Bbs getBbs(int bbsID){
String sql = "SELECT * FROM BBS WHERE bbsID = ?";
try {
PreparedStatement pst = conn.prepareStatement(sql);
pst.setInt(1, bbsID);
rs = pst.executeQuery();
if(rs.next()) {
Bbs bbs = new Bbs();
bbs.setBbsID(rs.getInt(1));
bbs.setBbsTitle(rs.getString(2));
bbs.setUserID(rs.getString(3));
bbs.setBbsDate(rs.getString(4));
bbs.setBbsContent(rs.getString(5));
bbs.setBbsAvailable(rs.getInt(rs.getInt(6)));
return bbs;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
- 받은 bbsID로 해당 게시글의 정보를 가져온다.
- VO인 Bbs에 담아서 이를 반환 시켜주는 메서드이다.
** view.jsp
<!-- 상세 페이지 -->
<div class="container">
<div class="row">
<table class = "table table-striped" style="text-align : center; border: 1px solid #dddddd">
<thead>
<tr>
<th colspan="3" style="background-color:#eeeeee; text-align: center;"> 게시판 글 보기</th>
</tr>
</thead>
<tbody>
<tr>
<td style="width: 20%;"> 글 제목 </td>
<td colspan="2">${b.bbsTitle }</td>
</tr>
<tr>
<td>작성자 </td>
<td colspan="2">${b.userID }</td>
</tr>
<tr>
<td> 날짜 </td>
<fmt:parseDate var="bDate" value="${b.bbsDate }" pattern="yyyy-MM-dd"/>
<fmt:formatDate value="${bDate}" var="date" pattern="yyyy.MM.dd" />
<td colspan="2">${date }</td>
</tr>
<tr>
<td> 내용 </td>
<td colspan="2" style="min-height: 200px; text-align:left;"><e:out value="${b.bbsContent }" escapeXml="false"/></td>
</tr>
</tbody>
</table>
<a href="bbs.jsp" class="btn btn-primary">글 목록</a>
<e:if test="${b.userID == sessionScope.userID }">
<a href="update?bbsID=${b.bbsID }" class="btn btn-info">수정</a>
<a onclick="return confirm('정말 삭제하시겠습니까?')" href="delete?bbsID=${b.bbsID }" class="btn btn-danger">삭제</a>
</e:if>
<a href="write" class="btn btn-primary pull-right">글쓰기</a>
</div>
</div>
- VO가 b라는 이름으로 request에 담아져서 왔으므로 b의 멤버변수들을 하나하나 배치한다.
- 게시글의 작성자가 session의 userID와 같은 경우, 즉 글쓴이의 경우 수정과 삭제 버튼이 보이도록 JSTL을 이용해 조건처리 한다.
'웹 개발 한걸음' 카테고리의 다른 글
[Servlet] 게시물 삭제 구현하기 (0) | 2021.04.05 |
---|---|
[Servlet] 게시물 수정 구현하기 (0) | 2021.04.05 |
[Servlet] JSTL의 조건문으로 HTML 조건처리 하기 (수정) (0) | 2021.03.30 |
[Web] Forward와 Redirect 차이점을 알아보자 (0) | 2021.03.30 |
[Servlet] 글쓰기 구현하기(수정) (0) | 2021.03.30 |