- 浏览: 405846 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
liyuanhoa_:
...
struts2.0中struts.xml配置文件详解 -
chenmingde:
...
Velocity应用(一) -
weizhikai_ai:
第二十六,当一个线程进入一个对象的一个synchronized ...
Java常见面试题(含答案) -
Aurora_lr:
...
Spring宠物商店学习笔记(一) - -
zs911zs:
all copy from http://www.iteye ...
Mule入门文档
在Web应用程序里,分页总让我们开发人员感到很头疼,倒不是因为技术上有多么困难,只是本来和业务没有太多关系的这么一个问题,你却得花不少功夫来处理。要是稍不留神,时不时出点问题就更郁闷了。我现在做的一个项目也到了该处理分页的时候了,感觉以前处理得都不好,所以这次有所改变,基本目标是在现有(未分页)的代码基础上,尽量少做修改,并且同样的代码可以应用于不同模块的分页。以下就是我用的方法:
首先,考虑分页绝大多数发生在列表时,组合查询时也需要用到。在我的项目里,列表的Action一般名字为ListXXXActioin,例如客户列表是ListClientsAction等等。在未分页前,ListXXXAction里会把所有的对象取出,通过request.setAttribute()放在request里,然后将请求转向到列表的jsp(例如listClients.jsp)显示出来(你可能会说不要在Action里放业务逻辑,但现在这不是我们考虑的重点)。而分页后,我们只取用户请求页对应的那些对象。为了最大限度的达到代码重用,我做了以下工作:
1、新建一个Pager类,该类有beginPage、endPage、currentPage、pageSize和total等int类型的属性,分别代表开始页、结束页、当前页、每页记录数和总记录数,它主要是让jsp页面显示页导航使用的。请注意currentPage属性是从0开始的。
2、新建一个AbstractListActioin类,并让所有ListXXXAction都继承它。在这个类里覆盖execute()方法,可以在这里判断权限等等,并在判断权限通过后执行一个abstract的act()方法,这个act()由ListXXXAction来实现。
3、在AbstractListAction里增加getPage()方法,用来从request得到用户请求的页码(若未请求则认为是第0页):
protected int getPage(HttpServletRequest request) {
String p = request.getParameter("p");
if (p == null)
return 0;
else
try {
return Integer.parseInt(p);
} catch (NumberFormatException e) {
return 0;
}
}
4、在AbstractListAction里增加makePager()方法,用来向request里增加一个Pager类的实例,供jsp页面显示页导航:
protected Pager makePager(HttpServletRequest request, int total) {
Pager pager=new Pager();
pager.setTotal(total);
pager.setPageSize(Config.getInstance().getPageSize());
pager.setBeginPage(0);
pager.setEndPage(((pager.getTotal()) - 1) / pager.getPageSize() + 1);
pager.setCurrentPage(getPage(request));
return pager;
}
注意在我的项目里,每页记录数是写在配置文件里的,如果你没有配置文件,上面第4行setPageSize()的参数直接填数字即可,例如pager.setPageSize(10);
5、这样,所有的ListXXXAction都可以使用getPage()得到请求的页码,并且能够方便的通过makePager()构造需要放在request里的pager对象了。现在要在从数据库取数据的代码上再做一些修改,即只取所需要的那一部分数据。由于我的项目中使用了Hibernate,所以这个修改也不是很困难。未分页前,在我的ListClientsAction里是通过构造一个Query来得到全部Client的,现在,只要在构造这个Query后再加两句(setMaxResults和setFirstResult)即可:
Query query = ;//构造query的语句
int total = ;//得到总记录数
Pager pager = makePager(request, total);//调用父类中的方法构造一个Pager实例
query.setMaxResults(pager.getPageSize());//设置每页记录数
query.setFirstResult(pager.getCurrentPage() * pager.getPageSize()); //设置开始位置
request.setAttribute(Pager.class.getName(), pager);//把pager放在request里
request.setAttribute(Client.class.getName(), query.list());
目前存在一个问题,就是在上面代码的第二句中,应该是获得总记录数,但我暂时没有特别好的办法不得到全部对象而直接得到记录数,只能很恐怖的用“int total = query.list().size();”,汗……
6、最后,我写了一个页导航的jsp页面pager.jsp,供各个显示列表的jsp来include,代码如下:
<%Pager pager=(Pager)request.getAttribute(Pager.class.getName());%>
<table width="90%" border="0" align="center" cellpadding="2" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<td bgcolor="#EEEEEE" align="right">
<bean:message key="prompt.pager" arg0="<%=String.valueOf(pager.getTotal())%>"/>
[
<%
for(int i=pager.getBeginPage();i<pager.getEndPage();i++){
if(i==pager.getCurrentPage()){
%>
<%=(i+1)%>
<%}else{
String qs=request.getQueryString()==null?"":request.getQueryString();
String op = "p="+pager.getCurrentPage();//Original page parameter expression
String np = "p="+i;//New expression
if(qs.indexOf(op)==-1)
qs=np+"&"+qs;
qs=qs.replaceAll(op,np);
%>
<a href="<%="?"+qs%>"><%=(i+1)%></a>
<%}%>
<%if(i<pager.getEndPage()-1){%>
<%}%>
<%}%>
]
</td></tr>
</table>
我觉得有必要解释一下,在上面的代码中,关于每一页对应的url是这样处理。request.getQueryString()中可能包含“q=2”这样的页码请求,也可能不包含即缺省请求第0页,所以统一用replaceAll()方法将其去掉,然后将对应的页码请求串(如“q=3”)加在qs的前面。这样做的好处是,每个模块都可以使用这个页导航,并且不会丢失url中的其他参数(例如今后加入排序功能后,url中可能包含“direction=desc”这样的参数)。
05-4-14 Update:我发现在Tomcat4.1和Websphere5.0里,request.getRequestURL()方法得到的地址是不一样的,所以考虑到兼容性,每个页码的链接都使用相对本页的链接。
在列表jsp(listClients.jsp)中,很简单的这样include它(之所以要放在<logic:notEmpty>里,是希望在没有记录可显示的时候就不显示页导航了):
<logic:notEmpty name="<%=Client.class.getName()%>">
<%@include file="/pager.jsp"%>
</logic:notEmpty>
经过上面几步的处理,我的客户列表已经可以实现分页了,效果见下图。如果在另外一个模块中也需要分页,比如部门列表时,只需要1、修改ListDeptsAction继承AbstractListAction,2、在ListDeptsAction里增加setMaxResults()和setFirstResults()方法,3、在listDepts.jsp中适当的位置include页导航,就可以了,改动是相当小的。
最后,如果希望组合查询的结果也能够分页,必须指定组合查询表单的method属性为“GET”,这样查询要求会被记录在url中,分页导航从而能够正常的工作(每次换页都将查询要求和请求的页码提交)。
楼主的实现方法感觉不是很好
设计时可以考虑以下原则:
1。分页不要和数据库打交道,不负责数据的获取,应该独立于业务
2。分页实际上可以看作只是产生一些查询条件
3。简单的分页模型
最简单在页面上只写<pagination:page />,这是设计前的代码模型定义
4。界面多样化
可以通过实现多个子类来实现不同的界面
首先,考虑分页绝大多数发生在列表时,组合查询时也需要用到。在我的项目里,列表的Action一般名字为ListXXXActioin,例如客户列表是ListClientsAction等等。在未分页前,ListXXXAction里会把所有的对象取出,通过request.setAttribute()放在request里,然后将请求转向到列表的jsp(例如listClients.jsp)显示出来(你可能会说不要在Action里放业务逻辑,但现在这不是我们考虑的重点)。而分页后,我们只取用户请求页对应的那些对象。为了最大限度的达到代码重用,我做了以下工作:
1、新建一个Pager类,该类有beginPage、endPage、currentPage、pageSize和total等int类型的属性,分别代表开始页、结束页、当前页、每页记录数和总记录数,它主要是让jsp页面显示页导航使用的。请注意currentPage属性是从0开始的。
2、新建一个AbstractListActioin类,并让所有ListXXXAction都继承它。在这个类里覆盖execute()方法,可以在这里判断权限等等,并在判断权限通过后执行一个abstract的act()方法,这个act()由ListXXXAction来实现。
3、在AbstractListAction里增加getPage()方法,用来从request得到用户请求的页码(若未请求则认为是第0页):
protected int getPage(HttpServletRequest request) {
String p = request.getParameter("p");
if (p == null)
return 0;
else
try {
return Integer.parseInt(p);
} catch (NumberFormatException e) {
return 0;
}
}
4、在AbstractListAction里增加makePager()方法,用来向request里增加一个Pager类的实例,供jsp页面显示页导航:
protected Pager makePager(HttpServletRequest request, int total) {
Pager pager=new Pager();
pager.setTotal(total);
pager.setPageSize(Config.getInstance().getPageSize());
pager.setBeginPage(0);
pager.setEndPage(((pager.getTotal()) - 1) / pager.getPageSize() + 1);
pager.setCurrentPage(getPage(request));
return pager;
}
注意在我的项目里,每页记录数是写在配置文件里的,如果你没有配置文件,上面第4行setPageSize()的参数直接填数字即可,例如pager.setPageSize(10);
5、这样,所有的ListXXXAction都可以使用getPage()得到请求的页码,并且能够方便的通过makePager()构造需要放在request里的pager对象了。现在要在从数据库取数据的代码上再做一些修改,即只取所需要的那一部分数据。由于我的项目中使用了Hibernate,所以这个修改也不是很困难。未分页前,在我的ListClientsAction里是通过构造一个Query来得到全部Client的,现在,只要在构造这个Query后再加两句(setMaxResults和setFirstResult)即可:
Query query = ;//构造query的语句
int total = ;//得到总记录数
Pager pager = makePager(request, total);//调用父类中的方法构造一个Pager实例
query.setMaxResults(pager.getPageSize());//设置每页记录数
query.setFirstResult(pager.getCurrentPage() * pager.getPageSize()); //设置开始位置
request.setAttribute(Pager.class.getName(), pager);//把pager放在request里
request.setAttribute(Client.class.getName(), query.list());
目前存在一个问题,就是在上面代码的第二句中,应该是获得总记录数,但我暂时没有特别好的办法不得到全部对象而直接得到记录数,只能很恐怖的用“int total = query.list().size();”,汗……
6、最后,我写了一个页导航的jsp页面pager.jsp,供各个显示列表的jsp来include,代码如下:
<%Pager pager=(Pager)request.getAttribute(Pager.class.getName());%>
<table width="90%" border="0" align="center" cellpadding="2" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<td bgcolor="#EEEEEE" align="right">
<bean:message key="prompt.pager" arg0="<%=String.valueOf(pager.getTotal())%>"/>
[
<%
for(int i=pager.getBeginPage();i<pager.getEndPage();i++){
if(i==pager.getCurrentPage()){
%>
<%=(i+1)%>
<%}else{
String qs=request.getQueryString()==null?"":request.getQueryString();
String op = "p="+pager.getCurrentPage();//Original page parameter expression
String np = "p="+i;//New expression
if(qs.indexOf(op)==-1)
qs=np+"&"+qs;
qs=qs.replaceAll(op,np);
%>
<a href="<%="?"+qs%>"><%=(i+1)%></a>
<%}%>
<%if(i<pager.getEndPage()-1){%>
<%}%>
<%}%>
]
</td></tr>
</table>
我觉得有必要解释一下,在上面的代码中,关于每一页对应的url是这样处理。request.getQueryString()中可能包含“q=2”这样的页码请求,也可能不包含即缺省请求第0页,所以统一用replaceAll()方法将其去掉,然后将对应的页码请求串(如“q=3”)加在qs的前面。这样做的好处是,每个模块都可以使用这个页导航,并且不会丢失url中的其他参数(例如今后加入排序功能后,url中可能包含“direction=desc”这样的参数)。
05-4-14 Update:我发现在Tomcat4.1和Websphere5.0里,request.getRequestURL()方法得到的地址是不一样的,所以考虑到兼容性,每个页码的链接都使用相对本页的链接。
在列表jsp(listClients.jsp)中,很简单的这样include它(之所以要放在<logic:notEmpty>里,是希望在没有记录可显示的时候就不显示页导航了):
<logic:notEmpty name="<%=Client.class.getName()%>">
<%@include file="/pager.jsp"%>
</logic:notEmpty>
经过上面几步的处理,我的客户列表已经可以实现分页了,效果见下图。如果在另外一个模块中也需要分页,比如部门列表时,只需要1、修改ListDeptsAction继承AbstractListAction,2、在ListDeptsAction里增加setMaxResults()和setFirstResults()方法,3、在listDepts.jsp中适当的位置include页导航,就可以了,改动是相当小的。
最后,如果希望组合查询的结果也能够分页,必须指定组合查询表单的method属性为“GET”,这样查询要求会被记录在url中,分页导航从而能够正常的工作(每次换页都将查询要求和请求的页码提交)。
楼主的实现方法感觉不是很好
设计时可以考虑以下原则:
1。分页不要和数据库打交道,不负责数据的获取,应该独立于业务
2。分页实际上可以看作只是产生一些查询条件
3。简单的分页模型
最简单在页面上只写<pagination:page />,这是设计前的代码模型定义
4。界面多样化
可以通过实现多个子类来实现不同的界面
发表评论
-
初识Firebug 全文 — firebug的使用
2009-02-09 14:53 1238http://www.ooso.net/index.php/a ... -
XmlHttp封装研究
2009-01-05 15:18 1522虽然ajax有很多很牛的框 ... -
web.xml详解
2008-12-31 18:03 6442部署描述符实际上是一 ... -
Windows下svn客户端TortoiseSVN的安装和操作
2008-12-23 17:15 2865介绍几家免费提供svn源代码管理的站点 国内: http:/ ... -
Ant入门
2008-12-19 12:07 2030一. 配置环境变量 1. 添加ANT_HOME—— ... -
xfire定义
2008-12-19 10:44 1336XFire是新一代的Java Web服 ... -
JSTL定义
2008-12-19 10:00 1002JSTL(JSP Standard Tag Lib ... -
UDDI定义
2008-12-19 09:47 1357UDDI Universal Descripti ... -
SOA定义
2008-12-19 09:47 1077向服务的体系结构(Serv ... -
SOAP定义
2008-12-19 09:43 1437soap n. (英文)肥皂 SOAP:简单对象访 ... -
XMLHttpRequest对象
2008-12-18 17:35 825<%@ page contentType="t ... -
掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求
2008-12-17 11:53 828在 Web 请求中使用 XMLHttp ... -
掌握 Ajax 系列 一 Ajax 入门简介
2008-12-16 17:17 751Ajax 由 HTML、JavaScript™ ... -
响应重定向与请求转发
2008-12-16 12:16 2146摘要在javaEE Web组件开发中,页面之间的跳转无疑是必不 ... -
Tapestry 建立自己得 Validator
2008-12-11 17:07 856今天介绍一下如何建立自己得Validator 1. 建立Val ... -
正则表达式之道
2008-12-11 17:05 1137正则表达式之道 原 ... -
ognl的学习例子
2008-12-10 14:39 2090原贴见:http://blog.csdn.ne ... -
TextArea 组件
2008-12-09 20:55 1647A) Insert 组件 e.g. <in ... -
了解 Tapestry,第 1 部分
2008-12-09 15:16 1400在这篇由两部分构成的文章的前一部分中,作者兼 develope ... -
JS中文长度校验
2008-12-05 17:23 1457function changeAlert() { v ...
相关推荐
STRUTS2+HIBERNATE分页 实现代码详细的分页实现代码实现代码详细的分页实现代码实现代码详细的分页实现代码实现代码详细的分页实现代码
struts分页算法的具体实现方法。
struts2.0实现的数据分页实现及实现分页步骤,
用Struts2+mysql实现的简单信息录入,分页查询
该资源使用struts实现分页功能,是通过Action实现中枢的作用
Struts+Hibernate实现分页.
用struts实现的分页
使用jsp+struts2实现前台分页技术
自己练习的一个struts2分页实现,代码完整,初学者可以下载看看,大家共同努力,发现问题,提升技能
struts1.2实现分页,希望能帮助大家
下面是我用Struts2做的一个分页显示实例,基本的思路是:把数据库表中的每一行数据封装成一个对象,用一个返回类型为List的方法返回这些对象,接着在Struts2的action里面定义一个List属性,用这个List来接收从数据库...
Struts分页的实现 中使用的分页思想是:先一次将所有记录查询出来,然后对List中的记录进行分页,这种分页适合数据量较小的应用情况。 对于数据量比较大的应用,应该考虑:每显示一页,执行一次查询操作,减少用户...
本代码是javaWeb中SSH框架,特别是struts中涉及到前后台对分页功能的实现,希望对您有帮助!
用struts 框架所做。分页显示。查询。插入。等。
这个也是参考别人的。。呵呵,建议大家用组件去实现分页哦。本人不会用组件。这里是简单的分页代码,是struts+jdbc实现的,欢迎大家参考!!!
struts2实现分页显示 struts2实现分页显示
自己学着用struts1.2来实现的一个简单分页代码,希望对初学者有用。
本例子用Struts+Hibernate 开发,主要实现分页功能,运行环境Myeclipse+tomcate,附有数据库和jar包。下载后直接运行
好久没写过什么东西了,最近自己在学习Java WEB方面的东西,自己想用JSP和 Struts2 HIBERNATE来写一个自己工作室的网站练练手,稍微有些收获今天写出来,与大家一起分享一下:STRUTS2+HIBERNATE实现分页是JAVA WEB最...
简单易懂的struts2实现jsp现实分页技术。