posts - 70,comments - 408,trackbacks - 0

              說道Struts自然是不能離開MVC模式,分頁顯示也是如此.我不知道我的算法是不是算好的,也希望看過的朋友能發表一下自己的看法,下面簡單闡述一下主要的開發思路:

          1)建立適當的模型組件,對應你要查詢數據庫中的表,這部分由熟悉的JavaBean來充當.并在其中建立數據庫查詢方法,該方法需要一個java.sql.Conntection類型的參數,并返回一個ArrayList,在本例中為Book.java,另外還有一個數據庫連接的Bean是SqlBean.java.

          2)建立分頁所需要的模型組件,也是用JavaBean,通過Book提供的ArrayList來構造,這里用的是PageBean.java.

          3)建立控制器組件,這部分由Struts的Action來實現,主要負責實例化Book,并利用返回的ArrayList對象,構造PageBean,以及接收由視圖傳遞來的action參數,從而在PageBean對象中調用不同的方法,該方法返回Book[]對象,最后將Book[]和PageBean放入到request中.本Action為PageListAction.java.

          4)建立視圖組件,這部分JSP來實現,為了不出現JAVA代碼,使用Struts提供的標簽庫,主要負責從Request中取出剛剛放入的對象,通過反復調用Action以及action參數,而實現分頁顯示,是pagetest.jsp.

          5)建立并配置struts-config.xml和web.xml文件.

          6)建立數據庫.

          我對代碼進行了實現,調試通過.如果大家有更好的用Struts實現分頁顯示的算法可以給我留言,代碼如下:

          struts-config.xml文件如下,這里配置了一個接收haha的請求提交給PageListAction

           

          <?xml version="1.0" encoding="UTF-8"?>

          <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

          <struts-config>

           

             <action-mappings>

                 <action path="/haha"

                         type="page.PageListAction"

                         scope="request">

                       <forward name="success" path="/pagetest.jsp"/>

                 </action>

              </action-mappings>

             <message-resources parameter="ApplicationResources" />

          </struts-config>

          ……………………………………………………………………………….

          Web.xml文件如下,這里配置了Web的信息,基本都是由Eclipse完成的

           

          <?xml version="1.0" encoding="UTF-8"?>

          <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

             <servlet>

                <servlet-name>action</servlet-name>

                <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

                <init-param>

                   <param-name>application</param-name>

                   <param-value>ApplicationResources</param-value>

                </init-param>

                <init-param>

                   <param-name>config</param-name>

                   <param-value>/WEB-INF/struts-config.xml</param-value>

                </init-param>

                <init-param>

                   <param-name>debug</param-name>

                   <param-value>2</param-value>

                </init-param>

                <init-param>

                   <param-name>detail</param-name>

                   <param-value>2</param-value>

                </init-param>

                <load-on-startup>2</load-on-startup>

             </servlet>

             <servlet-mapping>

                <servlet-name>action</servlet-name>

                <url-pattern>*.do</url-pattern>

             </servlet-mapping>

             <welcome-file-list>

               <welcome-file>index.jsp</welcome-file>

               </welcome-file-list>

          </web-app>

          …………………………………………………………………………

          這個是控制器Action類

           

          package page;

          import org.apache.struts.action.*;

          import javax.servlet.http.*;

          import bean.Book;

          import java.util.*;

          import javax.sql.DataSource;

          public class PageListAction extends Action {

              ArrayList arrayList=new ArrayList();

              PageBean pd;

              public ActionForward execute(ActionMapping mapping,

                                           ActionForm form,

                                           HttpServletRequest request,

                                           HttpServletResponse response)

              throws Exception {

                  String action;

                  action=request.getParameter("action");

                  if(action==null||action.equals("null")) {

                      try {

                          arrayList=Book.getAllBook();

                      }

                      catch(Exception e) {

                          e.printStackTrace();

                      }

                      pd=new PageBean(arrayList);

                      Book[] books=pd.getBooks();

                      request.setAttribute("result",books);

                      request.setAttribute("page",pd);

                  }

                  else {

                      if(action=="nextPage"||action.equals("nextPage")) {

                          Book[] books=pd.getNextPage();

                          request.setAttribute("result",books);

                          request.setAttribute("page",pd);

                      }

                      if(action=="previousPage"||action.equals("previousPage")) {

                          Book[] books=pd.getPreviousPage();

                          request.setAttribute("resule",books);

                          request.setAttribute("page",pd);

                      }

                  }

                  return mapping.findForward("success");

              }

          }

          ………………………………………………………………………………….

          這個是pagebean類,主要負責分頁算法和邏輯處理

           

          package page;

           

          import bean.Book;

          import java.util.*;

           

          public class PageBean {

              int currentPage=1;//當前頁數

              public int totalPages=0;//總頁數

              int pageRecorders=2;//每頁顯示數

              int totalRows=0;//總數據數

              int pageStartRow=0;//每頁的起始數

              int pageEndRow;//每頁的終止數

              boolean hasNextPage=false;//是否有下一頁

              boolean hasPreviousPage=false;//是否有前一頁

              ArrayList arrayList;

              Iterator it;

             

              public PageBean(ArrayList arrayList) {

                  this.arrayList=arrayList;

                  totalRows=arrayList.size();

                  it=arrayList.iterator();

                  hasPreviousPage=false;

                  currentPage=1;

                  if((totalRows%pageRecorders)==0) {

                      totalPages=totalRows/pageRecorders;

                  }

                  else {

                      totalPages=totalRows/pageRecorders+1;

                  }

                  if(currentPage>=totalPages) {

                      hasNextPage=false;

                  }

                  else {

                      hasNextPage=true;

                  }

                  if(totalRows<pageRecorders) {

                      this.pageStartRow=0;

                      this.pageEndRow=totalRows;

                  }

                  else {

                      this.pageStartRow=0;

                      this.pageEndRow=pageRecorders;

                  }

              }

             

              public void setCurrentPage(int currentPage) {

                  this.currentPage=currentPage;

              }

              public void setPageRecorders(int pageRecorders) {

                  this.pageRecorders=pageRecorders;

              }

              public void setHasNextPage(boolean hasNextPage) {

                  this.hasNextPage=hasNextPage;

              }

              public void setHasPreviosPage(boolean hasPreviosPage) {

                  this.hasPreviousPage=hasPreviousPage;

              }

           

              public String getCurrentPage() {

                  return this.toString(currentPage);

              }

              public String getTotalPages() {

                  return this.toString(totalPages);

              }

              public String getTotalRow() {

                  return this.toString(totalRows);

              }

              public int getPageRecorders() {

                  return pageRecorders;

              }

              public int getPageEndRow() {

                  return pageEndRow;

              }

              public int getPageStartRow() {

                  return pageStartRow;

              }

              public boolean isHasNextPage() {

                  return hasNextPage;

              }

              public boolean isHasPreviousPage() {

                  return hasPreviousPage;

              }

             

              public Book[] getNextPage() {

                  currentPage=currentPage+1;

                  if((currentPage-1)>0) {

                      hasPreviousPage=true;

                  }

                  else {

                      hasPreviousPage=false;

                  }

                  if(currentPage>=totalPages) {

                      hasNextPage=false;

                  }

                  else {

                      hasNextPage=true;

                  }

                  Book[] books=getBooks();

                  return books;

              }

             

              public Book[] getPreviousPage() {

                  currentPage=currentPage-1;

                  if(currentPage==0) {

                      currentPage=1;

                  }

                  if(currentPage>=totalPages) {

                      hasNextPage=false;

                  }

                  else {

                      hasNextPage=true;

                  }

                  if((currentPage-1)>0) {

                      hasPreviousPage=true;

                  }

                  else {

                      hasPreviousPage=false;

                  }

                  Book[] books=getBooks();

                  return books;

              }

             

              public Book[] getBooks() {

                  if(currentPage*pageRecorders<totalRows) {

                      pageEndRow=currentPage*pageRecorders;

                      pageStartRow=pageEndRow-pageRecorders;

                  }

                  else {

                      pageEndRow=totalRows;

                      pageStartRow=pageRecorders*(totalPages-1);

                  }

                  Book[] books=new Book[pageEndRow-pageStartRow+1];

                  int j=0;

                  for(int i=pageStartRow;i<pageEndRow;i++) {

                      Book book=(Book)arrayList.get(i);

                      books[j++]=book;

                  }

                  return books;

              }

             

              public String toString(int temp) {

                  String str=Integer.toString(temp);

                  return str;

              }

          }

          ……………………………………………………………………………….

          Book類,負責查詢數據庫,把結果放到一個ArrayList中

           

          package bean;

           

          import java.sql.*;

          import java.util.ArrayList;

           

           

          public class Book {

             

              private String bookname;

              private String author;

              private String price;

             

              public Book(String name,String author,String price) {

                  this.bookname=name;

                  this.author=author;

                  this.price=price;

              }

             

              public void setBookname(String bookname) {

                  this.bookname=bookname;

              }

              public void setAuthor(String Author) {

                  this.author=author;

              }

              public void setPrice(String price) {

                  this.price=price;

              }

             

              public String getBookname() {

                  return bookname;

              }

              public String getAuthor() {

                  return author;

              }

              public String getPrice() {

                  return price;

              }

             

              public static ArrayList getAllBook() throws Exception {

                  String sql="select * from book";

                  SqlBean sq=new SqlBean();

                  ArrayList arrayList=new ArrayList();

                  try

                  {

                      ResultSet resultSet=sq.select(sql);

                      while(resultSet.next()) {

                          String name=resultSet.getString("name");

                          String author=resultSet.getString("author");

                          String price=resultSet.getString("price");

                          Book book=new Book(name,author,price);

                          arrayList.add(book);

                      }

                      resultSet.close();

                  }

                  catch(SQLException e)

                  {

                      System.out.println("數據庫錯誤"+e.toString());

                  }

                  return arrayList;

              }

          }

          ………………………………………………………………………………..

          這個是SqlBook,負責和數據庫建立一個連接的Bean

           

          package bean;

           

          import java.sql.Connection;

          import java.sql.DriverManager;

          import java.sql.ResultSet;

          import java.sql.Statement;

           

          public class SqlBean {

              String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=eBookStore";

              Connection con=null;

              Statement sta=null;

              public SqlBean() {

                  try

                  {

                      Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

                      con=DriverManager.getConnection(url,"sa","");

                      sta=con.createStatement();

                  }

                  catch(Exception e)

                  {

                      System.out.println("連接錯誤"+e.toString());

                  }

              }

             

              public ResultSet select(String selects) throws Exception

              {

                  return sta.executeQuery(selects);

              }

          }

          …………………………………………………………………………

          這個是負責顯示分頁的JSP頁.pagetest.jsp

           

          <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>

          <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>

          <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>

          <%@ page contentType="text/html;charset=gb2312"%>

           

          <html:html locale="true">

            <head>

            </head>

           

            <body>

              <table border="1">

                <tr><th>書名</th><th>作者</th><th>價格</th></tr>

                <logic:present name="result">

                  <logic:iterate id="book" name="result" type="bean.Book">

                    <logic:present name="book">

                      <tr>

                        <td><bean:write name="book" property="bookname"/></td>

                        <td><bean:write name="book" property="author"/></td>

                        <td><bean:write name="book" property="price"/></td>

                      </tr>

                    </logic:present>

                  </logic:iterate>

                </logic:present>

              </table>

             

              <logic:present name="page">

                <logic:equal name="page" property="hasNextPage" value="true">

                  <html:link page="/haha.do?action=nextPage">nextPage</html:link>

                </logic:equal>

                <logic:equal name="page" property="hasPreviousPage" value="true">

                  <html:link page="/haha.do?action=previousPage">previousPage</html:link>

                </logic:equal>

               

                       共分<bean:write name="page" property="totalPages"/>頁顯示,當前是

                           <bean:write name="page" property="currentPage"/>頁.

              </logic:present>

            </body>

          </html:html>

          …………………………………………………………………………………

          這個是首頁的JSP頁面,只有一個連接.提交一個haha.do的請求

           

          <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>

          <%@ page contentType="text/html;charset=gb2312" language="java"%>

           

          <html:html>

            <head>

            </head>

            <body>

              <html:link action="haha.do">GotoPage</html:link>

            </body>

          </html:html>

          posted on 2005-11-12 09:13 我心依舊 閱讀(15123) 評論(25)  編輯  收藏

          FeedBack:
          # re: Struts分頁顯示
          2005-11-12 10:57 | blueleo
          這個分頁是一次性把數據都放在ArrayList中,如果數據量很大的話,這種方式有點欠妥。  回復  更多評論
            
          # re: Struts分頁顯示
          2006-03-01 21:43 | tomcat
          如果數據量很大的話,可以采用再次查詢的方式,
          但這也是用時間換取空間的辦法。  回復  更多評論
            
          # re: Struts分頁顯示
          2006-03-10 13:25 | 竹筍炒肉
          初步看了一下你的代碼,談談自己的看法:

          你的分頁首次查詢耗費的時間很多(特別當記錄很多時就會難以實現),但是當讀取下一頁,或者上一頁時,不用查詢數據庫,直接從第一次讀取的數據中拿出來,確實可以節省資源和時間。但是有點問題:注意ACTION是多線程的,當服務器啟動后會實例化一個對象常駐內存中,并且可以被多個線程調用,而你把PageBean對象和ArrayList對象作為ACTION的屬性放置(你也是利用了這個特性才能把首次查詢的記錄得以保留,以便當讀取下一頁時直接利用,不用每次都查詢數據庫),就會有線程之間爭奪資源的情況發生,也就是典型的線程同步問題,所以當多個線程并行訪問時會出錯。  回復  更多評論
            
          # re: Struts分頁顯示
          2006-03-16 08:16 | dalianfox
          @竹筍炒肉
          也是剛學struts,感覺竹筍炒肉說得很對。

          除了同步問題以外,感覺單人操作沒有問題,如果幾個人同時操作
          是不是互相影響呢?  回復  更多評論
            
          # re: Struts分頁顯示
          2006-04-26 11:38 |
          這種方法非常不妥,應該采取有限記錄數獲取方式。  回復  更多評論
            
          # re: Struts分頁顯示
          2006-06-26 14:48 | surfonline
          應當把記錄集放在session中,這樣就不會沖突了
          但是如果記錄數太多的話,效率就很低了  回復  更多評論
            
          # re: Struts分頁顯示
          2006-11-08 14:08 | bruce[匿名]
          我是用hibernate的分頁
          可以很方便的實現在持久層實現
          然后用struts實現
          你的前端我可以復用 只要該該后面就ok了
          寫的不錯
            回復  更多評論
            
          # re: Struts分頁顯示
          2007-04-02 22:48 | amen
          的確,上一頁時是不能查詢的,要解決應該怎么改呢??  回復  更多評論
            
          # re: Struts分頁顯示
          2007-04-12 16:17 |
          這種分頁有弊端的.因為ACTION類是單實例也為單線程當多人訪問是回出現頁面混亂  回復  更多評論
            
          # re: Struts分頁顯示[未登錄]
          2007-05-18 13:35 | 流水
          樓主你好,你的這段代碼如何重用?
          當你要實現很多不同頁面的分頁(不僅是book,還有班級,學生等),難道在pageBean中都要分別定義getStudents();getClasses();  回復  更多評論
            
          # re: Struts分頁顯示
          2007-09-17 15:57 | 同聲傳譯
          中外文水平俱佳; 英語八級或接近八級,其他語種譯者需具備相當專業水平;
          優先招聘有翻譯經驗且具有工科、財經和法律等實用性強的專業學位的兼職翻譯;
          優先招聘有時間保證且有非語言專業背景的自由職業者;
            回復  更多評論
            
          # re: Struts分頁顯示
          2007-11-07 17:23 | 尊重
          請幫忙 按照你的方法有再點擊下一頁時錯誤啊
          exception

          javax.servlet.ServletException: java.util.HashMap
          org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:545)
          org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:486)
          org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
          org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
          org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
          javax.servlet.http.HttpServlet.service(HttpServlet.java:697)
          javax.servlet.http.HttpServlet.service(HttpServlet.java:810)

            回復  更多評論
            
          # re: Struts分頁顯示
          2008-05-02 20:23 |
          無法實現代碼復用,不好,我用范型改了改,可沒實現有點問題  回復  更多評論
            
          # re: Struts分頁顯示
          2008-05-08 17:01 | 剛來不久
          講的非常的詳細,對于我門這樣的,剛剛接觸,不了解的人有很大的幫助,先謝謝你了,不過聽那么多前輩說了后,我現在感覺我不知道該不該照你的方法去做了,如果誰還有更好的方法,希望他能想樓主那樣,詳細的解釋完后把具體代碼都給看看,我感覺著樣理解起來對我這樣初學者是很大的幫助,希望哪位高手如果有關這方面的代碼和詳細解說,給我一份,不勝感激!謝謝!!!

          我的郵箱:

          yzg000123@sina.com  回復  更多評論
            
          # re: Struts分頁顯示
          2008-07-14 17:54 | struts初學者
          其實我作分頁的時候也是一次性把所有的數據都放入ArrayList里面的,到現在我還在找怎樣實現這樣的效果:
          首頁 上一頁 1 2 3 4 5 下一頁 尾頁
          就是怎樣將數字遍歷上去不知道了!知道的兄弟姐妹們請發:
          qulimin1988@gmail.com
            回復  更多評論
            
          # re: Struts分頁顯示[未登錄]
          2008-07-14 20:53 | javaread.com
          真擔心數據量大的時候會怎樣。。。  回復  更多評論
            
          # re: Struts分頁顯示
          2008-07-22 14:40 | struts新手
          樓主能不能加我QQ446283171,我用你的代碼出現java.lang.NullPointerException錯誤,解決不了,急!!!  回復  更多評論
            
          # re: Struts分頁顯示
          2008-08-24 14:44 | 想瘦每一天
          getAllBook似乎不太合適。用rownum控制一下應該更好些吧?
          胡亂一說:)  回復  更多評論
            
          # re: Struts分頁顯示
          2008-09-01 11:38 |
          你的分頁也太耗性能了吧, 還是考慮一下一次取出頁面要顯示的數據  回復  更多評論
            
          # re: Struts分頁顯示
          2008-09-09 13:48 | tet
          小型應用還可以,大型應用就得考慮是不是分量查詢了  回復  更多評論
            
          # re: Struts分頁顯示
          2008-12-09 21:51 | 阿春
          非常希望您好能不能給我一個,初學者多多指教!744327541@qq.com
          masterluo@eyou.com  回復  更多評論
            
          # re: Struts分頁顯示
          2009-03-28 17:23 | Struts-page
          關于previousPage的代碼有錯誤!  回復  更多評論
            
          # re: Struts分頁顯示
          2009-03-28 18:12 | Struts-page
          request.setAttribute("resule",books);

          改為

          request.setAttribute("result",books);

          要不向前翻頁顯示不吃數據!!  回復  更多評論
            
          # re: Struts分頁顯示
          2009-06-02 00:29 | sdafd
          aaa  回復  更多評論
            
          # re: Struts分頁顯示
          2009-08-03 22:19 | mastermouse
          重用性相當差  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 宁海县| 布尔津县| 斗六市| 广丰县| 监利县| 孙吴县| 平远县| 马关县| 浑源县| 台北市| 兴仁县| 嵊泗县| 从化市| 斗六市| 米脂县| 清河县| 卢湾区| 东明县| 鹤壁市| 诏安县| 温州市| 浙江省| 临海市| 辽中县| 山阳县| 桂林市| 宁德市| 红桥区| 五指山市| 永州市| 仪征市| 吉木乃县| 石狮市| 宁晋县| 夏津县| 曲水县| 阜平县| 溧水县| 九江县| 临沭县| 忻城县|