`
mr.shang
  • 浏览: 39622 次
  • 性别: 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分页.

    总的来说,Struts分页的优势在于其模块化的设计,通过ActionForm、Action、标签库和拦截器等组件,能够将分页逻辑从业务逻辑中解耦,使代码更易于维护和扩展。同时,其提供的各种功能,如国际化、主题支持和性能优化...

    Struts2自定义分页标签

    本资源详细介绍了如何在Struts2中自定义分页标签,使得开发过程更加便捷。 在Struts2中,分页通常涉及到以下几个关键步骤: 1. **创建Action类**:首先,你需要创建一个Action类,该类将处理用户的请求,包括获取...

    java web中的struts分页组件

    在大型Web应用中,分页功能是必不可少的,它能帮助优化用户体验,提高系统性能,防止一次性加载过多数据导致页面响应慢或服务器压力过大。本代码示例专注于Struts中如何实现分页功能。 首先,我们需要了解分页的...

    Struts完整分页

    通过以上步骤,我们可以构建出一个完整的Struts分页系统。这个过程中,关键是理解Struts的MVC架构以及如何在各层之间传递和处理分页信息。熟练掌握分页技术不仅能够提升用户体验,也有助于优化应用的性能和可维护性...

    struts分页.rar

    Struts分页是Java Web开发中的一个重要概念,主要用于在用户界面上展示大量数据时进行有效管理,提升用户体验。Struts框架,由Apache软件基金会开发,是一个用于构建MVC(Model-View-Controller)架构的开源Java框架...

    struts分页源代码

    Struts分页是Java Web开发中的一个重要概念,它在处理大量数据展示时尤为关键,能够有效地提高用户体验。Struts框架,作为一个MVC(Model-View-Controller)模型的开源Java库,提供了对分页功能的良好支持。在这个...

    ajax+struts分页

    在Ajax+Struts分页中,主要涉及以下几个步骤: 1. **前端页面**:使用JavaScript和HTML构建用户界面。当用户点击分页链接时,会触发Ajax请求,而不是传统的页面跳转。 2. **Ajax请求**:通常使用JavaScript库如...

    struts分页算法的实现

    Struts分页算法是Java Web开发中常用的一种技术,它主要用于处理大数据集合的展示,提高网页的加载速度和用户体验。在Struts框架下,我们通常会结合Servlet、JSP和数据库查询来实现分页功能。以下将详细讲解Struts...

    STRUTS2+HIBERNATE详细的分页实现代码详细的分页实现代码

    根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要探讨的是如何在Struts2与Hibernate框架结合下...在实际项目中,可以根据具体需求进一步优化分页逻辑,例如增加缓存机制来减少数据库的访问次数等。

    分页大全(含JDBC分页 struts分页)

    这里我们将深入探讨“分页大全”,包括JDBC分页、Struts分页以及分页标签的使用。 首先,让我们了解什么是分页。在网页或应用中,分页是指将大量数据分割成若干小部分,每次只加载一部分,用户可以逐页浏览,而不是...

    使用struts实现分页

    本资源通过Struts框架实现了分页功能,主要涉及到以下几个关键知识点: 1. **MVC设计模式**:MVC模式将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。模型负责处理业务逻辑,视图...

    struts分页jar包

    Struts分页jar包是一个专为Struts框架设计的组件,用于在Web应用程序中实现高效、便捷的分页功能。Struts是Apache软件基金会下的一个开源项目,它提供了一个MVC(模型-视图-控制器)架构,帮助开发者构建结构清晰、...

    Struts分页

    Struts分页是一种在Web应用中实现数据展示的高效方式,尤其当数据量较大时,分页能够提高用户体验,避免一次性加载过多数据导致页面响应慢。Struts是Apache的一个开源框架,它主要用于构建基于Java EE的Web应用。...

    一个高效简洁的Struts分页方法

    本文将深入探讨一种高效且简洁的Struts分页方法,旨在提供一个更加优化的解决方案。 ### 开发环境 本案例采用的开发环境包括:JBuilderx集成开发环境、Weblogic8.1应用服务器、Oracle9i数据库以及Windows2003操作...

    Struts2 分页实现

    本实践项目旨在展示如何在Struts2中实现分页功能,适用于初学者学习和提升技能。 首先,我们来了解分页的基本原理。分页是将大量数据分成若干小部分,每次只加载一部分到页面上,用户可以通过导航按钮来浏览其他...

    Hibernate+Struts分页的实现

    "Hibernate+Struts分页的实现"这个话题关注的就是如何在大型数据集的场景下,结合这两种技术来有效地实施分页策略。 首先,让我们了解一下Struts框架。Struts是一个基于MVC(Model-View-Controller)设计模式的Java...

    纯struts分页小例子

    在这个“纯struts分页小例子”中,我们将探讨如何在Struts框架下实现分页功能,这在处理大量数据展示时非常常见。 分页功能能够有效地提高用户体验,避免一次性加载过多数据导致页面响应慢或内存压力大。在Struts...

    struts分页--PageDemo分页.rar

    以下是一些关于Struts分页的关键知识点: 1. **Action类**:在Struts框架中,业务逻辑通常由Action类处理。在分页场景下,Action类会接收用户的请求参数(如当前页数)并调用相应的服务层方法获取分页数据。 2. **...

    Hibernate+struts分页

    本项目“Hibernate+Struts分页”是针对基于Sqlserver2000数据库的应用程序设计的,它整合了两个流行的Java开发框架——Hibernate(持久层框架)和Struts(MVC框架),以实现高效且用户友好的数据浏览功能。...

    struts1.2实现分页

    本教程将深入讲解如何在Struts1.2框架中实现分页功能。 一、理解分页原理 分页的基本思想是将数据库中的数据分割成若干个部分,每次只加载一部分到前端展示,用户可以通过点击页码或导航按钮来切换不同的数据页。...

Global site tag (gtag.js) - Google Analytics