`
ruilin521314
  • 浏览: 883348 次
文章分类
社区版块
存档分类
最新评论

pager-taglib 实例

 
阅读更多

在ssh架构中利用pager-taglib和filter根据用户需求显示进行分页,在次将实现一个根据用户在下拉类表用选择每页将要显示多少行进行分页
首先介绍pager-taglib标签:
pg:pager【这个标签用来设置分页的总体参数】重要参数说明:
url:分页的链接根地址,pager标签会在这个链接的基础上附加分页参数
items:总记录数,pager标签正是根据这个值来计算分页参数的//需要给它赋上查询的记录数
maxPageItems:每页显示的行数,默认为10
maxIndexPages:在循环输出页码的时候,最大输出多少个页码,默认是10

pg:first【第一页的标签】重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - 首页第一行的索引值
lastItem - 首页最后一行的索引值
pg:pre【上一页标签】重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - 前页第一行的索引值
lastItem - 前页最后一行的索引值
pg:next【下一页标签】重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - 下页第一行的索引值
lastItem - 下页最后一行的索引值
pg:last重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - 尾页第一行的索引值
lastItem - 尾页最后一行的索引值
pg:pages【这个标签用来循环输出页码信息】重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - pageNumber这个页码指定的那一页的第一行的索引值
lastItem - pageNumber这个页码指定的那一页的最后一行的索引值
pager-taglib组件默认的每页显示数目为10,相应的属性是maxPageItems="10",因此我可以将用户自己的显示行数放在 session内,并将其赋值给maxPageItems就可以实现用户自己的分页类型。例如 httpRequest.getSession().setAttribute("ps", 10);然后maxPageItems="ps"

下面是一个具体的例子:
首先下载pager-taglib-2.0.war ,地址
http://jsptags.com/tags/navigation/pager/download.jsp,然后将lib下面的包lib下的jar包放到自己项目的lib下面。
生成测试表:t_person,其中实体类Person类有id,name,phone属性,具体在hibernate配置文件中的配置略..。
创建PagerModel类用于存放从数据库查询的所有person,和总记录数。代码如下:
package com.test;
import java.util.List;
public class PagerModel {
private int total;//总记录数
private List datas;//所有用户集合
...get和set方法
}
下面一个类用于得到每页个显示数和用于查询的首记录数
package com.test.filter;
public class SystemContext {
private static ThreadLocal<Integer> offset = new ThreadLocal<Integer>();//用于query.setFirstResult(offset)
private static ThreadLocal<Integer> pagesize = new ThreadLocal<Integer>();//pagesize每页显示的行数用于
query.setMaxResults(pagesize);-----ThreadLocal线程局部变量,就是为每一个使用该变量的线程都提供一个变量值的副本,每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突,也就是每一个用户都可以改变自己的每页显示的行数而不会影响到其他人

public static void setOffset(int offsetvalue){
offset.set(offsetvalue);
}
public static int getOffset(){
Integer ov = offset.get();
if(ov == null){
return 0;
}
return ov;
}

public static void setPagesize(int pagesizevalue){
pagesize.set(pagesizevalue);
}

public static int getPagesize(){
Integer ps = pagesize.get();
if(ps == null){
return Integer.MAX_VALUE;//将pagesize设置为无穷大,也就是显示在一页上
}
return ps;
}
public static void removeOffset(){//清除为每个用户分配的副本
offset.remove();
}
public static void removePagesize(){
pagesize.remove();
}

}
主要的类PagerFilter:用于设置加载用户自定义的pagesize和offset
package com.test.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class PagerFilter implements Filter {
public static final String PAGE_SIZE_NAME = "ps";

public void destroy() {

}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

HttpServletRequest httpRequest = (HttpServletRequest)request;
//设置分页参数
SystemContext.setOffset(getOffset(httpRequest));
SystemContext.setPagesize(getPagesize(httpRequest));

try{
chain.doFilter(request, response);
}finally{
SystemContext.removeOffset();
SystemContext.removePagesize();
}
}
private int getOffset(HttpServletRequest httpRequest){
int offset = 0;
try {
offset = Integer.parseInt(httpRequest.getParameter("pager.offset"));//得到标签自己计算出的pager.offset
} catch (Exception ignore) {
}
return offset;
}
//获取每页显示的行数
private int getPagesize(HttpServletRequest httpRequest){
String pageSize = httpRequest.getParameter("pagesize");//得到用户自己的每页显示的行数
if(pageSize != null){
Integer ps;
try {
ps = Integer.parseInt(pageSize);
httpRequest.getSession().setAttribute(PAGE_SIZE_NAME, ps);
} catch (Exception ignore) {
}
}
Integer pagesize = (Integer)httpRequest.getSession().getAttribute(PAGE_SIZE_NAME);
if(pagesize == null){//如果用户没有设置就每日显示10行,并将其放入session供以便在显示页面赋值给maxPageItems使用
httpRequest.getSession().setAttribute(PAGE_SIZE_NAME, 10);
return 10;
}else{
return pagesize;
}
}
public void init(FilterConfig arg0) throws ServletException {

}
}
在web.xml中配置:
<filter>
<filter-name>pagerfilter</filter-name>
<filter-class>com.test.filter.PagerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>pagerfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
建立AbstractManager类用于封装查询数据库的细节,管理类可以通过searchPaginated(String hql)就可以得到PagerModel :
public class AbstractManager extends HibernateDaoSupport {

public PagerModel searchPaginated(String hql){
return searchPaginated(hql,offset,pagesize);
}
public PagerModel searchPaginated(String hql,int offset,int pagesize){

//获取总记录数
String countHql = getCountQuery(hql);
Query query = getSession().createQuery(countHql);
if(params != null && params.length > 0){
for(int i=0; i<params.length; i++){
query.setParameter(i, params[i]);
}
}
int total = ((Long)query.uniqueResult()).intValue();

//获取当前页的结果集
query = getSession().createQuery(hql);
if(params != null && params.length > 0){
for(int i=0; i<params.length; i++){
query.setParameter(i, params[i]);
}
}
query.setFirstResult(SystemContext.getOffset());//通过SystemContext得到Offset
query.setMaxResults(SystemContext.getPagesize();//通过SystemContext得到pagesize
List datas = query.list();
PagerModel pm = new PagerModel();
pm.setDatas(datas);
pm.setTotal(total);
return pm;
} //根据HQL语句,获得查找总记录数的HQL语句如:select .... from ...转换为:select count(*) from ....
private String getCountQuery(String hql){
int index = hql.indexOf("from");
if(index != -1){
return "select count(*) " + hql.substring(index);
}
throw new SystemException("无效的HQL查询语句!");
}
}
//下面是具体管理类//得到分页数据PagerModel:
public class PersonManagerImpl extends AbstractManager implements PersonManager {//PersonManager为一个interface
public PagerModel searchPersons() {
PagerModel pm = new PagerModel();
String hql = "select p from Person p";
return this.searchPaginated(hql);
}
}
创建访问页面index.jsp
主要代码:<a href="person.do" mce_href="person.do">用户分页类表</a>
相应的action页面:主要代码:
public class PersonAction extends DispatchAction {
private PersonManager personManager;//利用spring注入person管理类
@Override
protected ActionForward unspecified(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

PagerModel pm = personManager.searchPersons();
request.setAttribute("pm", pm);
return mapping.findForward("index");//通过配置文件转到list.jsp
}
public void setPersonManager(PersonManager personManager) {
this.personManager = personManager;
}
}
显示页面:list.jsp
<%@ taglib prefix="pg" uri="
http://jsptags.com/tags/navigation/pager" %>//引入
...
<mce:script type="text/javascript"><!--
function selectPagesize(field){
document.location.href = document.all.firstpageurl.href + "&pagesize="+field.value;//得到用户从下拉列表选择的每页显示的行数,并刷新到转到首页
}
// --></mce:script>
....
<table>
<!-- 列表标题栏 -->
<tr bgcolor="#EFF3F7" class="TableBody1">

<td >姓名</td>
<td >电话</td>
</tr>
<!-- 列表数据栏 -->
<c:forEach items="${pm.datas }" var="person">
<tr>
<td >${person.name }</td>
<td >${person.phone }</td>
</tr>
</c:forEach>
</table>
<TABLE>
<TBODY>
<TR>
<TD>
<!-- 分页导航条 -->
<pg:pager url="person.do" items="${pm.total}" export="currentPageNumber=pageNumber" maxPageItems="${ps}">//得到session范围内的每页显示的行数
<pg:first>
<a href="${pageUrl}" mce_href="${pageUrl}" id="firstpageurl">首页</a>
</pg:first>
<pg:prev>
<a href="${pageUrl }" mce_href="${pageUrl }">前页</a>
</pg:prev>
<pg:pages>
<c:choose>
<c:when test="${currentPageNumber eq pageNumber}">
<font color="red">${pageNumber }</font>//当前页号不显示链接
</c:when>
<c:otherwise>
<a href="${pageUrl}" mce_href="${pageUrl}">${pageNumber }</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next>
<a href="${pageUrl }" mce_href="${pageUrl }">后页</a>
</pg:next>
<pg:last>
<a href="${pageUrl }" mce_href="${pageUrl }">尾页</a>
</pg:last>
</pg:pager>
<!-- 用户选择每页显示行数下拉列表 -->
每页显示
<select name="pagesize" onchange="selectPagesize(this)" >
<c:forEach begin="5" end="50" step="5" var="i">
<option value="${i}"
<c:if test="${ps eq i }">selected</c:if>
>${i}</option>
</c:forEach>
</select>行
</TD>
</TR>
</TBODY>
</TABLE>


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zidasine/archive/2009/03/07/3966860.aspx

分享到:
评论

相关推荐

    pager-taglib 分页扩展实例

    pager-taglib 是个很好的jsp分页标签,使用它结合jstl可以实现灵活的分页导航功能。在实际的开发中post方式的提交比较常见,本人做了一个比较通用的基于post方式的一个应用。主要实现一下功能: 1.添加输入跳转、每...

    使用pager-taglib分页完整例子

    使用pager-taglib分页,含有多种分页样式,jar包都有,只要导入就可以运行,内附有说明,java 语言的

    pager-taglib源码

    这是pager-taglib的官方源码,但在采用官方的pager-taglib分页传输中文参数会出现乱码,所以我采用maven新建一个pager-taglib项目对pager-taglib的源码进行小小的改动,是他支持中文传输,更重要的是把源代码提供给...

    pager-taglib-2.0

    pager-taglib-2.0,pager-taglib-2.0,pager-taglib-2.0,java分页标签。

    pager-taglib-2.0及使用方法

    pager-taglib-2.0及使用方法,一个很好用的页面分页工具.

    pager-taglib.jar

    利用pager-taglib进行查询分页时需要添加该jar包:pager-taglib.jar

    pager-taglib中文乱码解决后的JAR包

    用pager-taglib进行分页时,如果出现中文参数,由于pager-taglib默认是用ISO8859-1编码后进行参数传递,故会出现乱码现象。本人下载源码后,将编码的语句注释掉,即不进行编码,解决了中文乱码问题。改写后的代码已...

    pager-taglib.jar包下载

    pager-taglib.jar包下载.很方便的分页框架。这是jar包,希望能帮到大家

    pager-taglib使用指南 .txt

    pager-taglib使用指南 .txt 很详细,里面还有例子。

    支持中文传输的pager-taglib.jar

    支持中文传输的pager-taglib.jar

    pager-taglib分页jar包

    用于在jsp中进行分页的 pager-taglib包

    pager-taglib-2.0.jar 已解决乱码

    已解决中文乱码问题的 pager-taglib-2.0.jar包。

    pager-taglib2.0 加强版

    maven仓库下载的pager-taglib2.0分页时 存在中文参数乱码问题。 须修改 源文件,附件为更改源码后的 jar包

    pager-taglib-2.0完整源码和Struts演示示例工程

    在Struts中应用标签的数据库分页示例(dbpage.jsp),打开方法: http://localhost:8080/pagertaglib/dbPageAction.do?pageSize=5&pager.offset=0&pageNo=1&lt;br&gt;在Struts中应用标签但一次取数据在页面自动分页的示例...

    ssh2+pager-taglib实现自动分页

    Pager-taglib,支持多种风格的分页显示。实际上她是一个Jsp标签库,为在JSP上显示分页信息而设计的一套标签,通过这些标签的不同的组合,会形成多种不一样的分页页面,风格各异,她自带的DEMO就有七种左右的分页风格...

    ssh+分页(pager-taglib)

    本资源融合了struts+spring+hibernate的集成,并充分运用jsp开源分页标签(pager-taglib)进行了分页。支持多条件的分页查询。由于上传大小限制,本人被迫将所用到的jar包目录删除,所需的几个必备jar包我已留在本...

Global site tag (gtag.js) - Google Analytics