pager-taglib分页方案一

    数据量稍大的查询界面都需要对数据进行分页显示,所以分页显示也是一种基础实现,在.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中获取要显示的数据

总结

    至此,简单版的分页已经可以实现,但是,和上篇博客提到的问题相同——耦合:分页功能与业务本身无关联,所以要将其分解出来,优化方案详见下篇博客。





  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 35
    评论
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值