如何在Struts中进行分页处理

原创 2004年09月20日 14:15:00

如何在Struts中进行分页处理<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

最近做Struts项目涉及分页处理。下面就结合项目谈谈如何在Struts中进行分页处理。

根据需要你可以选择一次读出所有数据然后再分页,以后每次分页不再读数据。另一种方法你可以每次只读出需要显示的数据,以后每次分页分别在读其他数据。两种方法本文都将简单介绍。

先介绍第一种,数据一次读入。适合数据量小的场合,首次装载页面会比较慢。

项目片断简介:项目中需要分页的页面是RES0011页面,相对应的有RES0011AC.java(Action)RES0011AF.java(ActionForm)RES0011.jsp共三个文件。

 

一、struts-config.xml文件中应做如下配置:

<form-beans>

<form-bean name="RES0011" type="com.apps.res.RES0011AF"/>

</form-beans>

<action-mappings>

    <action path="/RES0011"

                      type="com.apps.res.RES0011AC"

                      name="RES0011" scope="session"

                      validate="true" input="/pages/COMERROR.jsp">

                      <forward name="RES0011" path="RES0011.page" />

                      <forward name="RES0010" path="/RES0010.do"/>

                      <forward name="RES0012" path="/RES0012.do"/>

                      <forward name="RES0013" path="/RES0013.do"/>

                      <forward name="RES0030" path="/RES0030.do" />

                      <forward name="RES0040" path="/RES0040.do" />

                      <forward name="RES0050" path="/RES0050.do" />

                      <forward name="RES0060" path="/RES0060.do" />

                      <forward name="RES0070" path="/RES0070.do" />

                      <forward name="SCH0016" path="/SCH0016.do"/>

                      <forward name="SCH0070" path="/SCH0070.do" />

                   <forward name="SCH0080" path="/SCH0080.do"/>

    </action>          

</action-mappings>

解释:RES0011.page其实就是RES0011.jsp,项目中由于用到了StrutsTiles功能,所以和我们常见的页面有些不同。这里可不必深究,认为他是页面就可以了。其他的<forward>都是项目需要和分页无关,大家也可以不必深究。关键要注意scope一定要设置为session,因为我们的数据都要保存在session中。如果你设置成request,那你分页的数据就会丢失。

二、ActionForm中的相关变量

分页中我们需要以下几个变量:

开始的纪录数:beginRecordNo

每页显示的记录个数:recordDivNo

所有记录的总数:allRecordNo

ActionForm中建立这些变量并产生相应的getset方法。当然,数据库中的相关内容也要有相应的变量。比如一个User信息的ArrayListArrayList中放入一个HashMapKeyUserIDValueUserName。当然你可以放入自己想要的任何东西,或者DataBean

ActionFrom的代码片断如下:

           private String recordDivNo;

 

           private String beginRecordNo;

 

           private String allRecordNo;

           /**

            * @param string

            */

           public void setAllRecordNo(String string) {

                      allRecordNo = string;

           }

           /**

            * @return

            */

           public String getAllRecordNo() {

                      return allRecordNo;

           }

           /**

            * @return

            */

           public String getBeginRecordNo() {

                      return beginRecordNo;

           }

 

           /**

            * @param string

            */

           public void setBeginRecordNo(String string) {

                      beginRecordNo = string;

           }

 

           /**

            * @return

            */

           public String getRecordDivNo() {

                      return recordDivNo;

           }

 

           /**

            * @param string

            */

           public void setRecordDivNo(String string) {

                      recordDivNo = string;

           }

三、Jsp中如何利用“二”中所描述的变量

先在Jsp中从Form里取出相应的变量

<%

           RES0011AF formRes0011 = (RES0011AF)session.getAttribute("RES0011");

           int divNum;

           String recordDivNo;

           String beginRecordNo;

           int beginRecordNoInt;

           try {

                      divNum = Integer.parseInt(formRes0011.getDivNum());

                      recordDivNo = formRes0011.getRecordDivNo();

                      beginRecordNo = formRes0011.getBeginRecordNo();

                      if (divNum == 0) {

                                 divNum = Integer.parseInt(formRes0011.getAllRecordNo());

                      }

           }

           catch(Exception e) {

                      divNum = Integer.parseInt(formRes0011.getAllRecordNo());

                      recordDivNo = formRes0011.getAllRecordNo();

                      beginRecordNo = "1";

           }

           beginRecordNoInt = Integer.parseInt(beginRecordNo) - 1;

%>

然后在Struts标签中使用:

<logic:iterate id="RES0011ID" name="RES0011" property="revContents" offset="<%=beginRecordNoInt + ""%>" length="<%=recordDivNo%>" indexId="indexOut">

<html:link action="/RES0011" paramId="pageEvt" paramName="RES0011ID" paramProperty="devDay">

<%= indexOut.intValue() + 1 %>.<bean:write name="RES0011ID" property="devName"/><br>

           </html:link>

。。。。

</logic:iterate>

 

解释:属性revContents可以认为是你定义的数据库中的内容。比如说一个UserArrayList,象我们刚才描述的那样。其中devDay属性就是UserIDdevName属性就是UserName了。给出的代码是直接从Session中取出数据,当然更专业的办法是:

<bean:define id=" beginRecordNo " name=" RES0011" property=" beginRecordNo "/>

然后再用beginRecordNo

下面是翻页的Link代码片断:

<html:link action="/RES0011" paramId="pageEvt" paramName="RES0011" paramProperty="prePage">

           <bean:message key="rf.resComm.previousNew" arg0='<%=(String)session.getAttribute("SETTING_PAGE_NUM")%>'/>

</html:link> 

 

<html:link action="/RES0011" paramId="pageEvt" paramName="RES0011" paramProperty="nextPage">

           <bean:message key="rf.resComm.nextNew" arg0='<%=(String)session.getAttribute("SETTING_PAGE_NUM")%>'/>

</html:link> 

bean:message中传的参数是我的特殊需要——每页显示多少是根据一个配置文件设置的。所以要有一个参数。如果你不是这样你的MSG有可能就是“上一页”,“下一页”。属性prePagenextPage没有什么特别的东西你只要区别出是哪一个就可以了。此值可以写在ActionFormreset方法中固定。比如上一页是p,下一页是n。有人问如果没有前页或者后页怎么办?其实这个很简单,在ActionForm中在追加一个控制变量就可以了。最后的代码好像这样:

<logic:equal  name="RES0011" property="prePageFlag" value="N">

           <html:link action="/RES0011" paramId="pageEvt" paramName="RES0011" paramProperty="prePage">

                      <bean:message key="rf.resComm.previousNew" arg0='<%=(String)session.getAttribute("SETTING_PAGE_NUM")%>'/>

           </html:link> 

</logic:equal>

<logic:notEqual  name="RES0011" property="prePageFlag" value="N">

           <bean:message key="rf.resComm.previousNew" arg0='<%=(String)session.getAttribute("SETTING_PAGE_NUM")%>'/>

</logic:notEqual>

 

<logic:equal  name="RES0011" property="nextPageFlag" value="N">

           <html:link action="/RES0011" paramId="pageEvt" paramName="RES0011" paramProperty="nextPage">

                      <bean:message key="rf.resComm.nextNew" arg0='<%=(String)session.getAttribute("SETTING_PAGE_NUM")%>'/>

           </html:link> 

</logic:equal>

<logic:notEqual  name="RES0011" property="nextPageFlag" value="N">

<bean:message key="rf.resComm.nextNew" arg0='<%=(String)session.getAttribute("SETTING_PAGE_NUM")%>'/>-->

</logic:notEqual>

 

到此,Jsp的代码就差不多了。

四、Action中的逻辑过程

首先在页面初期化的时候进行数据的读出,设置相应的变量起始显示页码一般从0开始。然后是其他的一些初始化工作。然后相应页面的Link事件,每次相应将起始页码加每页数据个数,作相应的数据正确性检查。

代码片断:

 

                                 String pageEvt = request.getParameter("pageEvt");

//还记得我们在Jsp中定义的LinkID么,对,就是pageEvt

                                            if (pageEvt.equals("p")) {

//响应上一页

                                                       int ibeginNo = Integer.parseInt(res0011Form.getBeginRecordNo());

                                                       int iRecordDivNo = Integer.parseInt(res0011Form.getRecordDivNo());

                                                       res0011Form.setBeginRecordNo(ibeginNo - iRecordDivNo + "");

                                            } else if (pageEvt.equals("n")) {

//响应下一页

                                                       int ibeginNo = Integer.parseInt(res0011Form.getBeginRecordNo());

                                                       int iRecordDivNo = Integer.parseInt(res0011Form.getRecordDivNo());

                                                       res0011Form.setBeginRecordNo(ibeginNo + iRecordDivNo + "");

                                            } else {

//画面初始化,取得所有数据

                                                       res0011Form.setBeginRecordNo("1");

                                            }

return mapping.findForward(target);

 

 

 

 

第二种方法,一次仅读入页面显示的数据。对于大数据量的访问速度令人能够接受。

了解了第一种方法,第二种方法也就不难实现。ActionForm中的结构差不多。只是Jsp中的使用不需要offset属性了。数据有多少显示多少。根据BeginRecordNo来决定从哪里开始显示数据,每次从数据库中读取数据就可以了。

 

灵活运用你还可以把两种方案结合起来,比如每次只读出500条数据然后每页显示20条。这样减少了数据库的访问次数对于海量数据的检索能够提高用户的访问速度。

 

后记:第一次写技术文章,不尽之处大家海涵。本文虽以一个项目体会的形式写出但是欢迎大家的讨论和批评指正。由于版权的原因无法将所有代码公开,大家见谅。文章只围绕技术问题进行探讨和研究,索要原代码者,也请免开尊口。最后谢谢大家。

Struts2表单回显原理,struts2表单回显

Struts2表单回显原理,struts2表单回显 问题提出:Struts2是如何帮助我们进行表单回显的? 问题解决: 首先写一个简单的测试程序 1)JSP页面主要内容如下(JSP页面名称...
  • liu1pan2min3
  • liu1pan2min3
  • 2015年08月11日 02:01
  • 1871

Struts2实现简单分页

Struts2+mysql实现简单分页
  • hoho_12
  • hoho_12
  • 2016年05月12日 16:15
  • 4281

struts2请求处理流程详解

struts2大概分为两块:一是struts2系统初始化,二是struts2处理请求,对请求作出响应。 下面就说说个人对struts2对请求处理流程的理解: 下面是StrutsPrepareAndEx...
  • xtayfjpk
  • xtayfjpk
  • 2013年10月07日 22:03
  • 2968

struts2使用 displaytag 分页异常的处理

displaytag翻页 异常ognl.InappropriateExpressionException: Inappropriate OGNL expression: (d - 443618) - ...
  • lanchengxiaoxiao
  • lanchengxiaoxiao
  • 2012年02月20日 15:52
  • 403

hibernate+Struts2+jquery easyui 做分页处理时的一些问题

合在一起做的时候,问题就多了。 1. select count(*) as col_0_0_ from JBIT.GOODS goods0_看到上面的sq...
  • chaplinlong
  • chaplinlong
  • 2016年08月08日 18:10
  • 698

使用Struts2和jQuery EasyUI实现简单CRUD系统(七)——数据分页处理

之前自己写分页的时候,分页的界面当然是自己做的,用了ejui之后,真的方便了很多。方便到什么程度了。 [html] view plaincopy t...
  • scholar_man
  • scholar_man
  • 2015年09月21日 13:48
  • 439

Struts2的分页处理

LZ最近在学Struts2 + Hibernate来写网站,但是其中有一些东西是需要新学的。其中就包括分页,首先分页这个东西是比较有意思,在Struts2来写的过程中,我们可以严格按照MVC的结构和s...
  • sun_wangdong
  • sun_wangdong
  • 2015年09月12日 15:15
  • 546

分页 在mybatis执行SQL语句之前进行拦击处理实例

比较适用于在分页时候进行拦截。对分页的SQL语句通过封装处理,处理成不同的分页sql。 实用性比较强。 import java.sql.Connection; import...
  • yyongsheng
  • yyongsheng
  • 2017年12月27日 12:05
  • 20

如何对包含图片的长文进行分页处理

手动分页
  • qq_26905989
  • qq_26905989
  • 2016年12月28日 16:20
  • 320

使用jquery.pagination.js进行分页处理

使用jquery.pagination.js进行分页处理 Html代码:                                           将上段代码放在页面的最底端...
  • yuexin2
  • yuexin2
  • 2013年12月24日 16:51
  • 3988
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在Struts中进行分页处理
举报原因:
原因补充:

(最多只允许输入30个字)