数据量稍大的查询界面都需要对数据进行分页显示,所以分页显示也是一种基础实现,在.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;
}
}
"M"
查询要显示的数据。
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;
}
"C"
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");
}
"V"
使用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" οnmοuseοver="this.bgColor = '#DEE7FF';" οnmοuseοut="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="#" οnclick="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>
流程分析
现在对以上的流程进行分析:- pager-taglib请求分页数据
- Struts的Action接受请求,调用Model数据
- 将返回的分页数据进行封装,置入request中
- table配合JSTL从request中获取要显示的数据
总结
至此,简单版的分页已经可以实现,但是,和上篇博客提到的问题相同——耦合:分页功能与业务本身无关联,所以要将其分解出来,优化方案详见下篇博客。