论坛首页 Java企业应用论坛

自己优化的struts分页

浏览 12751 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-21  
前几天突然想到优化一个分页,结果做了大半天,觉得还不错,分享一下。
这是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;
    }

    
}



有些方法可能没用到。所以我注释掉了。
这个优化完应该算是一个功能比较全的分页了。。
   发表时间:2008-12-22  
关注。。。。
0 请登录后投票
   发表时间:2008-12-22  
偶太懒,还是标签适合我
0 请登录后投票
   发表时间:2008-12-22  
优化在那里?
0 请登录后投票
   发表时间:2008-12-22  
楼主应该注明一下你的优化主要体现在哪
0 请登录后投票
   发表时间:2008-12-22  
就是增加了一些功能,主要在gotoPage()这个方法里面。
算是分页里比较全的了吧
类似百度贴吧那个分页
首页 上一页 1 2 3 4 5 6 7 8 9 10 下一页 末页 跳到第?页
被注释掉那部分功能是
首页 前十页 上一页  1 2 3 4 5 6 7 8 9 10 下一页 后十页 末页
喜欢那种根据自己的爱好。
不过后面这种需要把前面的稍加修改一下
0 请登录后投票
   发表时间:2008-12-31  
楼主不jsp也贴出来啊
0 请登录后投票
   发表时间:2008-12-31  
分页在struts2中什么标签比较好用啊,我知道ext里有个很好用的标签
0 请登录后投票
   发表时间:2009-06-01  
老哥  怎么调用这些方法?
0 请登录后投票
   发表时间: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的计算但也无关紧要了  现在个人电脑已经足够用了




2 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics