고래씌

[MyBatis] 3-2. 게시판 설정(게시판 상세, 조회수, 댓글, 검색) 본문

Server/MyBatis

[MyBatis] 3-2. 게시판 설정(게시판 상세, 조회수, 댓글, 검색)

고래씌 2023. 12. 24. 22:37

1. 게시판 상세보기/ 조회수 증가

▶ boardDetailVeiw.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<style>
	td>textarea{
		width : 100%;
		height : 100%;
		resize : none;
		box-sizing : border-box;
	}
</style>
<body>
	<jsp:include page="../common/menubar.jsp"/>

	<div class="outer">
		<br>
		<h1 align="center">게시판 상세조회</h1>
		<br>
		<table align="center" border="1">
			<tr>
				<td width='100'>글번호</td>
				<td width='500'>${b.boardNo }</td>
			</tr>
			<tr>
				<td >제목</td>
				<td>${b.boardTitle }</td>
				<!-- BOARD_TITLE -->
			</tr>
			<tr>
				<td>작성자</td>
				<td>${b.userId }</td>
				<!-- BOARD_NO  -->
			</tr>
			<tr>
				<td>조회수</td>
				<td>${b.count }</td>
				<!-- COUNT -->
			</tr>
			<tr>
				<td>작성일</td>
				<td>${b.createDate }</td>
				<!-- CREATE_DATE -->
			</tr>
			<tr>
				<td>내용</td>
				<td height='100'>${b.boardContent }</td>
			</tr>
		</table>
		<br><br>
		
		<c:set var="list" value="${b.list }"/>
		
		<table align="center" border="1">
			<tr>
				<td width="100">댓글작성</td>
				<td width="400"><textarea></textarea></td>
				<td width="100"><button>등록</button></td>
			</tr>
			<tr>
				<td colspan="3"><b>댓글(${list.size()})</b></td>
			</tr>
			<c:forEach var="reply" items="${list}">
				<tr>
					<td>${ reply.replyUserId }</td>
					<td>${ reply.replyContent }</td>
					<td>${ reply.createDate }</td>
				</tr>
			</c:forEach>
		</table>
	</div>


	
</body>
</html>

 
 
▶ boardListView.jsp 에 클릭했을 때 상세 페이지로 넘어갈수 있도록 추가

 
 
 
▶ BoardDetailController.java(servlet)  => 댓글 포함

package com.kh.board.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.kh.board.model.service.BoardService;
import com.kh.board.model.service.BoardServiceImpl;
import com.kh.board.model.vo.Board;

/**
 * Servlet implementation class BoardDetailController
 */
@WebServlet("/detail.bo")
public class BoardDetailController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public BoardDetailController() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		
		int boardNo =  Integer.parseInt(request.getParameter("bno"));
		BoardService service = new BoardServiceImpl(); //인터페이스 = 인터페이스 구현하는 객체 (업캐스팅 발생)
		
		// 1. 조회수 증가 서비스 호출 (UPDATE문이니까 자료형 int)
		int count = service.increaseCount(boardNo);

		
		// 2. 게시글 상세조회서비스 호출 (항상 호출되면 안됨, if절 적용해주기)
		HttpSession session = request.getSession();
		
		if(count>0) {
			//게시글과 댓글 필요
			Board b = service.detailView(boardNo);
			
			// request에 데이터 추가
			// request 스코프에 게시글 저장 후 페이지 전환		
			request.setAttribute("b",b);
			System.out.println(b);
			request.getRequestDispatcher("WEB-INF/views/board/boardDetailView.jsp").forward(request, response);
			
		}else {
			//게시글 상세조회 실패 시 목록 페이지로 리다이렉트
			session.setAttribute("alertMsg", "게시글 상세조회 실패");
			response.sendRedirect("list.bo?currentPage=1");
		}

	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 
 
 
▶ board-mapper.xml
- 조회수 증가 서비스

 
 
- 게시판 상세조회

 
 
 
 
 
▶ BoardService.java

 
 
▶ BoardServiceImpl.java

 
 
 
▶ BoardDao.java

 
 
 


2. 댓글

▶ boardDetailView.jsp

		<c:set var="list" value="${b.list }"/>
		
		<table align="center" border="1">
			<tr>
				<td width="100">댓글작성</td>
				<td width="400"><textarea></textarea></td>
				<td width="100"><button>등록</button></td>
			</tr>
			<tr>
				<td colspan="3"><b>댓글(${list.size()})</b></td>
			</tr>
			<c:forEach var="reply" items="${list}">
				<tr>
					<td>${ reply.replyUserId }</td>
					<td>${ reply.replyContent }</td>
					<td>${ reply.createDate }</td>
				</tr>
			</c:forEach>
		</table>

 

 

▶ Reply.java

package com.kh.board.model.vo;

import java.sql.Date;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data

public class Reply {

	private int replyNo;
	private String replyContent;
	private int refBno;
	private String replyWriter; // 자료형 int -> string
	private Date createDate;
	private String status;
	
	private String replyUserId;
}

 
 
▶ board.java 클래스에 댓글 목록을 저장할 변수 추가

 
 
▶ boarder-mapper.xml
 
- 댓글 불러오기

 

 
 
 
☞  중복되는 값이 있더라도 한행만 실행

=> 이 Collection이 실행되면서 또 별도로 "selectReplyList" 쿼리문이 별도로 실행됨
 
 
 
※ 댓글 List를 담기 위해서 ArrayList<Reply> 객체를 생성
 (javaType="java.util.ArrayList" ofType="reply")
 
=>  selectReplyList쿼리를 수행하기 위해 필요한 파라미터는 현재 resultMap으로 조회된 BOARD_NO 칼럼을 사용
 (select = "selectReplyList" column="BOARD_NO")
 
 
 

 
 


3. 게시글 검색

 
▶ boardListview.jsp 검색기능 설정을 위해 아래와 같이 추가

 
=> condition에 값이 있다면 id가 search-area의 자식 중 option태그들 중 value가 일치하는 요소가 html속성에 직접 접근하기 위해서 selected속성 추가
=> 선택했던 내용이 유지되도록 설정함. ex) 제목 선택했으면 제목이 유지되도록 함
=> 하지만! 이방법은 다른 페이지로 넘어간다면(이동한다면) 내가 제목을 선택했는데 유지가 안된다! 그래서 아래와 같이 또 설정을 추가하여야한다.
 
 
 
- 검색을 한상태이면 search.bo로 이동하고 값이 없다면 list.bo로 이동한다!
값이 없다면 빈문자열로 설정됨
 
boardListView.jsp에 아래와 같이 추가

 
=> 페이지가 이동되어도 내가 선택한 검색이 사라지지 않고 유지할 수 있다.
 
 
 
▶ boardSearchController.java(servlet)

package com.kh.board.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.kh.board.model.service.BoardService;
import com.kh.board.model.service.BoardServiceImpl;
import com.kh.board.model.vo.Board;
import com.kh.common.model.vo.PageInfo;
import com.kh.common.template.Pagination;

/**
 * Servlet implementation class BoardSearchController
 */
@WebServlet("/search.bo") //즐겨찾기 같은걸 할 때(?) 수정할 수 있도록 get방식으로 작업
public class BoardSearchController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public BoardSearchController() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		String condition = request.getParameter("condition"); // "writer", "title", "content"
		String keyword = request.getParameter("keyword"); // "admin" ...
		
		HashMap<String, String> map = new HashMap(); //HashMap<key,value>
		map.put("condition", condition);
		map.put("keyword", keyword);

		BoardService boardService = new BoardServiceImpl();
		
		int searchCount = boardService.selectSearchCount(map); //현재 검색결과에 맞는 게시글의 총 갯수
		int currentPage = Integer.parseInt(request.getParameter("currentPage")); // 현재 페이지
		int pageLimit = 10; 
		int boardLimit = 5; 
		
		PageInfo pi = Pagination.getPageInfo(searchCount, currentPage, pageLimit, boardLimit);
		
		ArrayList<Board> list = boardService.selectSearchList(map, pi);
		
		request.setAttribute("condition", condition);
		request.setAttribute("keyword", keyword);
		
		request.setAttribute("pi", pi);
		request.setAttribute("list", list);
		
		request.getRequestDispatcher("WEB-INF/views/board/boardListView.jsp").forward(request, response);

	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 
 
 
▶ board-mapper.xml
=> 동적 SQL문
condition 나중에 넘겨줄 매개변수값(baordSearchController.java에 있는 condition)
 

 
=> USER_ID와 BOARD_TITLE, BOARD_CONTENT에 모두 동일하게 LIKE '%' || #{keyword} || '%' 들어가기 때문에 아래로 따로 빼준다.
 
=> 키, 밸류값 형태로 넣어줘야하기 때문에 parameterType="hashmap" 설정함 
 
 
 
- 검색결과 카운트

 
 
 
▶ BoardService.java

 
 
 
▶ BoardServiceImpl.java

 
 
- 검색결과 목록을 가져오는 클래스

 
 
 
▶ BoardDao.java

	public int selectSearchCount(SqlSession session, HashMap<String, String> map) {
		return session.selectOne("boardMapper.selectSearchCount", map);
	}
	public ArrayList<Board> selectSearchList(SqlSession session, HashMap<String, String> map, PageInfo pi) {
		
		int limit = pi.getBoardLimit();
		int offset = (pi.getCurrentPage()-1) * limit;
		
		RowBounds rowBounds = new RowBounds(offset, limit);

		// 호출할 sql, 매개변수, rowbounds . 반환형이 list니까 arraylist로 바꿔주기 
		return  (ArrayList) session.selectList("boardMapper.selectSearchList", map , rowBounds);
	}