[原创]彻底解决Struts分页显示

原创 2004年09月11日 14:26:00

彻底解决Struts分页显示

作者:李敏强  eMail: mill_lmq@tom.com<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

学习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("第一步,数据已经成功传递到Actionaction="+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"%>

<%@ 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>

<?xml:namespace prefix = html /><?xml:namespace prefix = bean />

 

5 struts-config.xml

<?xml version=<?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数据库,以及表bookname,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

 

 

手把手教你玩转QQ的原创表情

QQ的原创表情非常的可爱,做得比较精致,深受广大QQ用户的喜爱;但怎么将这些表情保存下来,好让我可以在别的地方用呢? 乖乖牛在线将从不同的视角,为你解析QQ原创表情的存储、互通、保护的机制;熟悉了这些...
  • TragicGuy
  • TragicGuy
  • 2015年10月23日 13:58
  • 1098

通过图像转换软件打造95%原创文章--真的可以告别伪原创(有点扯)

通过图像转换软件打造95%原创文章--真的可以告别伪原创   满大街都在吆喝,SEO优化什么最重要?“内容为王,外链为皇”。。。对,我也是这么认为的,可是能每天坚持写原创的又有几个呢?我相信我这篇文...
  • wuxinliulei
  • wuxinliulei
  • 2013年08月27日 13:09
  • 987

解决归档日志已满的问题

用户登陆的时候提示:ORA-00257: archiver error. Connect internal only, until freed   1. 用sys用户登录   sqlplus sy...
  • fjseryi
  • fjseryi
  • 2015年06月01日 20:28
  • 445

伪原创文章的方法

1.修改标题 标题是搜索引擎读取相关数据的第一步,因此,伪原创内容页的全新标题,搜索引擎而言对这个页面的评价也就高些。具体 的操作技巧有,添加或删减词语词组、换汤不换药(全新的描述方式,意义雷同)、同...
  • zongcaihui
  • zongcaihui
  • 2015年10月12日 15:18
  • 245

三国杀 原创之魂2016 武将技能

岑昏 吴 体力3 【极奢】出牌阶段,若你的手牌上限大于0,你可以摸一张牌,然后你本回合的手牌上限-1。结束阶段开始时,若你没有手牌,则你可以横置至多X名角色的武将牌(X为你的体力值)。 【链祸】锁...
  • cmershen
  • cmershen
  • 2016年09月05日 15:12
  • 3085

盾灵原创文章投稿系统后台绕过漏洞

代码审计之盾灵原创文章投稿系统后台绕过漏洞
  • Luosec
  • Luosec
  • 2017年06月13日 15:04
  • 424

个人订阅号认证步骤,个人公众号如何认证看这里巧妙绕过腾讯规则2天搞定认证

如何绕过腾讯规则,巧妙认证个人订阅号。
  • wqbbt0415
  • wqbbt0415
  • 2017年11月28日 11:03
  • 261

文章原创度!为什么抄袭者的网站更容易收录?

并不是你网站有文章,是你自己写的,就一定会被搜索引擎认为这是一篇原创文章,因为其中还有很多技术方面的问题,搜索引擎还未能解决。记得我曾经在一个网站每天更新一篇文章,一篇文章的字数只有100字左右,但是...
  • ilision
  • ilision
  • 2016年07月24日 22:44
  • 802

如何让百度等搜索引擎收录转载或伪原创的内容

转载的模式,对于部分站长来说,会配置制止搜索引擎收录,也即是在文章里加之nofollow属性,还有一种便是伪原创内容,大话说,部落也每每性的转载,固然,网站中的伪原创也不在少数,只不过绝大一小部分,都...
  • liuxuekai
  • liuxuekai
  • 2016年07月18日 17:05
  • 600

【fastweixin框架教程3】JAVA进行HTTPS网站访问,PKIX path building failed解决方法

上几篇文章我们谈到fastweixin使用问题和修改。   今天的问题就是使用JAVA访问HTTPS网站时候经常出现javax.net.ssl.SSLHandshakeException javax....
  • luozhuang
  • luozhuang
  • 2016年05月05日 13:29
  • 5873
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[原创]彻底解决Struts分页显示
举报原因:
原因补充:

(最多只允许输入30个字)