관계형 데이터베이스와 관련된 프로젝트에서는, 대부분의 고객들이 페이징 처리를 무척이나 좋아하고 원한다.
페이징 알고리즘은 한번 만들어두면 나중에는 복붙형식으로 쓰이는데..
한번 만들 때 워낙 햇갈리고 짜증나는일임에 틀림없다.
아래소스코드는 총 갯수, 크기, 보여질 갯수 및 현재 페이지수를 받아서 HashMap으로 페이징과 관련된 데이터를 리턴하는 클래스이다.
import java.util.HashMap;
public class PageUtilBean {
/* total : 총 페이지
* pgSize : 한개 페이지에서 보여질 갯수, 리스트의 숫자
* ROWSIZE : 하단에 보여질 페이징 갯수, 클릭해서 이동할 페이지숫자
* curPage : 현재 페이지
*/
public HashMap<Object,Object> makePageData(float total, float pgSize, int ROWSIZE, int curPage){
HashMap<Object,Object> param = new HashMap<Object, Object>();
float totCnt = (float)total;
float pageSize = (float)pgSize;
int pgCnt = (int) Math.ceil(totCnt / pageSize);
if(ROWSIZE > pgCnt){ //총 갯수 오버 방지
ROWSIZE = pgCnt;
}
int devide = (int) Math.ceil(((float)(curPage+1)/(float)ROWSIZE)); //기준체크
int start = ((devide)*ROWSIZE) - (ROWSIZE-1); // 해당페이지에서 시작번호(step2)
int end = ((devide)*ROWSIZE); // 해당페이지에서 끝번호(step2)
if(end > pgCnt){ //최종 넘어가는 갯수 오버 방지
end = pgCnt;
}
param.put("firstPage", (int)(curPage * pageSize)); //첫번째 페이지수(0으로 리턴되면 1을더해서 쓰면 된다)
param.put("pgCnt", pgCnt); //기준값으로 나눈 페이지 갯수
param.put("curPage", curPage); //현재 페이지
param.put("start",start); //시작가능 페이지
param.put("end", end); // 끝 페이지
param.put("pageSize", (int)pageSize); //페이지 사이즈
//start값과 end값이 하단에 보여질 페이지수이다. 해당 데이터를 for문으로 돌리면 된다.
return param;
}
}
위 클래스를 적용시킨 jsp 페이지는 아래처럼 하면 된다.
<div style='text-align:center'>
<c:if test="${pgCnt != null}">
<div style='display:inline-block'>
<ul class="" style='margin:0px;'>
<!--맨 첫페이지로 이동기능-->
<li>
<a href="#" onclick='moveLeft(1)'>
<span><<</span>
</a>
</li>
<!--이전페이지 기능-->
<li>
<a href="#" onclick='moveLeft(${curPage})'>
<span aria-hidden="true"><</span>
</a>
</li>
<!--페이지 선택-->
<c:forEach var="i" begin="${start}" end="${end}" step="1">
<li>
<a onclick="movePage(${i})">${i}</a>
</li>
</c:forEach>
<!--다음페이지 기능-->
<li>
<a href="#" onclick='moveRight(${curPage+2})'>
<span>></span>
</a>
</li>
<!--맨 마지막 페이지로 이동기능-->
<li>
<a href="#" onclick='moveRight(${pgCnt})'>
<span>>></span>
</a>
</li>
</ul>
</div>
</c:if>
</div>
전자정부 프레임워크에 무슨 페이징 하는 클래스가 있던데..
해당 클래스를 사용해도 상관없지만 커스터마이징하기에는 불편한 듯 하다.
혹시나..페이징 쿼리와 컨트롤러 사용 예제를 찾는다면 아래 내용을 참고하면 된다.
SELECT * FROM (
SELECT ROWNUM AS RNUM, MOTHER.* FROM (
SELECT * FROM TEST_DB
) MOTHER
WHERE ROWNUM <= #{lastPg}
) BODY
WHERE RNUM >= #{firstPg}
@Controller
public class PagingExampleController {
@Resource(name = "TestService")
private TestService service;
@Autowired
private PageUtilBean pageBean;
// 리스트보기
@RequestMapping(value = "/paging.do")
public ModelAndView paging(@RequestParam HashMap<Object, Object> param, ModelAndView mv) {
// 페이징 관련 예문
float totCnt = (float) service.totalCnt(param); // 총 페이지, 데이터베이스에서 조회하는 서비스를 만들자.
float pageSize = 10 //리스트 갯수를 정하는 값, 즉 리스트에 몇개를 뿌릴지 결정
int curPage = (int)param.get("curPage"); // 현재 페이지, 최초 접속하면 1을 주도록 하자.
int ROWSIZE = 10; // 보여질 페이징 하단 갯수
// 페이징 처리
HashMap<Object, Object> res = pageBean.makePageData(totCnt, pageSize, ROWSIZE, curPage);
param.put("firstPg", (Integer) res.get("firstPage")); //첫번째 변수
param.put("lastPg", (int)(pageSize) + (Integer)res.get("firstPage")); //마지막 변수
mv.addObject("list", service.getList(param)); //쿼리가 들어간 리스트
mv.addObject("pgCnt", (Integer) res.get("pgCnt")); //하단 페이징에 맨 마지막으로 가기 기능
mv.addObject("curPage", (Integer) res.get("curPage"));//현재 페이지
mv.addObject("start", (Integer) res.get("start")); //하단 페이징에 사용될 시작번호
mv.addObject("end", (Integer) res.get("end")); //하단 페이징에 사용될 종료번호
mv.setViewName("paging");
return mv;
}
}
반응형
'Spring framework' 카테고리의 다른 글
Software caused connection abort: socket write error (0) | 2019.04.29 |
---|---|
Spring 또는 전자정부, AOP가 되지 않는 경우 (0) | 2019.04.29 |
Mybatis 오라클 clob 매핑 (0) | 2019.04.29 |
스프링 Json 매핑(415, 400오류) (0) | 2019.04.29 |
Spring, ResponseBody 오류, 406에러 (0) | 2019.04.29 |
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)
댓글