`
mr.shang
  • 浏览: 38750 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自己优化的struts分页

阅读更多
前几天突然想到优化一个分页,结果做了大半天,觉得还不错,分享一下。
这是PageBean
import java.util.ArrayList;
import java.util.List;


public class PageBean extends BaseBean{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
		    
            private int currentPage=1;//当前页
	    private int totalPages=0;//总页数
	    private int pageSize=11;//每页显示条数
	    private int totalRows=0;//总条数
	    private int pageStartRow=0;//开始条数
	    private int pageEndRow=0;//结束条数
	    private boolean hasNextPage=false;//是否存在下一页
	    private boolean hasPreviousPage=false;//是否存在上一页
	    private boolean hasNextNextPage=false;//是否存在上上一页(一次跳转10页)
	    private boolean hasPreviousPreviousPage=false;//是否存在下下一页(一次跳转10页)
	    private int nextPage=0;//下一页的页号
	    private int perviousPage=0;//上一页的页号
	    private int nextNextPage=0; 
	    private int perviousPerviousPage=0;
	    
	    private List pages;
	    public PageBean(){
	        pages=new ArrayList();
	    }
	    public void setCurrentPage(int currentPage) {
	        this.currentPage = currentPage;
	    }

	    public void setTotalPages(int totalPages) {
	        this.totalPages = totalPages;
	    }

	    public void setPageSize(int pageSize) {
	        this.pageSize = pageSize;
	    }

	    public void setTotalRows(int totalRows) {
	        this.totalRows = totalRows;
	    }

	    public void setPageStartRow(int pageStartRow) {
	        this.pageStartRow = pageStartRow;
	    }

	    public void setPageEndRow(int pageEndRow) {
	        this.pageEndRow = pageEndRow;
	    }

	    public void setHasNextPage(boolean hasNextPage) {
	        this.hasNextPage = hasNextPage;
	    }

	    public void setHasPreviousPage(boolean hasPreviousPage) {
	        this.hasPreviousPage = hasPreviousPage;
	    }

	    public void setNextPage(int nextPage) {
	        this.nextPage = nextPage;
	    }

	    public void setPerviousPage(int perviousPage) {
	        this.perviousPage = perviousPage;
	    }

	   

	    public int getCurrentPage() {
	        return currentPage;
	    }

	    public int getTotalPages() {
	        return totalPages;
	    }

	    public int getPageSize() {
	        return pageSize;
	    }

	    public int getTotalRows() {
	        return totalRows;
	    }

	    public int getPageStartRow() {
	        return pageStartRow;
	    }

	    public int getPageEndRow() {
	        return pageEndRow;
	    }

	    public boolean isHasNextPage() {
	        return hasNextPage;
	    }

	    public boolean isHasPreviousPage() {
	        return hasPreviousPage;
	    }

	    public int getNextPage() {
	        return nextPage;
	    }

	    public int getPerviousPage() {
	        return perviousPage;
	    }

	    public boolean isHasNextNextPage() {
	        return hasNextNextPage;
	    }

	    public void setHasNextNextPage(boolean hasNextNextPage) {
	        this.hasNextNextPage = hasNextNextPage;
	    }

	    public boolean isHasPreviousPreviousPage() {
	        return hasPreviousPreviousPage;
	    }

	    public void setHasPreviousPreviousPage(boolean hasPreviousPreviousPage) {
	        this.hasPreviousPreviousPage = hasPreviousPreviousPage;
	    }

	    public int getNextNextPage() {
	        return nextNextPage;
	    }

	    public void setNextNextPage(int nextNextPage) {
	        this.nextNextPage = nextNextPage;
	    }

	    public int getPerviousPerviousPage() {
	        return perviousPerviousPage;
	    }

	    public void setPerviousPerviousPage(int perviousPerviousPage) {
	        this.perviousPerviousPage = perviousPerviousPage;
	    }
	    public List getPages() {
	        return pages;
	    }
	    public void setPages(List pages) {
	        this.pages = pages;
	    }

}


再下来是主要的算法
pageSession
public class PageSessionBean {
    PageBean pvb = new PageBean();

    public PageBean pagebean(int total, int pagesize) {
        //
        pvb.setPageSize(pagesize);
        pvb.setTotalRows(total);
        pvb.setCurrentPage(1);
        pvb.setHasPreviousPage(false);
        pvb.setHasPreviousPreviousPage(false);
        pvb.setPageStartRow(0);
        if (total % pagesize == 0) {
            pvb.setTotalPages(total / pagesize);
        } else {
            pvb.setTotalPages((total / pagesize) + 1);
        }
        if (pvb.getTotalPages() > 1) {
            pvb.setNextPage(2);
            pvb.setHasNextPage(true);
        } else {
            pvb.setHasNextPage(false);
        }
        if (pvb.getTotalPages() > 10) {
            pvb.setHasNextNextPage(true);
            pvb.setNextNextPage(11);
        } else {
            pvb.setHasNextNextPage(false);
        }
        pvb.getPages().removeAll(pvb.getPages());
        // 移除列表里面的所有对象
        for (int i = 1; i <= pvb.getTotalPages() && i <= 10; i++) {
            Integer temp = new Integer(i);
            pvb.getPages().add(temp);
        }
        return pvb;
    }

    public PageBean gotoPage(int pagesize, int pageNo) {
        pvb.setPageSize(pagesize);
        pvb.setCurrentPage(pageNo);
        if (pageNo <= 6) { // 当从用户输入框里面输入的数字小于6的时候
            pvb = pagebean(pvb.getTotalRows(), pvb.getPageSize());
             pvb.setCurrentPage(pageNo);
        } else if (pageNo > 6 && pageNo <= pvb.getTotalPages()) {//当输入大于6且小于总页数的时候
        	int tr=pageNo;
        	pvb.getPages().removeAll(pvb.getPages());
        	if(pvb.getTotalPages()>6&&pvb.getTotalPages()<=10){
        		for(int i=1;i<=pvb.getTotalPages();i++){
            		Integer t=new Integer(i);
            		pvb.getPages().add(t);
        	}}
        	else{
        		for(int i=tr-5;i<=tr+4&&i<=pvb.getTotalPages();i++){
        	
        		Integer t=new Integer(i);
        		pvb.getPages().add(t);
        	}
        	}
 
//            //int num = 0; // pageNo十位上的数字
//           // num = pageNo / 10;
//            //if (pvb.getTotalPages() > (num + 1) * 10) {
//                // 当页的总数大于这个区间的数字时
//                Integer tr = new Integer(num * 10+1);
//                pvb.getPages().removeAll(pvb.getPages());
//                pvb.getPages().add(tr);
//                for (int i = 2; i <=10; i++) {
//                    Integer t = new Integer(num * 10 + i);
//                    pvb.getPages().add(t);
//                }
//            } else {
//                Integer tr = new Integer(num * 10+1);
//                pvb.getPages().removeAll(pvb.getPages());
//                pvb.getPages().add(tr);
//                for (int i = 2; i < pvb.getTotalPages() - (num * 10) + 1; i++) {
//                    Integer t = new Integer(num * 10 + i);
//                    pvb.getPages().add(t);
//                }
//            }
             pvb.setCurrentPage(pageNo);
        } else {
            //当输入的页数大于总页数的时候
          int num=0; //得到总页数的十位数字
          num=pvb.getTotalPages()/10;
          pvb.getPages().removeAll(pvb.getPages());
          for(int i=num*10+1;i<pvb.getTotalPages()+1;i++){
              Integer t = new Integer(i);
                pvb.getPages().add(t);
          }
          pvb.setCurrentPage(pvb.getTotalPages());
        }
        if(pageNo+1<=pvb.getTotalPages()){
            pvb.setNextPage(pageNo+1);
            pvb.setHasNextPage(true);
        }else{
            pvb.setHasNextNextPage(false);
            pvb.setNextPage(0);
        }
        if(pageNo+10<=pvb.getTotalPages()){
            pvb.setNextNextPage(pageNo+10);
            pvb.setHasNextNextPage(true);
        }else{
            pvb.setHasNextNextPage(false);
            pvb.setNextNextPage(0);
        }
        if(pageNo-10>=1){
            pvb.setPerviousPerviousPage(pageNo-10);
            pvb.setHasPreviousPreviousPage(true);
        }else{
            pvb.setHasPreviousPreviousPage(false);
            pvb.setPerviousPerviousPage(0);
        }
        if(pageNo-1>=1){
            pvb.setPerviousPage(pageNo-1);
            pvb.setHasPreviousPage(true);
        }else{
            pvb.setHasPreviousPage(false);
            pvb.setPerviousPerviousPage(0);
        }
        pvb.setPageStartRow((pvb.getCurrentPage() - 1) * pvb.getPageSize());
        
        return pvb;
    }

    
}



有些方法可能没用到。所以我注释掉了。
这个优化完应该算是一个功能比较全的分页了。。
分享到:
评论
16 楼 iaimstar 2009-11-30  
分页???

order by 死透的人飘过、、、

各种排序死T_T
15 楼 蓝黑不败 2009-11-30  
现在分页还要这样查询分页吗?
直接数据库查询分页不就搞定所有的了
14 楼 xajhzc 2009-09-02  
好多计算可以直接扔到set方法里去吧
而且感觉有的方法最好再重构下
13 楼 luckaway 2009-08-20  
构造pagebean干嘛不放到构造函数里
12 楼 tianmo2008 2009-08-14  
分页确实想不到还能怎么优化,就是分段查询数据,貌似也不能患存,至于所谓的一次把所有数据都查上来,在内存进行分页操作,就更不用说了,数据库的更新不能直接反给给应用.
11 楼 puhongchun 2009-08-11  
LZ 你的代码好象没体现出什么优化??

   算法基本就是这样一来嘛?
 
   算出分页的参数.
10 楼 luojiy 2009-07-09  
是不是一次性把所有的数据记录拿出来,再来分页的?
这样不太好,如果有新数据更新了。就不能立即看到了。
9 楼 lancer 2009-06-01  
在怎么优化你的计算方法还是在服务端完成  分页无非是在数据库查询从第几条开始 取多少条数据  服务端只要完成这个功能就可以了  其他的页码的计算都可以交给客户端的js完成

action 中的代码
String start = request.getParameter("start") == null ? "0" : request.getParameter("start");
int count = request.getParameter("count") == null ? -1 : Integer.parseInt(request.getParameter("count"));
if (count == -1) 
   count=testService.findTestCount();
int pageCount=10;
List list=testService.findTest(Integer.parseInt(start), pageCount);

具体的查询用的就是 hibernate的
q.setFirstResult(0);
q.setMaxResults(10);

js 分页代码
/**
 * 分页显示方法
 * @param {} url
 * @param {} objFrom
 * @param {} count
 * @param {} pageStart
 * @param {} pageCount
 */
var Page=function(url,objFrom,count,pageStart,pageCount){  
// 计算总页数
var pages = Math.floor(count / pageCount);
// 在不被整除的情况下页数加一
if (count % pageCount != 0) 
pages = pages + 1;
// 计算当前的页码
var curPage=Math.floor(pageStart / pageCount)+1;
var strOptions = "";
for (var i = 1; i <= pages; i++) {
if(parseInt(curPage)==i)
strOptions = strOptions + "<option value=\"" + i + "\" selected=\"selected\">" + i + "</option>";
else
strOptions = strOptions + "<option value=\"" + i + "\">" + i + "</option>";
}
var pageContent ="<div style=\"float:left; width:100%; text-align:center; padding-top:3\">";
// 判断是否为第一页
if(curPage<=1)
pageContent=pageContent+"\u7b2c\u4e00\u9875 | \u4e0a\u4e00\u9875 | ";
else
pageContent=pageContent+"<a href=\"javascript:toPage('"+url+"',"+objFrom.name+",1,"+pages+","+pageCount+","+count+")\">\u7b2c\u4e00\u9875</a> | <a href=\"javascript:toPreview('"+url+"',"+objFrom.name+","+curPage+","+pages+","+pageCount+","+count+")\">\u4e0a\u4e00\u9875</a> | ";
// 判断是否为最后一页
if(curPage>=pages)
pageContent=pageContent+"\u4e0b\u4e00\u9875 | \u6700\u540e\u4e00\u9875";
else
pageContent=pageContent+"<a href=\"javascript:toNext('"+url+"',"+objFrom.name+","+curPage+","+pages+","+pageCount+","+count+")\" class=\"black\">\u4e0b\u4e00\u9875</a> | <a href=\"javascript:toPage('"+url+"',"+objFrom.name+","+pages+","+pages+","+pageCount+","+count+")\" class=\"black\">\u6700\u540e\u4e00\u9875</a>";
pageContent = pageContent+" \u5171 " + count + " \u6761\u4fe1\u606f, " +  curPage+ " / " + pages+ " \u9875 \u9009\u62e9\u9875\u7801 \uff1a<select onchange=\"toChange('"+url+"',"+objFrom.name+",this,"+pages+","+pageCount+","+count+")\">" + strOptions + "</select></div>";
// 输出到页面
document.write(pageContent);
}

/**
 * 跳转到指定页面
 * @param {} url
 * @param {} objFrom
 * @param {} page
 * @param {} sumPages
 * @param {} pageRow
 * @param {} count
 */
function toPage(url,objFrom,page,sumPages,pageRow,count) {
if (page <=  parseInt(sumPages) && page>0) {
var start=(page - 1) * parseInt(pageRow);
if(url.indexOf('?')==-1)
url=url+'?start='+start+'&count='+count;
else
url=url+'&start='+start+'&count='+count;
objFrom.action=url;
objFrom.submit();
}
}

/**
 * 采用select的onChange方法跳转的页面
 * @param {} url
 * @param {} objFrom
 * @param {} obj
 * @param {} sumPages
 * @param {} pageRow
 * @param {} count
 */
function toChange(url,objFrom,obj,sumPages,pageRow,count) {
var page= obj.options[obj.selectedIndex].value;
if (page <=  parseInt(sumPages) && page>0) {
var start=(page - 1) * parseInt(pageRow);
if(url.indexOf('?')==-1)
url=url+'?start='+start+'&count='+count;
else
url=url+'&start='+start+'&count='+count;
objFrom.action=url;
objFrom.submit();
}
}

/**
 * 跳转到上一页方法
 * @param {} url
 * @param {} objFrom
 * @param {} curPage
 * @param {} sumPages
 * @param {} pageRow
 * @param {} count
 */
function toPreview(url,objFrom,curPage,sumPages,pageRow,count){
var page= parseInt(curPage)-1
if ( page >  0) {
var start=(page - 1) * parseInt(pageRow);
if(url.indexOf('?')==-1)
url=url+'?start='+start+'&count='+count;
else
url=url+'&start='+start+'&count='+count;
objFrom.action=url;
objFrom.submit();
}
}

/**
 * 跳转到下一页方法
 * @param {} url
 * @param {} objFrom
 * @param {} curPage
 * @param {} sumPages
 * @param {} pageRow
 * @param {} count
 */
function toNext(url,objFrom,curPage,sumPages,pageRow,count) {
var page= parseInt(curPage)+ 1
if ( page <=  parseInt(sumPages)) {
var start=(page - 1) * parseInt(pageRow);
if(url.indexOf('?')==-1)
url=url+'?start='+start+'&count='+count;
else
url=url+'&start='+start+'&count='+count;
objFrom.action=url;
objFrom.submit();
}
}


jsp中

<script language="javascript" src="js/pageUtil.js"></script>
<script language="javascript">
new Page('testAction.do',document.testFrom,${count},${start},${pageCount}); 
</script>


count  start pageCount 三个参数是由action中返回  

无论是普通的servlet 还是struts1 或2  原理都是相同的   可以再优化一下js的计算但也无关紧要了  现在个人电脑已经足够用了




8 楼 wufei006007 2009-06-01  
老哥  怎么调用这些方法?
7 楼 xiyeqing99 2008-12-31  
分页在struts2中什么标签比较好用啊,我知道ext里有个很好用的标签
6 楼 xiyeqing99 2008-12-31  
楼主不jsp也贴出来啊
5 楼 mr.shang 2008-12-22  
就是增加了一些功能,主要在gotoPage()这个方法里面。
算是分页里比较全的了吧
类似百度贴吧那个分页
首页 上一页 1 2 3 4 5 6 7 8 9 10 下一页 末页 跳到第?页
被注释掉那部分功能是
首页 前十页 上一页  1 2 3 4 5 6 7 8 9 10 下一页 后十页 末页
喜欢那种根据自己的爱好。
不过后面这种需要把前面的稍加修改一下
4 楼 longrm 2008-12-22  
楼主应该注明一下你的优化主要体现在哪
3 楼 xieke 2008-12-22  
优化在那里?
2 楼 ThinkingInAll 2008-12-22  
偶太懒,还是标签适合我
1 楼 imp860124 2008-12-22  
关注。。。。

相关推荐

    struts分页实例及注释

    struts分页  我的分页比较简单,没有那么复杂,还是先实现再优化丰富吧。网上这方面的例子很多,但是详细的并不多。我打算  整理一下我的实现方案,并且接合Struts2的标签实现分页。提供相关完整代码。望高手指教...

    Struts+Spring+Hibernate(CRUD操作案例)-分页查询

    前段时间时间当我在学习SSH框架技术的时候,在网上很难找到关于SSH的完整例子,比如最基本的CRUD操作和用的比较多的查询分页技术。为了让SSH初学者更清楚全面的学习,不再像我初学时候迷失方向。特花了2天时间做一个...

    Struts+Spring+Hibernate(CRUD操作案例)-分页查询-作者:llfzy

    前段时间时间当我在学习SSH框架技术的时候,在网上很难找到关于SSH的完整例子,比如最基本的CRUD操作和用的比较多的查询分页技术。为了让SSH初学者更清楚全面的学习,不再像我初学时候迷失方向。特花了2天时间做一个...

    (2.0版本)自己写的struts2+hibernate+spring实例

    可以直接导入. &lt;br&gt;查看说明: 当前只是自己看struts2的一点点资料随便写的一个简单的增删改查程序.全当给所有打算使用struts2却没有接触过的人一个入门而已.我也是初看.才2天而已.所以各位高手就不要笑话了.愿...

    java_jsp项目源码_博客系统(struts+hibernate+spring).rar

    分页浏览功能优化了文章列表展示,提升用户体验。 此外,项目还具备社交分享功能,方便用户将文章分享到各大社交平台,增加博客的曝光度。系统采用前后端分离设计,通过Ajax技术实现页面的无刷新更新,提高交互流畅...

    基于Struts2的图书管理系统源代码

    一.功能简介 1. 实现一个图书管理系统。...2. 希望实现查询时,查询结果分页浏览; 3. 进一步优化Action之间的传值方法; 4. 页面进一步优化、美化; 5. 实现用户借书还书时间记录,和借阅时长限制。

    Java求职面试宝典各大公司常考知识点

    1.14. 如何优化Hibernate? 7 2 Struts部分 7 4.1. Struts1.x工作机制? 7 4.2. 为什么要用Struts1.x 8 4.3. Struts1.x的validate框架是如何验证的? 8 4.4. 说下Struts的设计模式 8 4.5. 谈谈你mvc的理解 8 4.6. ...

    低清版 大型门户网站是这样炼成的.pdf

    (Struts 2+Spring 2+Hibernate 3).pdf(完整版) 网上有高清版350M的。可以去下 http://115.com/file/be5gwid8 请于下载后 24H 内及时删除!请抱着学习的态度下载此资料。 总共900多页!!!!!!! 第1篇 ...

    HR人力资源系统(Struts+Spring+Hibernate版)附数据库

    在页面的布局美观,数据访问上做了大量优化,执行效率很高,另赠JS日历控件,分页标签库,EHCache缓存等使用工具及其使用方法.由于上传限制,未将所有驱动包上传,如果使用MyEclipse提供的驱动包,记得Spring2.X与Hibernate3...

    JspRun!社区论坛系统 v6.0 bulid 090423 GBK 源码版.rar

    10、优化所有页面分页功能 11、优化首页,帖子列表,帖子浏览页面,大大减少页面大小,增加浏览速度,减少服务器访问流量 12、优化thread页面解析特殊代码,避免出现死循环, 13、更多细节方面的优化 新增功能 1...

    JspRun!社区论坛系统 v6.0 bulid 090424 GBK 安装版.rar

    10、优化所有页面分页功能 11、优化首页,帖子列表,帖子浏览页面,大大减少页面大小,增加浏览速度,减少服务器访问流量 12、优化thread页面解析特殊代码,避免出现死循环, 13、更多细节方面的优化 新增功能 1...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    Java面试题28.mysql和oracle的分页语句 Java面试题29.触发器的使用场景? Java面试题30.存储过程的优点 Java面试题31.jdbc调用存储过程 Java面试题32.简单说一下你对jdbc的理解 Java面试题33.写一个jdbc的访问oracle...

    JEECMS 2.3.1 Beta 系统程序

    采用hibernate3+struts2+spring2+freemarker主流技术架构 懂html就能建站,提供最便利、合理的使用方式 强大、灵活的标签,用户自定义显示内容和显示方式 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好...

    WODECMS开源内容管理系统 v1.1.zip

    按照官方提供的插件为蓝本,用户可开发出属于自己的插件。 安全 所有数据都有严格的过滤,支持黑名单制,受攻击系统主动Email通知。 高效 WODECMS开源内容管理系统前台页面 WODECMS开源内容管理系统后台管理 ...

    《MyEclipse 6 Java 开发中文教程》前10章

    9.5 编写Struts整合Hibernate的分页应用 184 9.5.1 分页应用的设计思路 184 9.5.2 创建StrutsPageDemo项目,加入Hibernate开发功能 190 9.5.3 反向工程生成DAO层 190 9.5.4 编写分页应用层 191 9.5.5 加入Struts表现...

    JdonFramework 应用开发文档

    JdonFramework 是一款基于 Struts+EJB/POJO 架构的快速 J2EE 开发工具,它同时也是 Aop/Ioc的实现,所有组件运行在微容器PicoContainer 中。 JdonFramework 优点和成熟点是内置 Web 层缓存性能优化,大大提高批量...

    java面试题

    如何优化Hibernate? 61 71.12. Hibernate和spring中常出现的几个异常 61 71.13. Hibernate与jdbc的联系 62 71.14. Hibernate与Spring的联系 62 71.15. Hibernate自带的分页机制是什么?如果不使用Hibernate自带的...

    Java面试宝典2020修订版V1.0.1.doc

    13、在数据库中查询语句速度很慢,如何优化? 44 14、数据库三范式是什么? 44 15、union和union all有什么不同? 45 16、char、varchar2、varchar有什么区别? 45 17、Oracle和Mysql的区别? 46 18、Oracle语句有多少...

    ThinkPHP v5.0.0 RC4.zip

    ThinkPHP借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,采用单一入口模式等,融合了Struts的 Action思想和JSP的TagLib(标签库)、RoR的ORM映射和ActiveRecord模式,封装了CURD和一些常用操作,...

Global site tag (gtag.js) - Google Analytics