如何在Struts中進行分頁處理

如何在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條。這樣減少了數據庫的訪問次數對於海量數據的檢索能夠提高用戶的訪問速度。

 

後記:第一次寫技術文章,不盡之處大家海涵。本文雖以一個項目體會的形式寫出但是歡迎大家的討論和批評指正。由於版權的原因無法將所有代碼公開,大家見諒。文章只圍繞技術問題進行探討和研究,索要原代碼者,也請免開尊口。最後謝謝大家。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章