반응형

2020/01/20 - [JSP 게시판 만들기] - JSP 게시판 만들기 #11 게시판 글 목록 구현하기(페이지 처리)

 

JSP 게시판 만들기 #11 게시판 글 목록 구현하기(페이지 처리)

2020/01/17 - [JSP 게시판 만들기] - JSP 게시판 만들기 #10 글쓰기 기능 구현하기 JSP 게시판 만들기 #10 글쓰기 기능 구현하기 2020/01/17 - [JSP 게시판 만들기] - JSP 게시판 만들기 #9 게시판 데이터베이스..

windorsky.tistory.com

이어서 이번에는 게시판 글 보기를 구현해 보겠습니다.

package bbs;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class BbsDAO {
	private Connection conn;
	private ResultSet rs;

	public BbsDAO() {
		try {
			String dbURL = "jdbc:mysql://localhost:3306/BBS?serverTimezone=UTC";
			String dbID = "root";
			String dbPassword = "root";
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(dbURL, dbID, dbPassword);

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

	}

	// 게시판 글쓰기를 위해선 총 3개의 함수가 필요합니다.
	// 현재의 시간을 가져오는 함수, 게시판에 글을 쓸때 현재 서버의 시간을 표시해주는 역할
	public String getDate() {
		String SQL = "SELECT NOW()";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				return rs.getString(1);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ""; // 데이터 베이스 오류

	}

	public int getNext() {
		String SQL = "SELECT bbsID FROM BBS ORDER BY bbsID DESC";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				return rs.getInt(1) + 1;
			}
			return 1; // 첫번째 게시물인 경우
		} catch (Exception e) {
			e.printStackTrace();
		}
		return -1; // 데이터베이스 오류인 경우
	}

	public int write(String bbsTitle, String userID, String bbsContent) {
		String SQL = "INSERT INTO BBS VALUES(?, ?, ?, ?, ?, ?)";

		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			// 1번은 게시물 번호여야 하니까 getNext()를 사용합니다.
			pstmt.setInt(1, getNext());
			pstmt.setString(2, bbsTitle);
			pstmt.setString(3, userID);
			pstmt.setString(4, getDate());
			pstmt.setString(5, bbsContent);
			pstmt.setInt(6, 1);
			return pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return -1; // 데이터 베이스 오류
	}

	// 글 목록창 불러오는 함수
	public ArrayList<Bbs> getList(int pageNumber) {
		// 특정한 숫자보다 작고 삭제가 되지 않아서 AVAILABLE이 1인 글만 가져오고 위에서 10개의 글까지만 가져오고 글 번호를 내림차순 하는 쿼리문입니다.
		String SQL = "SELECT * FROM BBS WHERE bbsID < ? and bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";
		// Bbs클래스에서 나오는 인스턴스를 보관하는 리스트를 하나 만듭니다.
		ArrayList<Bbs> list = new ArrayList<Bbs>();
		
		
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			// 글 출력 개수
			pstmt.setInt(1, getNext() - (pageNumber -1) * 10);
			rs = pstmt.executeQuery();
			
			
			while (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(6));
				list.add(bbs);
				
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}
	//10개 밖에 없다면 다음 페이지가 없다는걸 알려주는 거에요. 페이지 처리를 위해서 존재하는 함수에요
	public boolean nextPage(int pageNumber) {
		// 특정한 숫자보다 작고 삭제가 되지 않아서 AVAILABLE이 1인 글만 가져오고 위에서 10개의 글까지만 가져오고 글 번호를 내림차순 하는 쿼리문입니다.
				String SQL = "SELECT * FROM BBS WHERE bbsID < ? and bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";
				// Bbs클래스에서 나오는 인스턴스를 보관하는 리스트를 하나 만듭니다.
				ArrayList<Bbs> list = new ArrayList<Bbs>();
				try {
					PreparedStatement pstmt = conn.prepareStatement(SQL);
					// 글 출력 개수
					pstmt.setInt(1, getNext() - (pageNumber -1) * 10);
					rs = pstmt.executeQuery();
					//결과가 하나라도 존재하면 다음페이지로 넘어갈 수 있다고 알려주고
					if (rs.next()) {
						return true;						
					}
					
				} catch (Exception e) {
					e.printStackTrace();
				}
				//아니라면 false
				return false;
	}
	//글 내용을 불러오는 함수
	public Bbs getBbs(int bbsID) {
		//특정 게시글 번호에 모든 정보를 가져오는 쿼리문입니다.
		String SQL = "SELECT * FROM BBS WHERE bbsID =?";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1,  bbsID);
			rs = pstmt.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(6));
				return bbs;
				
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		//정보가 없으면 null값을 반환
		return null;
	}
}

우선 BbsDAO로 이동한 후에 

추가 시켜 줍니다.

특정 게시글 번호를 통해 모든 정보를 가져오는 쿼리문을 작성하고

글에 대한 정보를 생성한 bbs에 담도록 해줍니다

그리고 함수를 호출한 곳으로 bbs 정보를 넘겨주고 만약 정보가 없으면 null값을 넘겨줍니다.

 

이제 view.jsp파일을 만들도록 해줍니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="java.io.PrintWriter"%>
<%@ page import="bbs.Bbs" %>
<%@ page import="bbs.BbsDAO" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width" , initial-scale="1">
<link rel="stylesheet" href="css/bootstrap.css">
<title>Rodin login</title>
</head>
<body>
	<!--  로그인이 된 사람은 로그인정보를 담을 수 있도록 만들어 주겠습니다. -->
	<%
		String userID = null;
		if (session.getAttribute("userID") != null) {
			userID = (String) session.getAttribute("userID");
		}
		
		int bbsID =0;
		if (request.getParameter("bbsID") != null){
			bbsID = Integer.parseInt(request.getParameter("bbsID"));
		}
		if (bbsID ==0){
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('유효하지 않은 글입니다.')");
			script.println("location.href='bbs.jsp'");
			script.println("</script>");
		}
		//해당 글의 구체적인 내용을 가져오겠습니다. 유효한 글이라면 bbs에 담도록 하겠습니다.
		Bbs bbs = new BbsDAO().getBbs(bbsID);
		
		
	%>
	<nav class="navbar navbar-default">
		<div class="navbar-header">
			<button type="button" class="navbar-toggle collapsed"
				data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
				aria-expanded="false">
				<span class="icon-bar"></span> <span class="icon-bar"></span> <span
					class="icon-bar"></span>
			</button>
			<a class="navbar-brand" href="main.jsp">Rodin Web Site</a>
		</div>
		<div class="collapse navbar-collapse"
			id="bs-example-navbar-collapse-1">
			<ul class="nav navbar-nav">
				<li><a href="main.jsp">메인</a></li>
				<li><a href="font.jsp">포스터 분석</a></li>
				<li><a href="posterCategory.jsp">포스터 카테고리</a></li>
				<li><a href="analisys.jsp">통계</a></li>
				<li class="active"><a href="bbs.jsp">게시판</a></li>
			</ul>

			<%
				//로그인이 되어 있지 않다면
				if (userID == null) {
			%>
			<ul class="nav navbar-nav navbar-right">
				<li class="dropdown"><a href="#" class="dropdown-toggle"
					role="button" aria-haspopup="true" data-toggle="dropdown"
					aria-expanded="false">접속하기<span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="login.jsp">로그인</a></li>
						<li><a href="join.jsp">회원가입</a></li>
					</ul></li>
			</ul>
			<%
				} else {
			%>
			<ul class="nav navbar-nav navbar-right">
				<li class="dropdown"><a href="#" class="dropdown-toggle"
					role="button" aria-haspopup="true" data-toggle="dropdown"
					aria-expanded="false">회원관리<span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="logoutAction.jsp">로그아웃</a></li>
					</ul></li>
			</ul>
			<%
				}
			%>

		</div>
	</nav>

	<div class="container">
		<div class="row">
			
				<!--  홀수와 짝수로 색상이 변경됨 -->
				<table class="table table-striped"
					style="text-align: center; border: 1px solid #dddddd">
					<!-- thead : 테이블의 제목부분 각각의 속성들을 알려주는 역할을 합니다. -->
					<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"><%= bbs.getBbsTitle().replaceAll(" ","&nbsp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\n","<br>") %>
						</tr>
						<tr>
							<td>작성자</td>
							<td colspan="2"><%=bbs.getUserID() %></td>
						</tr>
						<tr>
							<td>작성일자</td>
							<td><%=bbs.getBbsDate().substring(0,11) + bbs.getBbsDate().substring(11,13)+"시"+bbs.getBbsDate().substring(14, 16)+"분" %></td>
						</tr>
						<tr>
							<td>내용</td>
							<td colspan="2" style="min-height: 200px; text-align: left;">
							<!-- 글 내용에서 특수 문자를 보여주기 위한 추가 코딩 -->
							<%= bbs.getBbsContent().replaceAll(" ","&nbsp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\n","<br>") %></td>
						</tr>

					</tbody>
					
				</table>
				<a href="bbs.jsp" class="btn btn-primary">목록</a>
				<%
					if(userID != null && userID.equals(bbs.getUserID())){
				%>
					<a href="update.jsp?bbsID=<%= bbsID %>" class="btn btn-primary">수정</a>
					<a href="deleteAction.jsp?bbsID=<%= bbsID %>" class="btn btn-primary">삭제</a>
				<% 
					}
				%>
		</div>
	</div>

	<script src="https://code.jquery.com/jquery-1.11.3.js"
		integrity="sha256-IGWuzKD7mwVnNY01LtXxq3L84Tm/RJtNCYBfXZw3Je0="
		crossorigin="anonymous"></script>
	<script
		src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
		integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
		crossorigin="anonymous"></script>
</body>
</html>

 

저희가 필요한 페이지를 넣어주겠습니다.

bbs.Bbs를 넣어주고 bbs.BbsDAO도 넣어주도록 하겠습니다.

bbsID를 0으로 설정하고

파라미터를 통해 bbsID를 받아 오면 Interger형태로 bbsID를 넣어줍니다.

만약 bbsID가 0이라면 존재하지 않는 글이겠죠? 0이 아니라면 가져온 정보를 bbs에 넣어주도록 하겠습니다.

글 제목, 작성자, 작성일자, 내용을 다 받아오고 .replaceAll("","")은  글 내용이나 제목에 <script>나 특수 기호를 쓰면 우리 제대로 출력이 되지 않기 때문에 저런식으로 표현이 될 수 있도록 바꾸어주었습니다.

 

목록으로 돌아갈 수 있또록 bbs.jsp로 갈 수 있도록 버튼도 하나 만들어주고

해당글의 작성자가 본인 이라면 수정, 삭제가 가능하도록 버튼도 만들어 주었습니다.

만약 본인이 아니라면

수정과 삭제가 나타나지 않습니다.

 

다음 글에서는 수정과 삭제기능을 구현해 보도록 하겠습니다.

반응형
블로그 이미지

꽃꽂이하는개발자

,