본문 바로가기
  • 마침표 보다 쉼표를 나타내자
국비교육 [完]/WebMarket

11. 게시판을 만들어 보자

by Y코더 2023. 3. 9.
728x90

원래 로그인 화면이다.

 

로그인을 하면 옆에 게시판 기능이 작동하도록 해보자.

( 나중에 메뉴에서 로그인 되면 로그인 버튼은 없어지도록 해야 겠다 )

 

 

 

위의 모양을 만들려면 아래의 코드처럼 짜면 된다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import= "java.util.List" %>
<%@ page import= "java.util.HashMap"%>
<%@ page import= "java.util.Map"%>
<%@ page import= "model1.board.BoardDAO"%>
<%@ page import= "model1.board.BoardDTO"%>
<%@include file="./signUp/sessionLogin.jsp" %>
<%
   BoardDAO dao = new BoardDAO(application);
   
   Map<String, Object> param = new HashMap<String, Object>();
   String searchField = request.getParameter("searchField");
   String searchWord = request.getParameter("searchWord");
   if(searchWord != null){
      param.put("searchField", searchField);
      param.put("searchWord", searchWord);
   }
   
   int totalCount = dao.selectCount(param);
   List<BoardDTO> boardLists = dao.selectList(param);
   dao.close();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
<script
	src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.3/jquery.min.js"></script>
</head>
<body>
   <jsp:include page="menu.jsp"></jsp:include>
	<%!String greeting = "게시물";%>
	<div class="jumbotron">
		<div class="container">
			<h1 class="display-3">
				<%=greeting%>
			</h1>
		</div>
	</div>

	<div class="container">
		<!-- 검색홈 -->
		<h2 class="h2">목록 보기(List)</h2>
		<form method="get">
			<table class="table">
				<tr>
					<td align="center"><select name="searchField">
							<option value="title">제목</option>
							<option value="submit">내용</option>
					</select> <input type="text" name="searchWord"> <input type="submit"
						value="검색하기" class="btn btn-primary"></td>
				</tr>
			</table>
		</form>
		<!-- 게시물 목록 테이블 (표) -->
		<table class="table">
			<tr>
				<th width="10%">번호</th>
				<th width="50%">제목</th>
				<th width="15%">작성자</th>
				<th width="10%">조회수</th>
				<th width="15%">작성일</th>
			</tr>
			<!-- 목폭의 내용 -->
			<%
				if (boardLists.isEmpty()) {
			%>
			<tr>
				<td colspan="5" align="center">등록된 게시물이 없습니다^^*.</td>
			</tr>
			<%
				} else {
			int virtualNum = 0;
			for (BoardDTO dto : boardLists) {
				virtualNum = totalCount--;
			%>
			<tr align="center">
				<td><%=virtualNum%></td>
				<td align="left"><a href="View.jsp?num=<%=dto.getNum()%>"><%=dto.getTitle()%></a></td>
				<td align="center"><%=dto.getId()%></td>
				<td align="center"><%=dto.getVisitcount()%></td>
				<td align="center"><%=dto.getPostdate()%></td>
			</tr>
			<%
				}
			}
			%>
		</table>
		<!-- 목록 하단의 [글쓰기] 버튼 -->
		<table class="table">
			<tr align="right">
				<td>
					<button type="button" class="btn btn-primary"
						onclick="location.href='Write.jsp';">글쓰기</button>
				</td>
			</tr>
		</table>
	</div>
</body>
</html>

 

 

이 역시 DTO와 DAO가 필요하다.

 

아래는 DTO 이다.

package model1.board;

public class BoardDTO {
	
	private String num;
	private String title;
	private String content;
	private String id;
	private java.sql.Date postdate;
	private String visitcount;
	private String name;
	
	public String getNum() {
		return num;
	}
	public void setNum(String num) {
		this.num = num;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public java.sql.Date getPostdate() {
		return postdate;
	}
	public void setPostdate(java.sql.Date postdate) {
		this.postdate = postdate;
	}
	public String getVisitcount() {
		return visitcount;
	}
	public void setVisitcount(String visitcount) {
		this.visitcount = visitcount;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

 

 

아래는 DAO이다.

package model1.board;

import javax.servlet.ServletContext;
import common.JDBConnect;
import java.util.List;
import java.util.Map;
import java.util.Vector;

public class BoardDAO extends JDBConnect{
   
   public BoardDAO(ServletContext application) {
      super(application);   
   }
   
   public int selectCount(Map<String, Object> map) {

      int totalCount = 0;
      
      
      String query = "SELECT COUNT(*) FROM board";
      
      // 스테트먼트 보낼 변수 query 스트링 타입으로
      
      if(map.get("searchWord") != null) {
      //만약에 맵에 딸려온 값이 있으면(!=null)쿼리문을 추가시켜준다.
         query += " WHERE " + map.get("searchField") + " "
               + "LIKE '%" + map.get("searchWord") + "%'";
      }
      
      try {
         stmt = con.createStatement();
         rs = stmt.executeQuery(query);
         rs.next();
         totalCount = rs.getInt(1);
      }
      catch (Exception e) {
         System.out.println("게시물 수를 구하는 중 예외 발생");
         e.printStackTrace();
      }
      
      return totalCount;
   }
   
   public List<BoardDTO> selectList(Map<String, Object> map){
      List<BoardDTO> bbs = new Vector<BoardDTO>();
      
      String query = "SELECT * FROM board"; 
      if(map.get("searchWord") != null ) {
         query += " WHERE " + map.get("searchField") + " " 
               + " LIKE '%" + map.get("searchWord") + "%' ";
      }
      //searchWord searchField는 키값으로 맵에 공간 만들어서 계속 꺼내서 사용하는거고 
      //jsp에서 입력 받은 값을 워드 필드 각각 키에 해당하는 공간에 value로 저장, 
      //DAO에서 map.get(키값)으로 해당 공간에 있던 벨류 꺼내서 쿼리에 넣어서 사용
   
      query += " ORDER BY num DESC ";
      
      try {
         stmt = con.createStatement();
         rs = stmt.executeQuery(query);
         
         while(rs.next()) {
            BoardDTO dto = new BoardDTO();
            
            dto.setNum(rs.getString("num"));
            dto.setTitle(rs.getString("title"));
            dto.setContent(rs.getString("content"));
            dto.setPostdate(rs.getDate("postdate"));
            dto.setId(rs.getString("id"));
            dto.setVisitcount(rs.getString("visitcount"));
            
            bbs.add(dto);
         }
      }catch (Exception e) {
         System.out.println("게시물 조회 중 예외 발생");
         e.printStackTrace();
      }
      return bbs;
   }
  
}

( DAO 출처 : 선영 누나 )

를 넣어서 작동을 확인한다.

 

이 역시 게시판도 로그인을 해야 쓸수 있는 기능이므로

페이지에

<%@include file="./signUp/sessionLogin.jsp" %>

를 입력하여 페이지 접근을 막는다.

 

 

이제부터 모든 코드들은 노션에 개인 저장 할 것이다.

코드 전체를 올리는 식의 공부는 좋지 않은 듯 하다.

간단한 거라도 직접 만들어 봐야겠다고 다짐 했다.

728x90

'국비교육 [完] > WebMarket' 카테고리의 다른 글

프로젝트 배너  (0) 2023.05.11
10. 로그아웃  (0) 2023.03.09
9. 상품 페이지 데이터 베이스  (0) 2023.03.09
8. 로그인이 안되어 있으면 로그인 창으로  (0) 2023.03.09
7. 로그인 유지 기능  (0) 2023.03.09