CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2EE / EJB / JMS

求助! Struts分页的实现例子

楼主chaoqunjiang(爱生活爱JAVA)2005-04-02 01:19:06 在 Java / J2EE / EJB / JMS 提问

在google上搜索了,来回都是那几个,   想要一份比较成熟的解决方案   分不够可以再加  
  请帮忙     谢谢~! 问题点数:100、回复次数:15Top

1 楼chaoqunjiang(爱生活爱JAVA)回复于 2005-04-02 01:19:34 得分 0

自己先顶~  
  Top

2 楼chaoqunjiang(爱生活爱JAVA)回复于 2005-04-02 01:48:30 得分 0

或者发到我邮箱   chaoqunjiang@163.com     谢谢Top

3 楼taglib(不懂就是不懂,别不懂装懂)回复于 2005-04-02 02:49:34 得分 0

Paging   long   lists    
  http://www.javaworld.com/javaworld/jw-07-2004/jw-0726-pagination.htmlTop

4 楼chaoqunjiang(爱生活爱JAVA)回复于 2005-04-02 11:28:40 得分 0

上面这个是基于DAO的呀Top

5 楼wingtrace(虽然生活很艰苦,但是我们也不能做禽兽)回复于 2005-04-02 11:52:04 得分 0

一般都是采用PageController+数据库SQL方言特征的分页方案,其实很容易,自己写都没问题。  
   
  像Oracle是利用rownum伪列,Mysql是利用limit关键字,MsSql是利用top关键字等等。Top

6 楼chaoqunjiang(爱生活爱JAVA)回复于 2005-04-02 11:59:20 得分 0

谢谢楼上,   我尝试一下     :)Top

7 楼joybo()回复于 2005-04-02 12:15:16 得分 10

我这儿有以前用过的两个类,可以参考一下:  
  Pages.java:  
  package   com.myproject.db;  
  import   java.sql.*;  
  public   abstract   class   Pages   {  
      String   filename   =   "";   //Jsp文件名  
      int   pages   =   1;   //页号  
      int   totals   =   0;   //记录总数  
      int   perpagenum   =   20;   //每页显示记录数  
      int   style   =   0;   //分页字符串样式  
      int   allpage   =   1;   //总页数  
      int   cpage   =   1;   //当前页  
      int   spage   =   1;   //开始记录数  
      String   sSQL   =   "";   //SQL语句  
      String   listPageBreak   =   "";   //用于页面显示的html语句  
      String[]   pagesign   =   {  
              "",   "",   "",   "",   "",   "",   "",   ""};   //显示的字符列表(如:“首页”、“上一页”、“下一页”、“尾页”)  
      public   Pages()   {  
      }  
      public   String   getFileName()   {  
          return   this.filename;  
      }  
      public   void   setFileName(String   aFileName)   {  
          this.filename   =   aFileName;  
      }  
      public   int   getPages()   {  
          return   this.pages;  
      }  
      public   void   setPages(int   aPages)   {  
          this.pages   =   aPages;  
      }  
      public   int   getTotals()   {  
          return   this.totals;  
      }  
      public   void   setTotals(int   aTotals)   {  
          this.totals   =   aTotals;  
      }  
      public   int   getPerPageNum()   {  
          return   this.perpagenum;  
      }  
      public   void   setPerPageNum(int   aperpagenum)   {  
          this.perpagenum   =   aperpagenum;  
      }  
      public   int   getStyle()   {  
          return   this.style;  
      }  
      public   void   setStyle(int   aStyle)   {  
          this.style   =   aStyle;  
      }  
      public   void   setSQL(String   SQL)   {  
          this.sSQL   =   SQL;  
      }  
      public   void   setPagesign(String[]   apagesign)   {  
          this.pagesign   =   apagesign;  
      }  
      public   void   doPageBreak()   {  
          this.allpage   =   (int)   Math.ceil(   (this.totals   +   this.perpagenum   -   1)   /  
                                                                        this.perpagenum);  
          int   intPage   =   this.pages;  
          //如果输入的页号大于总页数     设置当前页为1,否则当前页设置为输入的页号  
          if   (intPage   >   this.allpage)   {   //   pages   ==   0  
              this.cpage   =   1;  
          }  
          else   {  
              this.cpage   =   intPage;  
          }  
          //开始记录数  
          this.spage   =   (this.cpage   -   1)   *   this.perpagenum;  
          getPageBreakStr();  
      }  
   
      //用于页面显示的html语句  
      public   String   getListPageBreak()   {  
          return   this.listPageBreak;  
      }  
   
      //得到要显示的字符列表(如:“首页”、“上一页”、“下一页”、“尾页”)  
      public   void   getPageBreakStr()   {  
          //style   ==   0时:显示如“上一页”、“下一页”(有链接)  
          if   (this.style   ==   0)   {  
              if   (this.cpage   >   1)   {  
                  this.listPageBreak   +=   "[<a   href='"   +   this.filename   +   "pages="   +  
                          (cpage   -   1)   +  
                          "'><font   color=#FF0000>"   +  
                          pagesign[1]   +   "</font></a>]";  
              }  
              if   (this.cpage   <   this.allpage)   {  
                  this.listPageBreak   +=   "[<a   href='"   +   this.filename   +   "pages="   +  
                          (cpage   +   1)   +  
                          "'   ><font   color=#FF0000>"   +  
                          pagesign[2]   +   "</font></a>]";  
              }  
          }  
          //style   ==   1时:显示带图片的“上一页”、“下一页”(有链接)  
          if   (this.style   ==   1)   {  
              if   (this.cpage   >   1)   {  
                  this.listPageBreak   +=  
                          "<img   src=images/prepage.gif     align=absmiddle><font   color=#FF0000>[<a   href='"   +  
                          this.filename   +   "pages="   +  
                          (cpage   -   1)   +   "'><font   color=#FF0000>"   +  
                          pagesign[1]   +   "</font></a>]</font>";  
              }  
              if   (this.cpage   <   this.allpage)   {  
                  this.listPageBreak   +=  
                          "<img   src=images/nextpage.gif     align=absmiddle><font   color=#FF0000>[<a   href='"   +  
                          this.filename   +   "pages="   +  
                          (cpage   +   1)   +   "'><font   color=#FF0000>"   +  
                          pagesign[2]   +   "</font></a>]</font>";  
              }  
          }  
          //style   ==   2时:显示如“首页”、“上一页”、“下一页”、“尾页”(有链接)  
          if   (this.style   ==   2)   {  
              if   (this.cpage   >   1)   {  
                  this.listPageBreak   +=  
                          "[<a   href='"   +   this.filename   +  
                          "pages=1'><font   color=#FF0000>"   +  
                          pagesign[0]   +  
                          "</font></a>]   [<a   href='"   +   this.filename   +   "pages="   +   (cpage   -   1)   +  
                          "'><font   color=#FF0000>"   +  
                          pagesign[1]   +   "</font></a>]";  
              }  
              if   (this.cpage   <   this.allpage)   {  
                  this.listPageBreak   +=   "[<a   href='"   +   this.filename   +   "pages="   +  
                          (cpage   +   1)   +  
                          "'><font   color=#FF0000>"   +  
                          pagesign[2]   +  
                          "</font></a>]   [<a   href='"   +   this.filename   +   "pages="   +  
                          this.allpage   +  
                          "'><font   color=#FF0000>"   +  
                          pagesign[3]   +   "</font></a>]";  
              }  
          }  
          //style   ==   3时:显示更多信息(有链接)  
   
      }  
   
  //得到一个sql字符串  
      public   abstract   String   getSQLString(String   pk);  
   
  //获得记录集  
      public   abstract   ResultSet   getRs(TranContext   DBSQL,   String   pk);  
  }  
   
  mysql数据库的分页:  
  MySQLPages.java:  
   
  package   com.myproject.db;  
  import   java.sql.ResultSet;  
  import   org.apache.log4j.*;  
  public   class   MySQLPages  
          extends   Pages   {  
      static   Logger   logger   =   Logger.getLogger(MySQLPages.class.getName());  
      public   MySQLPages()   {  
      }  
      /**  
        *   重写父类的方法获得记录集  
        *   @param   DBSQL  
        *   @param   pk  
        *   @return  
        */  
      public   ResultSet   getRs(TranContext   DBSQL,   String   pk)   {  
          String   SQL   =   "";  
          ResultSet   rs   =   null;  
          try   {  
              SQL   =   this.getSQLString(pk);  
              //logger.info(SQL);  
              DBSQL.prepareStatement(SQL);  
              rs   =   DBSQL.executeQuery();  
              return   rs;  
          }  
          catch   (Exception   e)   {  
              logger.error(e);  
              return   null;  
          }  
      }  
   
      /**  
        *   重写父类的方法得到一个sql字符串  
        *   @param   pk  
        *   @return  
        */  
      public   String   getSQLString(String   pk)   {  
          String   sql   =   this.sSQL;  
          //spage开始的记录数     perpagenum每页显示的记录数     该语句显示从spage开始的perpagenum条纪录  
          sql   =   sql   +   "   limit   "   +   spage   +   ","   +   perpagenum;  
          return   sql;  
      }  
  }  
   
  Top

8 楼wingtrace(虽然生活很艰苦,但是我们也不能做禽兽)回复于 2005-04-02 12:18:57 得分 0

public   static   final   String   MYSQL_PAGING_APPEND   =    
                  "   LIMIT   ?,   ?";  
           
          public   static   final   String   ORACLE_PAGING_HEADER   =  
                  "SELECT   *   FROM(SELECT   ORI.*,   rownum   r   FROM(";  
           
          public   static   final   String   ORACLE_PAGING_TAIL   =  
                  ")   ORI WHERE   rownum   <=   ?)   PAGED   WHERE   r   >=   ?";  
  -------------------------------------------  
  上面是经典的MySQL和Oracle分页SQL,这里就直接给你了。  
   
  假设你的查询SQL为   BUSINESS_SQL,那么,  
   
  对于MySQL,只要将你的   BUSINESS_SQL   +   MYSQL_PAGING_APPEND   然后再设置参数即可。  
   
  对于Oracle则是   ORACLE_PAGING_HEADER   +   BUSINESS_SQL   +   ORACLE_PAGING_TAIL   。  
   
  很easy吧?Top

9 楼chaoqunjiang(爱生活爱JAVA)回复于 2005-04-02 12:59:47 得分 0

有SQL   SERVER   的么   ?呵呵Top

10 楼chaoqunjiang(爱生活爱JAVA)回复于 2005-04-04 22:05:46 得分 0

希望大家继续帮忙     谢谢Top

11 楼wingtrace(虽然生活很艰苦,但是我们也不能做禽兽)回复于 2005-04-04 23:58:37 得分 0

SQL   SERVER一般都用存储过程做,google一下“sql   server   分页   存储过程”,能找到许多。  
   
  btw,我个人不喜欢把html元素捆绑在分页控制器里面,一来分页类看起来很杂乱,二来也破坏了view和control分离的原则。Top

12 楼wingtrace(虽然生活很艰苦,但是我们也不能做禽兽)回复于 2005-04-05 00:06:28 得分 50

分页原理在数据库层面上都是一样的,无非是利用具体数据库提供的一些相关特性来实现而已。  
   
  分页真正难的地方还是在于mvc三个角色的定位和分离,如何降低耦合度,使程序结构明朗,扩展和维护方便。  
   
  我的做法是效仿entitybean类/实例与数据库表/记录的关系,把分页控制类作为每一个实际页面的抽象,每一个分页控制类的实例就是每个页面上所应该输出的数据(包括页面控制信息),在java代码里面不包含任何view元素。Top

13 楼discolt(枫)回复于 2005-04-05 00:41:39 得分 40

我做了一个Webwork的分页组件,比以前Struts的爽多了。  
  只需一个Action和创建自己的创建页面调用的接口即可。  
   
  //   webwork的Action  
  public   class   UserPageAction   implements   Action   {  
   
          TurnPageParam   go   =   new   TurnPageParam();  
   
          public   TurnPageParam   getGo()   {  
                  return   go;  
          }  
   
          public   String   execute()   {  
                  PageService   pageService   =   PageServiceFactory.forAction(this).getPageService();  
                  pageService.setPageCreator(new   UserPageCreator());  
                  pageService.turnPage(go);  
                  return   SUCCESS;  
          }  
  }  
  //   页面创建器  
  public   class   UserPageCreator   implements   PageCreator   {  
   
          public   Page   createPage(PageController   pc)   {  
                  UserDao   userDao   =   (UserDao)   AppContext.getBean("userDaoImpl");  
                  return   userDao.listUsers(pc.getStartRow(),   pc.getMaxRow());  
          }  
   
  }  
   
  //   最后用Spring   描述一下你创建页面,页面控制器放在session里的名称即可。  
  <beans>  
  <description>Spring   Work   -   页面组件</description>  
   
  <bean   id="pageService"  
  class="orange.framework.page.webwork.PageService"   singleton="false">  
  <property   name="pageSize">  
  <value>15</value>  
  </property>  
  <property   name="pageName">  
  <value>userPage</value>  
  </property>  
  <property   name="pageControllerName">  
  <value>userPageController</value>  
  </property>  
  </bean>  
  </beans>  
   
  Webwork的Action由于脱离了http对象(request,   response   .),所以运用起来更灵活。Top

14 楼discolt(枫)回复于 2005-04-05 00:45:01 得分 0

userList.jsp  
  <%--    
    -   对应配置文件,取得session中的页面对象中的集合和  
    -   页面控制器对象,并将这两个对象置入request作用域.  
  --%>  
  <ww:set   name="list"   value="#session.userPage.list"   scope="request"/>  
  <ww:set   name="pageController"   value="#session.userPageController"   scope="request"/>  
   
  <ww:iterator   value="#request.list">    
  userId:   <ww:property   value="userId"   />      
  userName:   <ww:property   value="userName"   />    
  <br>  
  </ww:iterator>  
   
   
  <%--   传递翻页路径给分页控制器   --%>  
  <jsp:include   page="pageController.jsp">  
  <jsp:param   name="action"   value="/user/list.action"/>  
  </jsp:include>  
  </html>  
   
  pageController.jsp  
  <%@   taglib   uri="webwork"   prefix="ww"   %>  
   
  <%  
  String   action   =   request.getContextPath()    
  +   request.getParameter("action")  
  +   "?go.viewPage=";  
  %>  
  <ww:iterator   value="#request.pageController.currentRangePages">  
  <a   href="<%=   action%><ww:property/>">  
  <ww:property/>  
  </a>  
  </ww:iterator>Top

15 楼discolt(枫)回复于 2005-04-05 01:10:26 得分 0

输出结果像这样:  
   
  1:   JOHN  
  2:   COOL  
  3:   JAKE  
  4:   ROSE  
  ...  
   
  12345  
   
  用1,2,3,4,5控制页面的跳转,当然可以加前一页后一页什么的,他们只是pageController的一个属性而已。Top

相关问题

  • 谁有Struts分页的例子啊?
  • 求一个简单的dataReader实现分页的vbscript例子
  • 100分求STRUTS实现分页源码或控件
  • struts分页怎么实现,高手给我实例,谢先啊~~~~~~!
  • 关于struts下高效分页的实现
  • 请问如何实现数据分页,可以给个简单例子吗
  • Struts+Spring+Hibernate分页
  • 求sql分页的例子
  • 那位高手能给我写一个Struts的分页例子吖?小弟谢谢了:)
  • DATALIST如何实现分页?

关键词

  • pagecontroller
  • 利用

得分解答快速导航

  • 帖主:chaoqunjiang
  • joybo
  • wingtrace
  • discolt

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo