posts - 104,  comments - 34,  trackbacks - 0

          一 開發環境

          Elicpse+Struts Studio+SqlServer2000+Tomcat。

          二 開發思路

          既然講的是Struts,那自然離不了MVC,分頁顯示也是如此。

          1 建立適當的模型組件,對應你要查詢數據庫中的表。這部分由我們熟悉的javaBean來充當。并在其中建立數據庫查詢方法,該方法需要一個java.sql.Conntection類型的參數,并返回一個ArrayList。在本例中為 Book.java

          2 建立分頁所需要的模型組件,也是由javaBean來充當,通過由Book中提供的ArrayList來構造。本例中為 PageBean.java.。

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

          4建立視圖組件,這部分由jsp來充當,為了不出現java 代碼,我們使用Struts提供的標簽庫,主要負責從request中取出剛剛放入的對象,通過反復調用PageListAction以及action參數,而實現分頁顯示。本例中為pagetest.jsp.

          5 建立并配置struts-config.xml。

          6 建立數據庫。

          三 實例代碼

          1 Book.java

          package bean;
          import java.sql.*;
          import java.util.ArrayList;
          /**
           * @作者 李敏強
           * Struts分頁顯示數據Bean,對應數據庫中Book表
           */
          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 String getAuthor() {
            return author;
           }

           public void setAuthor(String author) {
            this.author = author;
           }

           public String getBookname() {
            return bookname;
           }

           public void setBookname(String bookname) {
            this.bookname = bookname;
           }
           
           public String getPrice(){
               return this.price;
           }
           
           public void setPrice(String price){
               this.price=price;
           }
           
           public static ArrayList getAllBook(Connection connection){
             String sql="select * from book";
             ArrayList arrayList = new ArrayList();
             try{
             Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
             ResultSet resultSet = statement.executeQuery(sql); 
                   System.out.println("BookBean 數據查詢已完成!");
                while(resultSet.next())
                { 
                  String name = resultSet.getString("name");
                  String author = resultSet.getString("author");
                  String price = resultSet.getString("price");
                  System.out.println("開始數據封裝:name="+name+"author="+author+"price="+price);
                  Book book = new Book(name,author,price);      
                  arrayList.add(book);
                }
              connection.close();
              resultSet.close();
             }catch(SQLException e)
             {
              System.out.println("數據庫異常"+e.toString());
             }

                return arrayList;
           }
          }

          2 PageBean.java

          package page;
          import bean.Book;
          import java.util.*;
          /**
           * @作者 李敏強
           * Struts分頁顯示邏輯Bean
           */
          public class PageBean {

           int currentPage=1;  //當前頁
          public int totalPages=0;  //總頁數
           int pageRecorders=5;//每頁5條數據
           int totalRows=0;  //總數據數
           int pageStartRow=0;//每頁的起始數
           int pageEndRow=0;  //每頁顯示數據的終止數
           boolean hasNextPage=false; //是否有下一頁
           boolean hasPreviousPage=false; //是否有前一頁
           ArrayList arrayList;
           Iterator it;
          public PageBean(){}
           
          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;  
              }

          }

           /**
            * @return Returns the currentPage.
            */
           public String getCurrentPage() {
            return this.toString(currentPage);
           }
           /**
            * @param currentPage The currentPage to set.
            */
           public void setCurrentPage(int currentPage) {
            this.currentPage = currentPage;
           }
           /**
            * @return Returns the pageRecorders.
            */
           public int getPageRecorders() {
            return pageRecorders;
           }
           /**
            * @param pageRecorders The pageRecorders to set.
            */
           public void setPageRecorders(int pageRecorders) {
            this.pageRecorders = pageRecorders;
           }
           /**
            * @return Returns the pageEndRow.
            */
           public int getPageEndRow() {
            return pageEndRow;
           }
           /**
            * @return Returns the pageStartRow.
            */
           public int getPageStartRow() {
            return pageStartRow;
           }
           /**
            * @return Returns the totalPages.
            */
           public String getTotalPages() {
           
            return this.toString(totalPages);
           }
           /**
            * @return Returns the totalRows.
            */
           public String getTotalRows() {
            return this.toString(totalRows);
           }
           /**
            * @return Returns the hasNextPage.
            */
           public boolean isHasNextPage() {
            return hasNextPage;
           }
           /**
            * @param hasNextPage The hasNextPage to set.
            */
           public void setHasNextPage(boolean hasNextPage) {
            this.hasNextPage = hasNextPage;
           }
           /**
            * @return Returns the hasPreviousPage.
            */
           public boolean isHasPreviousPage() {
            return hasPreviousPage;
           }
           /**
            * @param hasPreviousPage The hasPreviousPage to set.
            */
           public void setHasPreviousPage(boolean hasPreviousPage) {
            this.hasPreviousPage = hasPreviousPage;
           }
          public Book[] getNextPage(){
           
           currentPage=currentPage+1;
           System.out.println("PageBean.getNextPage()正在執行;");
           System.out.println("參數currentPage="+currentPage);

           if((currentPage-1)>0)
           {
            hasPreviousPage=true;
           }
              else
              {
               hasPreviousPage=false;
              }
           
           if(currentPage>=totalPages)
           {
            hasNextPage=false;
           }
           else
           {
            hasNextPage=true;
           }
           System.out.println("參數hasNextPage="+hasNextPage);
           System.out.println("準備執行PageBean.getBooks()");
           Book[] books=getBooks();
           this.description();
           
           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();
           this.description();
           return books;
          }

          public Book[] getBooks(){
           System.out.println("pageBean.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];
           
           System.out.println("pageStartRow="+pageStartRow);
           System.out.println("pageEndRow="+pageEndRow);
            int j=0;
           for(int i=pageStartRow;i<pageEndRow;i++)
           {
           
            Book book=(Book)arrayList.get(i);
            books[j++]=book;
           
           }
           System.out.println("要顯示的頁面數據已經封裝,具體信息如下:");
           this.description();
           return books;
          }

          public String toString(int temp)
          {
          String str=Integer.toString(temp);
          return str;
          }

          public void description()
          {

             String description="共有數據數:"+this.getTotalRows()+

             "共有頁數: "+this.getTotalPages() +

             "當前頁數為:"+this.getCurrentPage()+
            
             " 是否有前一頁: "+this.isHasPreviousPage() +

             " 是否有下一頁:"+this.isHasNextPage()+

             " 開始行數:"+this.getPageStartRow()+

             " 終止行數:"+this.getPageEndRow();

             System.out.println(description);

          }
          }

          3  PageListAction.java

          package page;
          import org.apache.struts.action.*;
          import javax.servlet.http.*;
          import comm.Constants;

          import bean.Book;
          import java.util.*;
          import javax.sql.DataSource;
          /**
           * @author 李敏強
           * Struts分頁顯示Action
           */
          public class PageListAction extends Action {

           public PageListAction(){}
           ArrayList arrayList=new ArrayList();
              PageBean pb;
           
           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{
          DataSource datasource=this.getDataSource(request,Constants.DATASOURCE_KEY);   
          arrayList=Book.getAllBook(datasource.getConnection());
          System.out.println("第一步,數據已經成功傳遞到Action,action="+action);
             }catch(Exception e){
                    e.printStackTrace();
            System.out.println("數據庫連接出現異常");
                }
            
               pb=new PageBean(arrayList);
                    Book[] books=pb.getBooks();
                    pb.description();
                    request.setAttribute("result",books);
                    request.setAttribute("page",pb);
                            
             }
             else
             {
            if(action=="nextPage" || action.equals("nextPage"))
            {
            System.out.println("參數action="+action);
            System.out.println("函數pb.getNextPage()準備執行");
            Book[]books=pb.getNextPage();
            request.setAttribute("page",pb);
           request.setAttribute("result",books);  
              }
          if(action=="previousPage" || action.equals("previousPage"))
            {
            System.out.println("參數action="+action);
            System.out.println("函數pb.getPreviouspage()準備執行");
            Book[] books=pb.getPreviouspage(); 
            request.setAttribute("page",pb);
                         request.setAttribute("result",books);
             
              }
             }
             return (mapping.findForward("success"));
            }
          }

          4 pagetest.jsp

          <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
          <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
          <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
          <%@ page contentType="text/html; charset=gb2312" language="java"%>

          <html:html locale="true">
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
          </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:equal name="page" property="hasNextPage" value="true">
          <html:link page="/page.do?action=nextPage">nextPage</html:link>
          </logic:equal>
          <logic:equal name="page" property="hasPreviousPage" value="true">
          <html:link page="/page.do?action=previousPage">PreviousPage</html:link>
          </logic:equal>
          共有數據總數<bean:write name="page" property="totalRows"/>;
          共分<bean:write name="page" property="totalPages"/>頁,當前是第
          <bean:write name="page" property="currentPage"/>頁
          </body>
          </html:html>

          5 struts-config.xml

          <?xml version="1.0" encoding="ISO-8859-1" ?>

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

          <struts-config>
           <data-sources>
            <data-source key="dataSource" type="org.apache.commons.dbcp.BasicDataSource">
             <set-property property="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>
             <set-property property="url" value="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=eBookStore;SelectMethod=cursor"/>
             <set-property property="username" value="limq"/>
             <set-property property="password" value="1"/>
             <set-property property="maxActive" value="10"/>
             <set-property property="maxWait" value="5000"/>
             <set-property property="defaultAutoCommit" value="true"/>
             <set-property property="defaultReadOnly" value="false"/>
            </data-source>
           </data-sources>
            <form-beans>
            </form-beans>
            <global-forwards>
            </global-forwards>
            <action-mappings>
            <action path="/page" type="page.PageListAction" scope="request">
            <forward name="success" path="/pagetest.jsp"/>
            </action>
            </action-mappings>
            <controller>
            </controller>
          </struts-config>

          6 建立eBookStore數據庫,以及表book(name,author,parce);其中數據的配置可以根據你的不同情況在struts-config.xml中而定。

          7 Constants.java

          package comm;

          /**
           * this interface provides the constant string for applicator constant
           */
          public class Constants {
            /**
              * name of the User Object in HttpSession
              */
             public static String USER_KEY="user";
             /**
              * dataSource name
              */
             public static String DATASOURCE_KEY="dataSource";
          }

          posted on 2007-08-09 01:01 末日風情 閱讀(981) 評論(2)  編輯  收藏 所屬分類: struts

          FeedBack:
          # re: 解決Struts 分頁顯示
          2007-08-26 09:49 | pure
          在struts中分頁有兩種結構:
          1. 在Action中通過DAO查詢出所有的記錄,然后加到session或request對象中,傳到客戶端,由JSP進行分頁。
          這種方法對于在數據量少的時候很方便,也不影響速度。
          2.在Action中每次通過DAO只查詢出一頁的記錄,再傳給JSP頁面。
          這種結構對于數據量大的程序很好,但對于數據量小的情況,會增加對服務器的請求,加大服務器的負載。
            回復  更多評論
            
          # re: 解決Struts 分頁顯示
          2007-08-29 17:34 | dreamstone
          其實可以折中一下,比如一次查出200條記錄,不足200的話就有多少是多少。然后存到java端來分頁。不過這個分頁的頁數和一次查出數之間需要根據經驗來算比例。比如80%的人需要翻3頁,每頁20 那一次查出60就好了。讓大多數人查一次。


            回復  更多評論
            

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


          網站導航:
           
          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 张家界市| 连山| 嘉义市| 金华市| 龙胜| 武夷山市| 宜宾县| 莎车县| 正宁县| 延津县| 淄博市| 洛阳市| 万年县| 彭泽县| 青阳县| 睢宁县| 呼和浩特市| 濮阳市| 金寨县| 阿图什市| 富顺县| 乌兰察布市| 鞍山市| 资中县| 吉林省| 郁南县| 抚顺市| 茶陵县| 称多县| 常熟市| 太白县| 土默特右旗| 桂林市| 眉山市| 民丰县| 那曲县| 顺义区| 油尖旺区| 晋城| 汽车| 清河县|