본 게시물은 아래 링크를 정리한 내용입니다.
1. boardMapper.xml에서 listPage와 listCount 수정 및 동적 쿼리 sql문 추가
<select id="listPage" resultType="kr.co.vo.BoardVO" parameterType="kr.co.vo.SearchCriteria">
SELECT BNO,
TITLE,
CONTENT,
WRITER,
REGDATE
FROM (
SELECT BNO,
TITLE,
CONTENT,
WRITER,
REGDATE,
ROW_NUMBER() OVER(ORDER BY BNO DESC) AS RNUM
FROM MP_BOARD
WHERE 1=1
<include refid="search"></include>
) MP
WHERE RNUM BETWEEN #{rowStart} AND #{rowEnd}
ORDER BY BNO DESC
</select>
<select id="listCount" parameterType="kr.co.vo.SearchCriteria" resultType="int">
SELECT COUNT(BNO)
FROM MP_BOARD
WHERE 1=1
<include refid="search"></include>
AND BNO > 0
</select>
<sql id="search">
<if test="searchType != null">
<if test="searchType == 't'.toString()">AND TITLE LIKE '%' || #{keyword} || '%'</if>
<if test="searchType == 'c'.toString()">AND CONTENT LIKE '%' || #{keyword} || '%'</if>
<if test="searchType == 'w'.toString()">AND WRITER LIKE '%' || #{keyword} || '%'</if>
<if test="searchType == 'tc'.toString()">AND (TITLE LIKE '%' || #{keyword} || '%') or (CONTENT LIKE '%' || #{keyword} || '%')</if>
</if>
</sql>
2. vo 폴더에 SearchCriteria.java 생성 및 아래 코드 작성
package kr.co.vo;
public class SearchCriteria extends Criteria{
private String searchType = "";
private String keyword = "";
public String getSearchType() {
return searchType;
}
public void setSearchType(String searchType) {
this.searchType = searchType;
}
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
@Override
public String toString() {
return "SearchCriteria [searchType=" + searchType + ", keyword=" + keyword + "]";
}
}
3. PageMaker.java 파일에 아래 코드 추가
makeSearch는 page, perPageNum, searchType, keyword를 url로 사용할 수 있게 해주는 함수
public String makeSearch(int page)
{
UriComponents uriComponents =
UriComponentsBuilder.newInstance()
.queryParam("page", page)
.queryParam("perPageNum", cri.getPerPageNum())
.queryParam("searchType", ((SearchCriteria)cri).getSearchType())
.queryParam("keyword", encoding(((SearchCriteria)cri).getKeyword()))
.build();
return uriComponents.toUriString();
}
private String encoding(String keyword) {
if(keyword == null || keyword.trim().length() == 0) {
return "";
}
try {
return URLEncoder.encode(keyword, "UTF-8");
} catch(UnsupportedEncodingException e) {
return "";
}
}
4. BoardDAO.java, BoardDAOImpl.java, BoardService.java, BoardServiceImpl.java 수정
1) BoardDAO.java
//게시물 목록 조회
public List<BoardVO> list(SearchCriteria scri) throws Exception;
//게시물 총 갯수
public int listCount(SearchCriteria scri) throws Exception;
2) BoardDAOImpl.java
//게시물 목록 조회
@Override
public List<BoardVO> list(SearchCriteria scri) throws Exception{
return sqlSession.selectList("boardMapper.listPage",scri);
}
//게시물 총 갯수
@Override
public int listCount(SearchCriteria scri) throws Exception{
return sqlSession.selectOne("boardMapper.listCount",scri);
}
3) BoardService.java
// 게시물 목록 조회
public List<BoardVO> list(SearchCriteria scri) throws Exception;
// 게시물 총 갯수
public int listCount(SearchCriteria scri) throws Exception;
4) BoardServiceImpl.java
//게시물 목록 조회
@Override
public List<BoardVO> list(SearchCriteria scri) throws Exception{
return dao.list(scri);
}
//게시물 총 갯수
@Override
public int listCount(SearchCriteria scri) throws Exception{
return dao.listCount(scri);
}
5. BoardController.java에서 list 수정
// 게시판 목록 조회
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String list(Model model, @ModelAttribute("scri") SearchCriteria scri) throws Exception{
logger.info("list");
model.addAttribute("list", service.list(scri));
PageMaker pageMaker = new PageMaker();
pageMaker.setCri(scri);
pageMaker.setTotalCount(service.listCount(scri));
model.addAttribute("pageMaker", pageMaker);
return "board/list";
}
6. list.jsp 수정 및 추가
1) <form> 태그 안의 method를 post가 아닌 get으로 수정
2) <head> 태그 안의 <title> 태그 위에 아래 코드 추가
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
3) 아래 코드 추가
<div class="search">
<select name="searchType">
<option value="n"<c:out value="${scri.searchType == null ? 'selected' : ''}"/>>-----</option>
<option value="t"<c:out value="${scri.searchType eq 't' ? 'selected' : ''}"/>>제목</option>
<option value="c"<c:out value="${scri.searchType eq 'c' ? 'selected' : ''}"/>>내용</option>
<option value="w"<c:out value="${scri.searchType eq 'w' ? 'selected' : ''}"/>>작성자</option>
<option value="tc"<c:out value="${scri.searchType eq 'tc' ? 'selected' : ''}"/>>제목+내용</option>
</select>
<input type="text" name="keyword" id="keywordInput" value="${scri.keyword}"/>
<button id="searchBtn" type="button">검색</button>
<script>
$(function(){
$('#searchBtn').click(function() {
self.location = "list" + '${pageMaker.makeQuery(1)}' + "&searchType=" + $("select option:selected").val() + "&keyword=" + encodeURIComponent($('#keywordInput').val());
});
});
</script>
</div>
4) 아래 코드처럼 수정 makeQuery를 makeSearch로 수정
<ul>
<c:if test="${pageMaker.prev}">
<li><a href="list${pageMaker.makeSearch(pageMaker.startPage - 1)}">이전</a></li>
</c:if>
<c:forEach begin="${pageMaker.startPage}" end="${pageMaker.endPage}" var="idx">
<li><a href="list${pageMaker.makeSearch(idx)}">${idx}</a></li>
</c:forEach>
<c:if test="${pageMaker.next && pageMaker.endPage > 0}">
<li><a href="list${pageMaker.makeSearch(pageMaker.endPage + 1)}">다음</a></li>
</c:if>
</ul>
7. 확인하기
1) 서버 실행 및 localhost:8080/board/list 접속
2) 아래와 같이 생성됐는지 확인
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] CORS 에러 (0) | 2022.03.16 |
---|---|
[Spring / DB] 로그인 주의 (0) | 2022.02.23 |
[게시판] 9. 페이징 구현 (0) | 2021.12.16 |
[게시판] 8. 게시판 다듬기 및 벨리데이션 체크 (0) | 2021.12.16 |
[게시판] 7. 게시판 글 수정 및 삭제 (0) | 2021.12.14 |