- 浏览: 39622 次
- 性别:
- 来自: 北京
最新评论
-
o-gogo:
HandshakeInterceptor好像是个接口吧,怎么n ...
Spring WebSocket中的403错误 -
iaimstar:
分页???order by 死透的人飘过、、、各种排序死T_T ...
自己优化的struts分页 -
蓝黑不败:
现在分页还要这样查询分页吗?
直接数据库查询分页不就搞定所有的 ...
自己优化的struts分页 -
xajhzc:
好多计算可以直接扔到set方法里去吧
而且感觉有的方法最好再重 ...
自己优化的struts分页 -
luckaway:
构造pagebean干嘛不放到构造函数里
自己优化的struts分页
前几天突然想到优化一个分页,结果做了大半天,觉得还不错,分享一下。
这是PageBean
再下来是主要的算法
pageSession
有些方法可能没用到。所以我注释掉了。
这个优化完应该算是一个功能比较全的分页了。。
这是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
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 中的代码
具体的查询用的就是 hibernate的
q.setFirstResult(0);
q.setMaxResults(10);
js 分页代码
jsp中
count start pageCount 三个参数是由action中返回
无论是普通的servlet 还是struts1 或2 原理都是相同的 可以再优化一下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 下一页 后十页 末页
喜欢那种根据自己的爱好。
不过后面这种需要把前面的稍加修改一下
算是分页里比较全的了吧
类似百度贴吧那个分页
首页 上一页 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分页的优势在于其模块化的设计,通过ActionForm、Action、标签库和拦截器等组件,能够将分页逻辑从业务逻辑中解耦,使代码更易于维护和扩展。同时,其提供的各种功能,如国际化、主题支持和性能优化...
本资源详细介绍了如何在Struts2中自定义分页标签,使得开发过程更加便捷。 在Struts2中,分页通常涉及到以下几个关键步骤: 1. **创建Action类**:首先,你需要创建一个Action类,该类将处理用户的请求,包括获取...
在大型Web应用中,分页功能是必不可少的,它能帮助优化用户体验,提高系统性能,防止一次性加载过多数据导致页面响应慢或服务器压力过大。本代码示例专注于Struts中如何实现分页功能。 首先,我们需要了解分页的...
通过以上步骤,我们可以构建出一个完整的Struts分页系统。这个过程中,关键是理解Struts的MVC架构以及如何在各层之间传递和处理分页信息。熟练掌握分页技术不仅能够提升用户体验,也有助于优化应用的性能和可维护性...
Struts分页是Java Web开发中的一个重要概念,主要用于在用户界面上展示大量数据时进行有效管理,提升用户体验。Struts框架,由Apache软件基金会开发,是一个用于构建MVC(Model-View-Controller)架构的开源Java框架...
Struts分页是Java Web开发中的一个重要概念,它在处理大量数据展示时尤为关键,能够有效地提高用户体验。Struts框架,作为一个MVC(Model-View-Controller)模型的开源Java库,提供了对分页功能的良好支持。在这个...
在Ajax+Struts分页中,主要涉及以下几个步骤: 1. **前端页面**:使用JavaScript和HTML构建用户界面。当用户点击分页链接时,会触发Ajax请求,而不是传统的页面跳转。 2. **Ajax请求**:通常使用JavaScript库如...
Struts分页算法是Java Web开发中常用的一种技术,它主要用于处理大数据集合的展示,提高网页的加载速度和用户体验。在Struts框架下,我们通常会结合Servlet、JSP和数据库查询来实现分页功能。以下将详细讲解Struts...
根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要探讨的是如何在Struts2与Hibernate框架结合下...在实际项目中,可以根据具体需求进一步优化分页逻辑,例如增加缓存机制来减少数据库的访问次数等。
这里我们将深入探讨“分页大全”,包括JDBC分页、Struts分页以及分页标签的使用。 首先,让我们了解什么是分页。在网页或应用中,分页是指将大量数据分割成若干小部分,每次只加载一部分,用户可以逐页浏览,而不是...
本资源通过Struts框架实现了分页功能,主要涉及到以下几个关键知识点: 1. **MVC设计模式**:MVC模式将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。模型负责处理业务逻辑,视图...
Struts分页jar包是一个专为Struts框架设计的组件,用于在Web应用程序中实现高效、便捷的分页功能。Struts是Apache软件基金会下的一个开源项目,它提供了一个MVC(模型-视图-控制器)架构,帮助开发者构建结构清晰、...
Struts分页是一种在Web应用中实现数据展示的高效方式,尤其当数据量较大时,分页能够提高用户体验,避免一次性加载过多数据导致页面响应慢。Struts是Apache的一个开源框架,它主要用于构建基于Java EE的Web应用。...
本文将深入探讨一种高效且简洁的Struts分页方法,旨在提供一个更加优化的解决方案。 ### 开发环境 本案例采用的开发环境包括:JBuilderx集成开发环境、Weblogic8.1应用服务器、Oracle9i数据库以及Windows2003操作...
本实践项目旨在展示如何在Struts2中实现分页功能,适用于初学者学习和提升技能。 首先,我们来了解分页的基本原理。分页是将大量数据分成若干小部分,每次只加载一部分到页面上,用户可以通过导航按钮来浏览其他...
"Hibernate+Struts分页的实现"这个话题关注的就是如何在大型数据集的场景下,结合这两种技术来有效地实施分页策略。 首先,让我们了解一下Struts框架。Struts是一个基于MVC(Model-View-Controller)设计模式的Java...
在这个“纯struts分页小例子”中,我们将探讨如何在Struts框架下实现分页功能,这在处理大量数据展示时非常常见。 分页功能能够有效地提高用户体验,避免一次性加载过多数据导致页面响应慢或内存压力大。在Struts...
以下是一些关于Struts分页的关键知识点: 1. **Action类**:在Struts框架中,业务逻辑通常由Action类处理。在分页场景下,Action类会接收用户的请求参数(如当前页数)并调用相应的服务层方法获取分页数据。 2. **...
本项目“Hibernate+Struts分页”是针对基于Sqlserver2000数据库的应用程序设计的,它整合了两个流行的Java开发框架——Hibernate(持久层框架)和Struts(MVC框架),以实现高效且用户友好的数据浏览功能。...
本教程将深入讲解如何在Struts1.2框架中实现分页功能。 一、理解分页原理 分页的基本思想是将数据库中的数据分割成若干个部分,每次只加载一部分到前端展示,用户可以通过点击页码或导航按钮来切换不同的数据页。...