반응형
실습 코드 참조
moonhy7/SpringFramework: Spring Framework 실습 코드 정리 (github.com)
1. 페이징 처리를 위한 클래스 생성 및 화면 구현
1. PageVO 클래스 생성 ( _81_BoardWeb_Spring_MVC_Paging )
package com.springbook.biz.board;
public class PageVO {
private int startPage;
private int endPage;
private boolean prev, next;
private int total;
//현재 페이지 번호, 한 페이지에 표출할 데이터 개수
private Criteria cri;
public PageVO(Criteria cri, int total) {
this.cri = cri;
this.total = total;
//시작페이지, 마지막페이지 계산
this.endPage = (int)(Math.ceil(cri.getPageNum() / 10.0)) * 10;
this.startPage = this.endPage -9;
int realEnd = (int) (Math.ceil(total * 1.0) / cri.getAmount());
if(realEnd < this.endPage) {
this.endPage = realEnd;
}
//이전, 다음 버튼 표출 여부 결정
this.prev = this.startPage > 1;
this.next = this.endPage < realEnd;
}
public int getStartPage() {
return startPage;
}
public int getEndPage() {
return endPage;
}
public boolean isPrev() {
return prev;
}
public boolean isNext() {
return next;
}
public int getTotal() {
return total;
}
public Criteria getCri() {
return cri;
}
@Override
public String toString() {
return "PageVO [startPage=" + startPage + ", endPage=" + endPage + ", prev=" + prev + ", next=" + next
+ ", total=" + total + "]";
}
}
2. Criteria 클래스 생성
package com.springbook.biz.board;
public class Criteria {
private int pageNum;
private int amount;
private int startNum;
public Criteria() {
//객체 생성시 기본 생성자를 호출하여 매개변수를 줘서 매개변수를 가지고 있는 생성자 함수 호출
this(1, 10); //생성자에서 pageNum=1, amount=10으로 설정
}
// 기본 생성자 설정
public Criteria(int pageNum, int amount) {
this.pageNum = pageNum;
this.amount = amount;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public int getStartNum() {
return startNum;
}
public void setStartNum(int startNum) {
this.startNum = startNum;
}
@Override
public String toString() {
return "Criteria [pageNum=" + pageNum + ", amount=" + amount + "]";
}
}
3. BoardController.java
@RequestMapping(value="/getBoardList.do")
//@RequestParam : Command 객체인 VO에 매핑값이 없는 사용자 입력정보는 직접 받아서 처리
// value = 화면으로부터 전달된 파라미터 이름(jsp의 input의 name속성 값)
// required = 생략 가능 여부
public String getBoardList(BoardVO vo, Model model, Criteria cri) {
System.out.println("글 목록 검색 처리");
//Null check
//로그인 화면에서 로그인성공 시 getBoardList.do 호출 할 때 searchKeyword, searchCondition 값의 null 방지
if(vo.getSearchCondition() == null) {
vo.setSearchCondition("TITLE");
}
if(vo.getSearchKeyword() == null) {
vo.setSearchKeyword("");
}
model.addAttribute("boardList", boardService.getBoardList(vo));
model.addAttribute("pageMaker", new PageVO(cri, 123));
return "getBoardList.jsp";
}
4. getBoardList.jsp
- Previous, Next 버튼 추가
<div>
<ul class="pagination">
<c:if test="${pageMaker.prev }">
<li class="pagination_button">
<a href="#">Previous</a>
</li>
</c:if>
<c:forEach var="num" begin="${pageMaker.startPage }" end="${pageMaker.endPage }">
<li class="pagination_button">
<a href="#">${num }</a>
</li>
</c:forEach>
<c:if test="${pageMaker.next }">
<li class="pagination_button">
<a href="#">Next</a>
</li>
</c:if>
</ul>
</div>
- 스타일 태그 추가
<style>
ul {
list-style: none;
width : 30%;
display: inline-block;
}
li {
float: left;
margin-left : 5px;
}
</style>
</head>
5. 실행 화면
2. 데이터베이스 처리 및 기능 구현
1. BoardController
- getBoardList() 메소드에 Criteria 매개변수 추가해줄것
public String getBoardList(BoardVO vo, Model model, Criteria cri) {
System.out.println("글 목록 검색 처리");
...
}
2. BoardService 클래스와 BoardServiceImpl 클래스
- 마찬가지로 getBoardList() 메소드에 Criteria 매개변수 추가해줄것
//글 목록 조회
List<BoardVO> getBoardList(BoardVO vo, Criteria cri);
public List<BoardVO> getBoardList(BoardVO vo, Criteria cri) {
return boardDAO.getBoardList(vo, cri);
}
3. BoardServiceClient 클래스는 삭제해준다. (사용X)
4. BoardDAOMybatis 코드 수정
public List<BoardVO> getBoardList(BoardVO vo, Criteria cri) {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("board", vo);
cri.setStartNum((cri.getPageNum() - 1) * cri.getAmount());
paramMap.put("criteria", cri);
System.out.println("====> Mybatis로 getBoardList() 기능 처리");
return mybatis.selectList("BoardDAO.getBoardList", paramMap);
}
5. board-mapping.xml 파일에 쿼리 수정
- ORACLE 쿼리
<!-- ORACLE -->
<select id="getBoardList" parameterMap="HashMap" resultMap="boardResult">
<![CDATA[
SELECT * FROM
(
SELECT ROWNUM RN, * FROM BOARD
WHERE 1=1
AND ROWNUM <+ #{criteria.pageNum} * #{criteria.amount}
]]>
<if test="board.searchCondition == 'TITLE'">
AND TITLE LIKE CONCAT_WS('%', #{searchKeyword}, '%')
</if>
<if test="board.searchCondition == 'CONTENT'">
AND TITLE LIKE CONCAT_WS('%', #{searchKeyword}, '%')
</if>
<![CDATA[
)
WHERE RN > (#{criteria.pageNum} - 1) * #{criteria.amount}
]]>
</select>
- MySQL 쿼리
<!-- MySQL -->
<select id="getBoardList" parameterMap="HashMap" resultMap="boardResult">
SELECT * FROM BOARD
WHERE 1=1
<if test="board.searchCondition == 'TITLE'">
AND TITLE LIKE CONCAT_WS('%', #{searchKeyword}, '%')
</if>
<if test="board.searchCondition == 'CONTENT'">
AND TITLE LIKE CONCAT_WS('%', #{searchKeyword}, '%')
</if>
LIMIT #{criteria.amount} OFFSET #{criteria.startNum}
</select>
- ORDER BY SEQ DESC 사용하면 에러가 발생하는 이유
이미 ROWNUM에서 역순으로 되어있어서
6. 테이블에 데이터 추가하기(500개 정도)
- Ctrl + Shift + Enter -> 한 번에 실행
SELECT * FROM BOARD;
INSERT INTO BOARD(SEQ, TITLE, WRITER, CONTENT)
VALUE((SELECT IFNULL(MAX(SEQ), 0) + 1 FROM BOARD A), 'test', '관리자', 'test입니다.....');
7. selectBoardCount 메소드 추가
- BoardService 인터페이스와 BoardController 클래스, BoardDAOMybatis 클래스에 selectBoardCount 메소드 추가로 선언
- BoardController.java에 total 변수 선언
- board-mapping 파일에 selectBoardCount 매핑
8) 실행 화면
페이지 이동 기능 구현
1. 코드
<div>
<ul class="pagination">
<c:if test="${pageMaker.prev }">
<li class="pagination_button">
<a href="${pageMaker.startPage - 1 }">Previous</a>
</li>
</c:if>
<c:forEach var="num" begin="${pageMaker.startPage }" end="${pageMaker.endPage }">
<li class="pagination_button">
<a href="${num }">${num }</a>
</li>
</c:forEach>
<c:if test="${pageMaker.next }">
<li class="pagination_button">
<a href="${pageMaker.endPage + 1 }">Next</a>
</li>
</c:if>
</ul>
</div>
2. js 파일 추가 및 스크립트 추가
3. jsp 파일 수정
<script>
$(document).ready(function() {
var listForm = $("#listForm");
$(".pagination_button a").on("click", function(e) {
e.preventDefault();
listForm.find("input[name='pageNum']").val($(this).attr("href"));
listForm.submit();
});
});
</script>
4. 실행 화면
4. 새 글 등록 시 1페이지로 돌아가는 문제점 해결
1) 코드 수정
BoardController 코드 수정
getBoard.jsp 파일 링크 부분 수정
2. 실행 화면
91번 글 제목에 들어가서
글 상세페이지에서 글 목록을 눌렀을 때
1페이지가 아닌 다시 원래 페이지로 돌아오게 됨
** 글 등록 글 삭제 일때도 해보기~~
반응형
'👨💻 2. 웹개발_Back end > 2-6 Spring' 카테고리의 다른 글
[Spring] 9장 스프링 게시판 만들기 - 첨부 파일 업로드, 수정, 삭제, 다운로드 (0) | 2021.11.04 |
---|---|
[Spring] 7장 스프링과 Ajax 연동 - Ajax를 이용한 게시판 검색 기능 구현 / 날짜 형식 설정 및 한글 인코딩 (0) | 2021.11.03 |
[Spring] 6장 스프링과 JPA 연동 - 엔티티 매핑 설정 및 스프링과 JPA 연동 설정 (0) | 2021.11.02 |
[Spring] 5장 JPA 환경설정 - 영속성 유닛 설정과 엔티티 클래스 기본 매핑 및 JPA API (0) | 2021.11.02 |
[Spring] 4장 JPA 개념 - JPA 특징과 프로젝트 생성 및 라이브러리 내려받기 (0) | 2021.11.02 |
댓글