您的位置:首页 > 其它

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

2012-06-08 11:17 357 查看
最近做一个项目使用了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"%>

[code]
在页面需要用到分页的地方添加分页标签:
<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");
}[/code]把传过来的参数像上面那样解码后,传给查询部分作为查询条件,就可以做到在分页的时候保留查询条件了。

[/code]
附:用到的一个函数代码,这段代码是从网上找到的。

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();
}










                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: