1.分页显示所必须需要知道的两个参数:总记录数和当前页数的返回结果集,所以第一要做的就是对这两个参数的分装,新建一个PagerModel类
public class PagerModel {
/**
* 总记录数
*/
private int total;
/**
* 当前页结果集
*/
private List datas;
public List getDatas() {
return datas;
}
public void setDatas(List datas) {
this.datas = datas;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
}
2.之后实现对PagerModel类的分装,新建一个AbstractManager类;
public class AbstractManager extends HibernateDaoSupport {
public PagerModel searchPaginated(String hql,int offset,int pagesize){
return searchPaginated(hql,null,offset, pagesize);
}
public PagerModel searchPaginated(String hql,Object obj,int offset,int pagesize){
return searchPaginated(hql, new Object[]{obj},offset, pagesize);
}
public PagerModel searchPaginated(String hql,Object[] params,int offset,int pagesize){
String countHql=getCountQuery(hql);
Query query=getSession().createQuery(countHql);
if(params != null && params.length > 0){
for(int i=0; i<params.length; i++){
query.setParameter(i, params[i]);
}
}
//总页数
int total=((Long)query.uniqueResult()).intValue();
//获得当前页数的结果集;
query=getSession().createQuery(hql);
if(params != null && params.length > 0){
for(int i=0; i<params.length; i++){
query.setParameter(i, params[i]);
}
}
query.setFirstResult(offset);
query.setMaxResults(pagesize);
List datas=query.list();
PagerModel pm=new PagerModel();
pm.setTotal(total);
pm.setDatas(datas);
return pm;
}
private String getCountQuery(String hql){
int index=hql.indexOf("from");
if(index!=-1){
return "select count(*)"+hql.substring(index);
}
throw new SystemException("无效的hql语句");
}
}
3.在实现类中去继承AbstractManager这个分装类
public class OrgManagerImpl extends AbstractManager implements OrgManager {
public PagerModel findOrgs(int parentId,int offset,int pagesize) {
//如果parentId=0,则查找顶级机构列表
if(parentId == 0){
return searchPaginated("from Orgnization o where o.parent is null",offset,pagesize);
}
return searchPaginated("from Orgnization o where o.parent.id = ?", parentId,offset,pagesize);
}
}
4.在action类中获得参数之后,将参数传入到jsp页面
public class OrgAction extends DispatchAction {
@Override
protected ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
OrgActionForm oaf = (OrgActionForm)form;
int offset = 0;
try {
offset = Integer.parseInt(request.getParameter("pager.offset"));
} catch (Exception ignore) {
}
int pagesize = 10;
request.setAttribute("pm",
orgManager.findOrgs(oaf.getParentId(),offset,pagesize)
);
//
int ppid = 0;
if(oaf.getParentId() != 0){
Orgnization org = orgManager.findOrg(oaf.getParentId());
Orgnization parent = org.getParent();
if(parent != null){
ppid = parent.getId();
}
}
request.setAttribute("ppid", ppid);
return mapping.findForward("index");
}
}
5.在jsp页面中使用pager-taglib插件完成分页,以下是分页显示代码
<pg:pager url="org.do" items="${pm.total }" export="currentPageNumber=pageNumber">
<pg:param name="parentId"/>
<pg:first>
<a href="${pageUrl}">首页</a>
</pg:first>
<pg:prev>
<a href="${pageUrl }">前页</a>
</pg:prev>
<pg:pages>
<c:choose>
<c:when test="${currentPageNumber eq pageNumber }">
<font color="red">${pageNumber }</font>
</c:when>
<c:otherwise>
<a href="${pageUrl }">${pageNumber }</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next>
<a href="${pageUrl }">后页</a>
</pg:next>
<pg:last>
<a href="${pageUrl }">尾页</a>
</pg:last>
</pg:pager>