数据量稍大的查询界面都需要对数据进行分页显示,所以分页显示也是一种基础实现,在.NET阶段,GridView控件即自带分页;在JAVA阶段,常用的是pager-taglib工具。当然pager-taglib实现的也只是对数据进行的绑定,显示还是要依赖table和JSTL。
先来看一种简单的实现,再来说它的优化方案。
使用实体类PageModel对分页数据进行封装。
package com.tgb.oa; import java.util.List; 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; } }
查询要显示的数据。
public PagerModel findOrgs(int parentId,int offset,int pagesize) { String selectCountHql = "select count(*) from Orgnization o where o.parent is null"; if(parentId != 0){ selectCountHql = "select count(*) from Orgnization o where o.parent.id = "+parentId; } //获得总记录数 int total = ((Long)getSession().createQuery(selectCountHql).uniqueResult()).intValue(); String selectHql = "select o from Orgnization o where o.parent is null"; if(parentId != 0){ selectHql = "select o from Orgnization o where o.parent.id = "+parentId; } //取得当前页的数据 List datas = getSession().createQuery(selectHql) .setFirstResult(offset) .setMaxResults(pagesize) .list(); PagerModel pm = new PagerModel(); pm.setTotal(total); pm.setDatas(datas); return pm; }
Struts1的Action,页面转发。
/** * 打开主界面 */ @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) return mapping.findForward("index"); }
使用table结合JSTL显示数据。
<table width="778" border="0" cellPadding="0" cellSpacing="1" bgcolor="#6386d6"> <!-- 列表标题栏 --> <tr bgcolor="#EFF3F7" class="TableBody1"> <td width="5%" height="37" align="center"><b>序号</b></td> <td width="18%" height="37" align="center"><B>机构名称</B></td> <td width="18%" height="37" align="center"><b>机构编号</b></td> <td width="18%" height="37" align="center"><b>父机构名称</b></td> <td width="18%" height="37" align="center"><b>相关操作</b></td> </tr> <!-- 列表数据栏 --> <c:if test="${!empty pm.datas}"> <c:forEach items="${pm.datas }" var="org"> <tr bgcolor="#EFF3F7" class="TableBody1" onmouseover="this.bgColor = '#DEE7FF';" onmouseout="this.bgColor='#EFF3F7';"> <td align="center" vAlign="center">${org.id }</td> <td align="center" vAlign="center"><a href="org.do?parentId=${org.id }">${org.name }</a></td> <td align="center" vAlign="center">${org.sn }</td> <td align="center" vAlign="center">${org.parent.name }</td> <td align="center" vAlign="center"> <a href="#" onclick="del('org.do?method=del&id=${org.id }');">删除</a></td> </tr> </c:forEach> </c:if> </table>
请求分页数据,并提供跳转。
<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> <a href="${pageUrl }">${pageNumber }</a> </pg:pages> <pg:next> <a href="${pageUrl }">后页</a> </pg:next> <pg:last> <a href="${pageUrl }">尾页</a> </pg:last> </pg:pager>
至此,简单版的分页已经可以实现,但是,和上篇博客提到的问题相同——耦合:分页功能与业务本身无关联,所以要将其分解出来,优化方案详见下篇博客。