pager-taglib分页控件的使用总结

来源:互联网 发布:10.网络犯罪的特征有 编辑:程序博客网 时间:2024/05/17 00:02

最近做一个项目使用了pager-taglib分页控件,总结如下:

下载

直接到pager-taglib官网下载,下载地址为:http://jsptags.com/tags/navigation/pager/download.jsp,下载的是一个.WAR文件,可以使用WINRAR解压。解压后直接到WEB-INF\lib\目录下把pager-taglib.jar拷贝到自己的工程的lib下。

定义一个分页类

/** * TODO * Pager.java * Administrator2012-4-13 */package com.pde.web.common;import java.util.List;/** * @author Administrator * */public class Pager {private long offset;//本页从记录的第几条开始private long total;//总记录条数private List list;//返回的数据队列private long pageTotal;//总页数public long getOffset() {return offset;}public void setOffset(long offset) {this.offset = offset;} public long getTotal(){return total;}public void setTotal(long total){this.total=total;}public List getList(){return list;}public void setList(List list){this.list=list;}public long getPageTotal(){return pageTotal;}public void setPageTotal(long pageTotal){this.pageTotal=pageTotal;}}

数据查询分页时的代码

/**     * 返回查询到的人员信息,     * sWhere 查询条件     * offset 记录起始索引     * pageSize 一页包含多少条记录     */public Pager getStaffList(String sWhere,int offset, int pageSize){ArrayList<Staff> list=null;List<Map> mapList=null;String sql="";Staff staff;Pager pager=null;long pageTotal;try{list=new ArrayList<Staff>();pager=new Pager();try {sql="select Count(StaffID) from Staff "+ "left outer join DicItems SexTable on SexTable.DictItemCode=Staff.Sex and SexTable.DictID='000002' "+ "left outer join DicItems StaffClassTable on StaffClassTable.DictItemCode=Staff.StaffClass and StaffClassTable                                          .DictId='000003'";if(sWhere!=null && !sWhere.isEmpty()){sql+=" where " + sWhere;}pager.setTotal(super.getTotalRecord(jdbcTemplate,sql));pageTotal=pager.getTotal()/pageSize;if(pager.getTotal()%pageSize!=0){pageTotal=pageTotal + 1;}pager.setPageTotal(pageTotal);if(pager.getTotal()<=offset){offset=offset-pageSize;}pager.setOffset(offset);} catch (Exception e) {e.printStackTrace();}sql="select StaffID,StaffName,StaffNo,BirthDate,Sex as SexCode,"+ "SexTable.DictItemDesc as SexName,PassNo,StaffClass as StaffClassCode,"+ "StaffClassTable.DictItemDesc as StaffClassName,UnitName,DeptName,Office,"+ "CoverDeptName,CoverDeptCode,ClinicNo from Staff "+ "left outer join DicItems SexTable on SexTable.DictItemCode=Staff.Sex and SexTable.DictID='000002' "+ "left outer join DicItems StaffClassTable on StaffClassTable.DictItemCode=Staff.StaffClass and StaffClassTable                                  .DictId='000003'";if(sWhere!=null && !sWhere.isEmpty()){sql+=" where " + sWhere;}sql+=" order by inputTime desc";mapList=jdbcTemplate.queryForList(super.getPagerSQL(sql, offset, pageSize));for(Map map: mapList){staff=new Staff();staff.setStaffId((String)map.get("STAFFID"));staff.setStaffName((String)map.get("STAFFNAME"));staff.setStaffNo((String)map.get("STAFFNO"));if(map.get("BIRTHDATE")!=null){staff.setBirthDate(Timestamp.valueOf(sf.format(map.get("BIRTHDATE"))));}staff.setSexCode((String)map.get("SEXCODE"));staff.setSexName((String)map.get("SEXNAME"));staff.setPassNo((String)map.get("PASSNO"));staff.setStaffClassCode((String)map.get("STAFFCLASSCODE"));staff.setStaffClassName((String)map.get("STAFFCLASSNAME"));staff.setUnitName((String)map.get("UNITNAME"));staff.setDeptName((String)map.get("DEPTNAME"));staff.setOffice((String)map.get("OFFICE"));staff.setCoverDeptCode((String)map.get("COVERDEPTCODE"));staff.setCoverDeptName((String)map.get("COVERDEPTNAME"));staff.setClinicNo((String)map.get("CLINICNO"));list.add(staff);}pager.setList(list);}catch(DataAccessException ex){ex.printStackTrace();}return pager;}

action调用分页函数

public String list(){int offset;int pageSize;String sWhere;try{HttpServletRequest request = ServletActionContext.getRequest(); if (request.getParameter("pager.offset") == null) {//pager.offset,taglib标签自带的属性                offset = 0;               } else {                offset = Integer.parseInt(request                  .getParameter("pager.offset"));               } if(request.getAttribute("maxPageItems")==null){pageSize=10;            }else{            pageSize = Integer.parseInt(request.getParameter("maxPageItems"));            } getParamSet();sWhere=getWhere();setPager(staffDAO.getStaffList(sWhere, offset, pageSize));setStaffClassList(dictItemDAO.getDictItemByDictId(SCDICTID));setStaffList(getPager().getList());}catch(Exception ex){ex.printStackTrace();}return "sucess";}

JSP中的引用

在JSP文件的头上,添加标签引用:
<%@ taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager"%>

在页面需要用到分页的地方添加分页标签:
<c:if test="${pager.pageTotal>1}">共有<font color="red">${pager.total}</font>条记录 共<font color="red">${pager.pageTotal}</font>页<pg:pager url="caseinfo!list.do" items="${pager.total}" maxPageItems="10" export="currentPageNumber=pageNumber"> <pg:param name="pStaffName" value='<%=request.getAttribute("sStaffName")==null? "":(URLEncoder.encode(request.getAttribute("sStaffName").toString(), "UTF-8")) %>'/> <pg:param name="pUnitName" value='<%=request.getAttribute("sUnitName")==null? "":(URLEncoder.encode(request.getAttribute("sUnitName").toString(), "UTF-8"))%>'/> <pg:param name="pDeptName" value='<%=request.getAttribute("sDeptName")==null? "":(URLEncoder.encode(request.getAttribute("sDeptName").toString(), "UTF-8")) %>'/> <pg:param name="pOffice" value='<%=request.getAttribute("sOffice")==null? "":(URLEncoder.encode(request.getAttribute("sOffice").toString(), "UTF-8")) %>'/> <pg:param name="pStarTime" value='<%=request.getAttribute("sStarTime")==null? "":(URLEncoder.encode(request.getAttribute("sStarTime").toString(), "UTF-8")) %>'/> <pg:param name="pEndTime" value='<%=request.getAttribute("sEndTime")==null? "":(URLEncoder.encode(request.getAttribute("sEndTime").toString(), "UTF-8")) %>'/> <pg:first><a href="${pageUrl}">首页</a></pg:first> <pg:prev><a href="${pageUrl}">前页</a></pg:prev> <pg:pages>  <c:choose>  <c:when test="${pageNumber eq currentPageNumber }">  <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></c:if>

在上面这段代码中,我使用jstl标签,设置了如果页数大于1,才显示分页,否则的话不显示分页。
通过上述的一番折腾,已经可以正确分页显示了。接下来就完善一下。
由于在很多情况下,分页使用的是列表,经常涉及到根据条件查询,而pager-taglib分页却是使用URL的方式来获取下一页的数据,如果不把查询条件附带在URL中,那么在分
页时,就不能获取到正确的数据,必须使用<pg:param/>标签把查询的内容附加在URL中带入action进行查询。但是在国内使用,避免不了查询条件中有中文部分,但是中文
直接附加在URL中,肯定是不对的,因为pager标签和action的编码方式不同,一个是UTF-8,一个是根据本地操作系统编码,对于英文来讲是没有问题的,对于双字节就有问
题了。所以需要把查询条件进行编码。
编码如下:

<pg:param name="pStaffName" value='<%=request.getAttribute("sStaffName")==null? "":(URLEncoder.encode(request.getAttribute("sStaffName").toString(), "UTF-8")) %>'/>
通过这样对中文进行编码后,回传到action的汉字才是正确的。顺带说一句,在<pg:param>中的内容是带在URL后面作为参数发送到服务端的,就比如举例这句代码,在分页
的时候,就会以"&pStaffName=张三"的形式回到服务端。

这样的内容送到服务端,并不能直接通过"response.getParamater("pStaffName")"直接引用,还必须对这些参数进行解码,
解码的代码如下:

value=request.getParameter("pStaffName");if(value!=null && !value.isEmpty()){     value=CommFunc.toUtf8String(value);     pStaffName=java.net.URLDecoder.decode(value,"UTF-8");}
把传过来的参数像上面那样解码后,传给查询部分作为查询条件,就可以做到在分页的时候保留查询条件了。


附:用到的一个函数代码,这段代码是从网上找到的。
public static String toUtf8String(String s){        StringBuffer sb = new StringBuffer();        for (int i=0;i<s.length();i++){            char c = s.charAt(i);           if (c >= 0 && c <= 255){sb.append(c);}           else{               byte[] b;               try { b = Character.toString(c).getBytes("utf-8");}               catch (Exception ex) {                   System.out.println(ex);                   b = new byte[0];               }               for (int j = 0; j < b.length; j++) {                   int k = b[j];                   if (k < 0) k += 256;                   sb.append("%" + Integer.toHexString(k).toUpperCase());               }           }       }       return sb.toString();   }



	
				
		
原创粉丝点击