<< 2008년 5월 29일 (목) | | 2008년 5월 31일 (토) >>

Spring, Hibernate, Velocity를 활용한 페이징 기법

Hibernate에서 지원되는 페이징 알고리즘을 적용하는 방법을 공유합니다. 이것을 활용함으로써 우린 게시판 등에 응용할 수 있습니다. 테이블명과 도메인 객체는 site라고 가정합니다.
아래는 구현하기 위한 내용을 기술합니다.

1. PaginationSupport class추가
 - 클래스의 내용은 여기에서 다운 받으시기 바랍니다.

2. DaoFacade Implementation class 추가
 - Data 가져오는 부분..
@SuppressWarnings("unchecked")
public PaginationSupport<Site> getSitePage(Site site, int pageSize,
int startIndex, String order, Boolean isDesc) {
DetachedCriteria criteria = DetachedCriteria.forClass(Site.class);
criteria.add(Restrictions.eq("user.id", site.getUser().getId()));
if (StringUtils.isNotBlank(order)) {
if(isDesc == null || !isDesc){
criteria.addOrder(Order.asc(order));
}else{
criteria.addOrder(Order.desc(order));
}
} else {
criteria.addOrder(Order.desc("authTime"));
}
return this.findPageByCriteria(criteria, pageSize, startIndex);
}

3. SiteController class작성
 - 이 클래스는 사이트 테이블의 리스트를 보여주는 클래스입니다.
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String p = tu.isNull(request.getParameter("p"), "1");
int currentPage = 1;
if(NumberUtils.isNumber(p)){
currentPage = Integer.parseInt(p);
}
if(currentPage < 1)
currentPage = 1;
site = new Site();
user = new User();
user.setId(userSession.getUserId());
site.setUser(user);
PaginationSupport<Site> page =
this.daoFacade.getSitePage(site, 10, (currentPage - 1)
* 10, null, null);
ModelAndView mv = new ModelAndView();
mv.addObject("page", page);
mv.addObject("p", p);
mv.setViewName("sites");
return mv;
}

4. velocity viewer 작성
 - 게시판 리스트 보여주는 viewer입니다.
<fieldset>
<legend>#springMessage("sites")</legend>
<table class="list">
<tr>
<th>#springMessage("message.site.realm")</th>
<th>#springMessage("message.site.approve")</th>
<th>#springMessage("message.site.confirmedtime")</th>
<th>#springMessage("message.site.remoteaddr")</th>
<th>#springMessage("message.site.authtime")</th>
</tr>
#foreach($site in $page.items)
<tr>
<td>$!{site.realm}</td>
<td>$!{site.approve}</td>
<td>$!{site.confirmedTime}</td>
<td>$!{site.remoteAddr}</td>
<td>$!{site.authTime}</td>
</tr>
#end
</table>
<div class="pages">
#if($page.currentPage > 1)
<a href="sites?p=$!{page.currentPage}-1">&#171; previous</a>
#end
#foreach($pages in $page.pages)
#if ($!{pages} == $!{page.currentPage})
<span class="current">$!{pages}</span>
#elseif($!{pages} == 0)
<span>...</span>
<#else><a href="sites?p=$!{pages}">$!{pages}</a>
#end
#end
#if($!{page.currentPage} > 0 &&
$!{page.currentPage} < $!{page.totalPage})
<a href="sites?p=$!{page.currentPage}+1">next &#187;</a>
#end
</div>
</fieldset>