본문 바로가기

웹 개발 한걸음

[Servlet] 상세 페이지 구현하기

** 이전에 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을 이용해 조건처리 한다.