装甲第十二旅简介:Matrix - 与 Java 共舞 - 解决Struts分页显示

来源:百度文库 编辑:九乡新闻网 时间:2024/05/05 15:47:22
  • 注册   用户中心
  • 登陆   帮助中心
  • 专题wiki   文档wiki
  • 站内搜索  站内短信
  • Matrix首页
  • Java文栏
  • 业界新闻
  • 部落格
  • 资源下载
  • Java 论坛
  • 解决Struts分页显示

    mill_lmq 发表于 2004-09-11
    点击数:7533 评论数:5 评价:17/9
    关键词:struts

    摘要:

    文章工具

    收藏
    投票评分
    发表评论
    复制链接
    解决Struts分页显示
    作者:李敏强  eMail: mill_lmq@tom.com

    学习Struts已经有2个多月了,前几天群里的朋友问我Struts分页显示的问题,觉得好像与在jsp中的差不多,但还是遇到了这样那样的问题,好不容易花了几天时间把问题都搞清楚,觉得还是写点东西跟大家分享一下的好!
    至于Struts的语法这里就不多介绍了,不懂的朋友可以先看网上的其他文章。

    一 开发环境
    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
        {
        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
                    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<>
            {
            
             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"%>








    书名作者价格













    nextPage


    PreviousPage

    共有数据总数;
    共分页,当前是第




    5 struts-config.xml


              "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
              "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">



      
      
      
      
      
      
      
      
      
      


      
      

      
      

      
      
      
      
      
      
      



    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";
    }

    好了,全部代码我已经贴完了,难免有不妥的地方,如果您有好的意见或者建议请跟我联系,在下将感激不尽!! mill_lmq@tom.com



    本页面地址:

    →投票评分

         非常好 还行 一般 扔鸡蛋          总得分:17 / 投票人次:9

    →用户评论列表

    #5522 评论作者:游客 发表时间:2005-11-01 10:22
    这样写,对于大量数据的处理可能行不通,效率会太差,你一次将所有的记录集不加处理的都取出来了
    #4912 评论作者: qiqijava 发表时间:2005-10-10 11:19
    displayTag标签在大数据量的时候也是有问题,不如valueList做得好
    #4895 评论作者:nancy 发表时间:2005-10-09 05:25
    用displaytag就可以实现了,何必这么麻烦呢?
    #3530 评论作者: hai 发表时间:2005-06-30 01:41
    数据库连接池连接那块能说的详细点吗,比如SQL Server的配置之类的,因为我试了一下,就是连不通,各位大哥有什么高见,麻烦告诉一下小弟,谢谢。
    #3409 评论作者: lisenhua 发表时间:2005-06-15 02:54
    还不错,就是效率低一点
    #2583 评论作者: java3112000 发表时间:2005-02-28 08:00
    E-mail:java3112000@yahoo.com.cn
    大哥这个实现是不是错了啊,PageListAction中的PageBean pb;是每个实例共享的啊
    #2191 评论作者: markleung 发表时间:2004-12-02 10:41
    我之前自己也实现过这样的功能,是参考valuelist的设计模式的,服务器每次只会返回指定页及每页可显示记录条数的记录集,说白了就是一个记录容器。比这个设计好多了。
    #2037 评论作者: JAVA->J2EE 发表时间:2004-10-23 07:50
    太差劲了,这样也算是分页,还不是把所有的数据查出来,要是我有10万条数据的话,那不知道有多慢
    #1854 评论作者: Creatxr 发表时间:2004-09-15 09:58
    姓名:dylan  E-mail:zwh@cneportal.net  发表时间:2004年9月14日 9时28分
    评论内容:struts分页用插件就好了
    =========================
    请问,是什么插件?
    #1849 评论作者: ansam 发表时间:2004-09-14 10:24
    如果用struts标签库来做可能不更简单点。
    我们要充分挖掘出struts的功能,而不能只说
    Struts而不用struts,这样会让struts开发人员
    伤心的 ^_^
    #1842 评论作者: swenker 发表时间:2004-09-14 03:15
    代码质量也太差了吧
    #1832 评论作者: dylan 发表时间:2004-09-14 09:28
    struts分页用插件就好了
    #1831 评论作者: jackchen_lq 发表时间:2004-09-14 08:50
    不就是打着mvc的幌子,但是真正用来实现的还是模式1的规范!只有一小部分用到了struts的mvc!
    从全局来说,使用data-source的方式来连接数据库,对于初学者没有多大的帮助,相反的应该使用一些最基本的方法来连接数据库,你的这篇文章又会添色不少!
    纯属个人意见!
    #1821 评论作者: mill_lmq 发表时间:2004-09-12 09:59
    不好意思,标题是有点夸张。
    下次我会注意的!!
    #1818 评论作者: alankim 发表时间:2004-09-12 08:08
    标题太夸张了~~~
    #1810 评论作者: hantsy 发表时间:2004-09-11 06:18
    你这个根本没有利用struts的特性,分页显示还是看一下pager,和display两个tag...标题太夸张。。。
    #1808 评论作者: 刘正仁 发表时间:2004-09-11 05:37
    谢谢你,我刚学struts,不是很懂,下下来慢慢看

    →发表我的评论 (评论可增加个人积分...)

    用户*:Email:评论内容*:

    支持BBCode    
    关于我们  |  版权声明  |  系统管理  |  返回顶部
      ICP:粤B2-20040367