搜索
您的当前位置:首页正文

分页的实现

来源:意榕旅游网
1:关于Netctoss项目中《分页技术的实现》 一 实现原理:

底层是通过Hibernate的分页来实现的: 主要用到Hibernate的query.setFirstResult( int 开始位置); query.setMaxResults( int 每次显示数量) 。 页面是通过一个自定义类:

把分页热链接 拼接起来,在Action中通过request.setAttribute()把分页热链接字符串发送到显示页面。

二 具体实现:

(1)自定义分页类 : 要拼接的字符串:

拼接后的url:

该类主要包含:每页显示的数量,分页字符串的拼接。 代码:

public class PageParameter {

public static int page_number=10; // 设置每页显示的数量。

/**

*拼接热链接的函数

*@param currentPage 表示当前所在的页数 *@param totalPage 表示总的记录数(条数)

*@param url 表示要提交的Action路径,用url可以使方法供其它模块分页使用

*/

public static String makeUrl( int currentPage , int totalPage , String url ){ StringBuffer sb = new StringBuffer();

int ishave=url.indexOf(“?”); //用来判断拼接url时,是“?page=x”还是 “&page=x”; String addUrl=”” ; // if( ishave== -1 ){

addUrl =url+ “?page=” ;

}else {

addUrl =url+ “&page=” ; }

//拼接“第1页/共3页”字符串

sb.append(“第”).append(currentPage).append(“页/共”).append(totalPage).append(“页 ”) //拼接 “第一页” 的热链接

sb.append(“| 第一页”); //拼接 “上一页” 的热链接

sb.append(“| 上一页”); //拼接 “下一页” 的热链接

sb.append(“|.append(currentPage+1> totalPage? totalPage : currentPage+1).append(“’> 下一页”); //拼接 “最后一页”的热链接

sb.append(“|最后一页|”);

sb.toString();

//其中的page=x 相当一个全局变量,用来传递“当前是第几页页”参数。 } }

-------------------------------------------------------------------------------------------------------------------------------------------

(2)底层DAO方法的实现 分析:

当前是第几页 起始下标 页面显示个数 currentPage startNum rowNum

1 0 10 2 10 10 3 20 10 4 30 10 startNum = (currentPage-1) * rowNum ;

代码:

public List selectAllRight( int currentPage , final int rowNum){

final int startNum=( currentPage-1)*rowNum;

return (List)this.getHibernateTemplate().execute( new HibernateCallback(){

public Object doInHibernate(Session session )

throws HibernateException ,SQLException{

Query query=session.createQuery(“from Rights”); //设置起始位置

query.setFirstResult(startNum); //设置取出的记录数

query.setMaxResults(rowNum);

return query.list();

}

});

}

------------------------------------------------------------------------------------------------------------------------------------------- (3)Action中的实现 分析:

因为要获得总共的页面数:就应该获得所有的记录数,总页面数:

totalPage =(int)Math.ceil(rowNum/page_number);

因为每次分页都要查询所以的记录数rowNum,这样每次都要操作数据库,所以可以把 页面总数totalPage保存到session中,这样就只查询一下就OK了。

获得当前的页面数:可以通过pageNum=Integer.paseInt(request.getParamter(“page”));获得。

代码:

public ActionForward listrights( ActionMapping mapping, ActionForm form ,

HttpServletRequest request , HttpServletResponse response){

HttpSession session= request.getSession(); //获得总页面数

Integer totalPage=(Integer)session.getAttribute(“ totalPage”);

if( totalPage==null){ //表示是第一次访问。则去数据库查询。 List rights=rightServlet.browseRight(); //计算总共的页面数

totalPage=(int)Math.ceil( rights.size()/PageParameter.page_number); //把总页面数保存到session

session.setAttribute(“totalPage” ,totalPage) ;

}

//设置默认的当前页面数,当浏览rights时page=1; int pageNum=1;

//当是分页的请求,修改pageNum 的值。 if ( request.getParameter(“page”)!=null){

pageNum=Integer.parseInt( request.getParameter (“page”)) ; }

//设置 url

String url=request.getContextPath()+request.getServletPath(); // 获得分页的字符串,其中PageParameter是分页类。

String pageSpilt=PageParameter.makeUrl(pageNum , totalPage , url );

request.setAttribute(“pageSpilt” , pageSpilt);

request.setAttribute(“rights” rightService.browseRight( pageNum , PageParameter.page_number));

return mapping.findForward(“listrights”); }

-------------------------------------------------------------------------------------------------------------------------------------------

因篇幅问题不能全部显示,请点此查看更多更全内容

Top