프레임워크 : 마이바티스 mybatis
view 템플릿 : 타임리프 thymleaf
build에 페이징 라이브러리 추가
// 페이징 라이브러리
implementation 'org.apache.commons:commons-lang3:3.12.0'
1.PagingVO
필드에 사용할 객체를 만들어주는 과정이다.
public class PagingVO{
private int COUNT_PER_PAGE; //한 페이지당 보여지는 게시물 수 , 기본 10개로 잡음
private int totalCount; //전체 게시물 수
private int currentPage; //현재 페이지
private int lastRow //현 페이지에서 마지막 게시물
private int startRow //현 페이지에서 첫번째 게시물
private int totalPage; // 전체 페이지 수
private int pageRangeStart // 웹 페이지 하단 페이지 표시 부분 , 시작 번호 Count_per_page와 연동됨
private int pageRangeEnd // 웹 페이지 하단 페이지 표시 부분 , 마지막 번호 count_per_page와 연동됨
private int prevPage // 이전 페이지
private int nextPage //다음 페이지
private int startRowNumCurrentPage // 리스트페이지의 단순 증가 번호 (고객이 보는거 )
}
사용할 객체들을 만들어 줬다면 , 이제 의존성을 주입해야하는데 , 한 페이지당 보여주는 게시물 수는 내가 설정해 준다.
2.페이지당 보여주는 게시글에 관련하여 의존성 주입과정
아무것도 설정하지 않았을 때, 페이지당 보여주는 게시글을 기본 10개로 잡는다.
참고로 다른 객체들은 내가 의존성 주입을 하지 않았는데 , 이렇게 되면 자바에서 디폴트로 생성자 만들어줘서 그냥 디폴트 값으로 의존성 주입이 된다.
public PagingVO(){
COUNT_PER_PAGE = 10;
}
만약 , 페이지당 보여주는 게시글을 나중에 내가 설정하고 싶다면 생성자를 파라메터 넣어서 써줌
public PagingVO(int initVal){
COUNT_PER_PAGE = initVal;
}
위에 페이지당 보여지는 개수를 조절하고 싶을 떄 쓰는 setter 공식
public void setCOUNT_PER_PAGE(String rowsPerPage)[
if(StringUtils.isBlank(rowsPerPage) || rowsPerPage.equals("0"){
COUNT_PER_PAGE = 10;
}else {
COUNT_PER_PAGE = Integer.parseInt(rowsPerPage);
}
}
생성자를 내가 만들지 않은 다른 변수들의 경우, 자바 디폴트 생성자가 만들어져서 아래와 같은 생성자가 만들어진다.
public PagingVO(){
}
이렇게해도 객체들을 쓸 수 있음, 이건 단지 의존성 주입의 과정임..
만약 디폴트 생성자도 없다면 저건 클라스만 있는거구 사용할 수가 없음
참고로 내가 값을 설정하지 않았다면 , 디폴트 값으로 자동 저장되는데, 내가 필드값을 만드는 순간 밑에 값으로 저장됨
3. 페이지 및 게시글 디폴트 설정
만약 사용자가 게시글을 하나도 안올렸을 경우, 자바에서 전체 게시물의 기본값을 1로 잡아준다.
게시글없을 때 게시글 수를 0으로 하면 에러가 잘 난다고 함
전체 게시글이 하나씩 올라오면 totalCount가 늘어남
public void setTotalCount(int totalCount){
if(totalCount < 1){
this.totalCount = 1;
}else{
this.totalCount = totalCount;
}
}
현재 페이지 설정 , 게시글이 없으면 , 디폴트를 그냥 1로 해줌 , 즉 게시글이 하나도 없어도 내가 있는 페이지는 1에 있음
public void setCurrentPage(String currentPage){
if(StringUtils.isBlank(currentPage) || currentPage.contentEquals("0")){
setCurrentPage(1);
}else {
setCurrentPage(Integer.parseInt(currentPage);)
}
}
4.게시물 번호를 설정
현재 페이지 설정시, 현재 페이지의 시작 게시물 번호와 마지막 게시물 번호를 설정 (리스트에서 빼내기 위한 작업임)
public void setCurrentPage(int currentPage){
this.currentPage = currentPage;
// 마지막 게시물 번호 = 현재 페이지 * 페이지당 게시물 수 ex) 현재페이지 2,게시물 수 10 = 마지막 게시물 번호 20
lastRow = currentPage * COUNT_PER_PAGE;
//첫번째 게시물 번호 = 마지막 게시글 번호 - 페이지당 게시글 수 ex) 20-10 = 10 or 10-10 = 0
//이렇게 되는 이유는 sql에서 갯수를 셀 때 0부터 시작하기 때문이다.
startRow = lastRow - COUNT_PER_PAGE;
5.번호 에러처리 (밑에서 번호 계산해야되서 미리 해줌 )
//첫번째 번호가 0보다 작은 에러가 발생할 때 , 디폴트를 0으로 셋팅해줌
if(startRow<0){
startRow = 0;
}
//마지막 번호가 0이거나 0보다 작다고 에러가 발생하면 , 디폴트를 10으로 셋팅해줌
if(lastRow <= 0 ){
lastRow = 10;
}
//마지막 번호가 전체 게시글 보다 숫자가 높을 때, 에러가 남 , 이 때 전체게시글 수를 마지막번호로 셋팅해줌
if(lastRow >= totalCount){
lastRow = totalCount;
}
6.전페페이지 수 , 페이지 시작 번호 마지막 번호 계산
//전체 게시물 수로 전체 페이지 계산
//ex) 전체게시물 수 20 / 페이지당 게시글 수 10 = 총 페이지 2
//Math.ceil 올림해주는 함수
//ex) 전체게시글 22/페이지당 게시글 수 10 = 2.2222 -> 올림해서 총 페이지 3으로 해줌
totalPage = (int)Math.ceil( (double)totalCount / (double) COUNT_PER_PAGE);
//현재 페이지로 웹 페이지 하단에 있는 페이지 범위 끝 계산
//ex) (현재 페이지 2 /페이지당 게시글 수 10)*페이지당 게시글 수 10 = 페이지 끝 번호 20
pageRangeEnd = (int)Math.ceil((double)currentPage/ (double)COUNT_PER_PAGE)*COUNT_PER_PAGE;
//현재 페이지로 웹 페이지 하단에 있는 시작 범위 계산
//ex) 페이지 끝 번호 20 - 게시글 수 10 + 1 = 페이지 첫 번호 11
pageRangeStart = pageRangeEnd - COUNT_PER_PAGE + 1;
7.에러 처리
//첫번째 페이지 번호가 0으로 에러 발생시 , 1로 셋팅해줌
if(pageRangeStart <= 0){
pageRangeStart = 1;
}
//전체 페이지 수보다 현재 페이지 마지막 번호가 높다는 에러가 나왔을 때, 셋팅
if(pageRangeEnd > totalPage){
pageRange = totalPage;
}else{
//전체 페이지 수가 5개보다 적으면 , 페이지 범위 마지막 번호도 5로 해줌
if(totalPage <=5 ){
pageRangeEnd = 5;
}
}
//페이지 마지막 번호가 0으로 나올때 디폴트 1로 해줌
if(pageRangeEnd == 0){
pageRangeEnd = 1;
}
if(currentPage > 1){
prevPage = currentPage -1;
}else {
//현재 페이지가 1이거나 0보다 작을 떄
prevPage = 1;
}
if( nextPage < totalPage ) {
nextPage = currentPage + 1;
//다음 페이지가 토탈 페이지 보다 많을 수 없음. 에러를 처리한건데 if문 else문 둘다 넣어줌
만일의 경우를 대비해서
if( nextPage >= totalPage ) {
nextPage = totalPage;
}
}else {
nextPage = totalPage;
}
8.페이지 번호 클릭시 , 글자 두껍게 하는 getPager()메소드
StringBuilder를 이용하여 스트링을 붙인다.
public String getPager(){
StringBuilder sb = new StringBuilder();
처음 페이지 로 화면에 나옴 . goPage('1') 이니까 1페이지로 감
sb.append("<a class=\"btn_paging_first\" href=\"javascript:goPage('1')\"><span class=\"fas fa-angle-double-left\"><em>처음페이지</em></span> </a></a>\n");
이전페이지 로 화면에 나옴 , goPage('this.getPrevPage()')로 나오니까 이전 페이지로 감
sb.append("<a class=\"btn_paging_prev\" href=\"javascript:goPage('"+ this.getPrevPage() +"')\"><span class=\"fas fa-angle-left\"><em>이전페이지</em></span></a>\n");
현재 페이지를 클릭하면 두껍게 표시함
for(int i=this.getPageRangeStart(); i<=this.getPageRangeEnd(); i++)
if(this.getCurrentPage() == i){
sb.append("<strong>"+i+"</strong>" + "\n");
}else{
sb.append(" <a href=\"javascript:goPage('"+i+"')\">" +i +"</a> \n");
}
다음페이지 >> , goPage (this.getNextPage()니까 다음 페이지로 간다.
sb.append(" <a class=\"btn_paging_next\" href=\"javascript:goPage('"+this.getNextPage()+"')\"><span class=\"fas fa-angle-right\"><em>다음페이지</em></span></a> \n");
sb.append(" <a class=\"btn_paging_end\" href=\"javascript:goPage('"+this.getNextPage()+"')\"><span class=\"fas fa-angle-double-right\"><em>마지막페이지</em></span></a> \n");
return sb.toString();
}
'Spring > [Spring]Pagination(페이징)' 카테고리의 다른 글
페이징처리 - 3 (html수정, 자바스크립트 , ajax) (0) | 2022.01.10 |
---|---|
페이징처리 - 2 (Service,mapper,api,db) (0) | 2022.01.10 |
댓글