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 我心依旧 阅读(15116) 评论(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
重用性相当差  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问