Struts分页的一个实现_第1页
Struts分页的一个实现_第2页
Struts分页的一个实现_第3页
Struts分页的一个实现_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、struts分页的一个实现在web应用程序里,分页总让我们开发人员感到很头疼,倒不是因为技术上有多么困难,只是本来和业务没有太多关系的这么一个问题,你却得花不少功夫来处理。要是稍不留神,时不时出点问题就更郁闷了。我现在做的一个项目也到了该处理分页的时候了,感觉以前处理得都不好,所以这次有所改变,基本目标是在现有(未分页)的代码基础上,尽量少做修改,并且同样的代码可以应用于不同模块的分页。以下就是我用的方法: 首先,考虑分页绝大多数发生在列表时,组合查询时也需要用到。在我的项目里,列表的action一般名字为listxxxactioin,例如客户列表是listclientsaction等等。在未

2、分页前,listxxxaction里会把所有的对象取出,通过request.setattribute()放在request里,然后将请求转向到列表的jsp(例如listclients.jsp)显示出来(你可能会说不要在action里放业务逻辑,但现在这不是我们考虑的重点)。而分页后,我们只取用户请求页对应的那些对象。为了最大限度的达到代码重用,我做了以下工作:1、新建一个pager类,该类有beginpage、endpage、currentpage、pagesize和total等int类型的属性,分别代表开始页、结束页、当前页、每页记录数和总记录数,它主要是让jsp页面显示页导航使用的。请注意

3、currentpage属性是从0开始的。2、新建一个abstractlistactioin类,并让所有listxxxaction都继承它。在这个类里覆盖execute()方法,可以在这里判断权限等等,并在判断权限通过后执行一个abstract的act()方法,这个act()由listxxxaction来实现。3、在abstractlistaction里增加getpage()方法,用来从request得到用户请求的页码(若未请求则认为是第0页):protected int getpage(httpservletrequest request)   

4、;   string p = request.getparameter("p");     if (p = null)         return 0;     else         try    

5、60;         return integer.parseint(p);          catch (numberformatexception e)              return 0;    

6、60;      4、在abstractlistaction里增加makepager()方法,用来向request里增加一个pager类的实例,供jsp页面显示页导航:protected pager makepager(httpservletrequest request, int total)      pager pager=new pager();     pager.settot

7、al(total);     pager.setpagesize(config.getinstance().getpagesize();     pager.setbeginpage(0);     pager.setendpage(pager.gettotal() - 1) / pager.getpagesize() + 1);     pager.setcurrentpag

8、e(getpage(request);     return pager;  注意在我的项目里,每页记录数是写在配置文件里的,如果你没有配置文件,上面第4行setpagesize()的参数直接填数字即可,例如pager.setpagesize(10);5、这样,所有的listxxxaction都可以使用getpage()得到请求的页码,并且能够方便的通过makepager()构造需要放在request里的pager对象了。现在要在从数据库取数据的代码上再做一些修改,即只取所需要的那一部分数据。由于我的项目中使用了hibernate,所

9、以这个修改也不是很困难。未分页前,在我的listclientsaction里是通过构造一个query来得到全部client的,现在,只要在构造这个query后再加两句(setmaxresults和setfirstresult)即可:query query =  /构造query的语句  int total =  /得到总记录数  pager pager = makepager(request, total);/调用父类中的方法构造一个pager实例 que

10、ry.setmaxresults(pager.getpagesize();/设置每页记录数 query.setfirstresult(pager.getcurrentpage() * pager.getpagesize(); /设置开始位置 request.setattribute(pager.class.getname(), pager);/把pager放在request里 request.setattribute(client.class.getname(), query.list(); 目前存在一个问题,就是在上面代码的第二句中,应该是获

11、得总记录数,但我暂时没有特别好的办法不得到全部对象而直接得到记录数,只能很恐怖的用“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"

12、 cellpadding="2" cellspacing="1" bgcolor="#cccccc"><tr>    <td bgcolor="#eeeeee" align="right">    <bean:message key="prompt.pager" arg0="<

13、%=string.valueof(pager.gettotal()%>"/>        <%for(int i=pager.getbeginpage();i<=pager.getendpage();i+)    if(i=pager.getcurrentpage()    %>        <%=

14、(i+1)%>    <%else        string qs=request.getquerystring()=null?"":request.getquerystring();        string op = "p="+pager.getcurrentpage();/original

15、0;page parameter expression        string np = "p="+i;/new expression        if(qs.indexof(op)=-1)            qs=np+&quo

16、t;&"+qs;        qs=qs.replaceall(op,np);        %>        <a href="<%="?"+qs%>"><%=(i+1)%></a>    &

17、lt;%>    <%if(i<pager.getendpage()-1)%>    &nbsp;    <%><%></td></tr></table>我觉得有必要解释一下,在上面的代码中,关于每一页对应的url是这样处理。request.getquerystring()中可能包含“q=2”这样的页码请求,也可能不包含即缺省请求第0页,所以统一用replaceall()方法将其去掉,

18、然后将对应的页码请求串(如“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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论