고래씌
[MyBatis] 3-2. 게시판 설정(게시판 상세, 조회수, 댓글, 검색) 본문
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);
}

'Server > MyBatis' 카테고리의 다른 글
[MyBatis] 형상관리 (개인정보가 있으므로 비공개 설정) (0) | 2023.12.24 |
---|---|
[MyBatis] 3-1. 게시판 설정(페이징 설정) (0) | 2023.12.24 |
[MyBatis] 2. 암호화 설정 (0) | 2023.12.24 |
[MyBatis] 1-3. 회원가입 만들기 (0) | 2023.12.20 |
[MyBatis] 1-2. 로그인 기능 (0) | 2023.12.19 |