Java Web 开发中如何进行分页

9/6/2015来源:Java教程人气:1790

java Web 开发中如何进行分页

*分页:

????摘要:所用框架为:Hibernate+SPRing+Struts2,以分页显示后台用户列表为例

????1.设计实体:页面类PageBean

????????1.1 分析:

????????????当前页:currentPage(请求数据)

????????????总记录数:recordCount(查数据库:count(*))

????????????页面大小:pageSize(配置文件设置值)

????????????本页的数据列表:recordList(查询数据库:select *)

?

????????????总页数:pageCount(计算)=(recordCount+pageSize-1)/pageSize;

????????????开始索引:beginPageIndex(计算)

????????????结束索引:endPageIndex(计算)

????????1.2 代码,这里以显示10个页码索引为例:

????????????public class PageBean{

?

????????????????private int currentPage;

????????????????private int recordCount;

????????????????private int pageSize;

????????????????private List recordList;

?

????????????????private int pageCount;

????????????????private int beginPageIndex;

????????????????private int endPageIndex;

?

????????????????public PageBean(int currentPage,int recordCount,int pageSize,int recordList){

????????????????????//当前页

????????????????????this.currentPage=currentPage;

????????????????????//总记录数

????????????????????this.recordCount=recordCount;

????????????????????//页面大小

????????????????????this.pageSize=pageSize;

????????????????????//当前页的总记录列表

????????????????????this.recordList=recordList;

?

????????????????????//计算pageCount:总记录数

????????????????????//这里可以用逻辑判断,如:

????????????????????/*

????????????????????*if(recordCount%pageSize==0){

????????????????????*????pageCount=recordCount/pageSize;????

????????????????????*}else{

????????????????????*????pageCount=recordCount/pageSize+1;

????????????????????*}

????????????????????*/

????????????????????//或则用算法,自己琢磨

????????????????????pageCount=(recordCount+pageSize-1)/pageSize;

????????????????????

????????????????????//这里以显示十个页码索引为例,设置开始页码索引和结束页码索引

????????????????????//当页面总数小于10个时

????????????????????if(pageCount<=10){

????????????????????????beginPageIndex=1;

????????????????????????endPageIndex=pageCount;

????????????????????}else{

????????????????????????//当页面总素大于10个时

????????????????????????beginPageIndex=currentPage-4;

????????????????????????endPageIndex=currentPage+5;

?

????????????????????????if(beginPageIndex<1){

????????????????????????????beginPageIndex=1;

????????????????????????????endPageIndex=10;

????????????????????????}

????????????????????????else if(endPageIndex>pageCount){

????????????????????????????beginPageIndex=pageCount-9;

????????????????????????????endPageIndex=pageCount;

????????????????????????}

????????????????????}

????????????????}

????????????????

????????????????//Setter和Getter

????????????????set...

????????????????get...

????????????}

????2.设置实体工具类:HqlHelper

????????2.1 分析

????????2.2 代码

????????????public class HqlHelper{

????????????????//from子句

????????????????private String fromClause;

????????????????//where子句

????????????????private String whereClause;

????????????????//排序子句

????????????????private String orderClause;

????????????????

????????????????//参数集合,Hql语句中where子句中用到的参数对象

????????????????private List<Object> parameters=new ArrayList<Object>();

????????????????

????????????????//构造函数设置fromClause,默认别名为"o"

????????????????public HqlHelper(Class clazz){

????????????????????this.fromClause="FROM "+clazz.getSimpleName+" o";

????????????????}

????????????????//自定义别名

????????????????public HqlHelper(Class clazz,String alias){

????????????????????this.fromClause="FROM "+clazz.getSimpleName+alias;

????????????????}

????????????????

????????????????//设置where子句的,以及用到的参数对象,这就是查询条件

????????????????public HqlHelper addCondition(String condition,Object... params){

????????????????????if(whereClause.length()==0){

????????????????????????whereClause=" WHERE "+condition;

????????????????????}else{

????????????????????????where+=" AND "+condition;

????????????????????}

????????????????????

????????????????????if(params!=null && params.length>0){

????????????????????????for(Object o:params){

????????????????????????????parameters.add(0);

????????????????????????}

????????????????????}

????????????????????return this;

????????????????}

????????????????//设置是否追加,这个接口留给用户,到时方便用户开发

????????????????public HqlHelper addCondition(boolean append,String condition,Object... params){

????????????????????if(append){

????????????????????????addCondition(condition,params);

????????????????????}

????????????????????return this;

????????????????????

????????????????}

????????????????

????????????????//设置排序条件子句

????????????????public HqlHelper addOrder(String propertityName,boolean isAsc){

????????????????????if(orderClause!=null && orderClause.length()>0){

????????????????????????orderClause=" ORDER BY "+propertityName+(isAsc?" ASC":" DESC");

????????????????????}else{

????????????????????????orderClause+=", "+popertityName+(isAsc?" ASC":" DESC");

????????????????????}

????????????????????

????????????????????return this;

????????????????}

????????????????//这个增加了是否追加排序条件子句

????????????????public HqlHelper addOrder(boolean append ,String propertityName,boolean isAsc){

????????????????????if(append){

????????????????????????addOrder(propertityName,isAsc);

????????????????????}

????????????????????return this;

????????????????}

????????????????

????????????????//得到查询子句hql

????????????????public String getQueryListHql(){

????????????????????return fromClause+whereClause+orderClause;

????????????????}

?

????????????????//计数hql

????????????????public String getCountHql(){

????????????????????return "SELECT COUNT(*) "+fromClause+whereClause;

????????????????}

????????????????

????????????????//参数集合get接口,供外部访问

????????????????public List<Object> getParameters(){

????????????????????return parameters;

????????????????}

????????????????

//这里只要两个参数,跳转的页面,和继承了BaseDao(自己抽取的接口,//很有用的)的service

????????????????public HqlHelper buildPageBeanForStruts2(int pageNum,BaseDao<?> service){

????????????????????

????????????????????PageBean pageBean=service.getBean(pageNum,this);

????????????????????ActionContext.getContext.getValueStack.push(pageBean);

????????????????????return this;

????????????????}

????????????}

????3.设计service,这里把方法放到BaseDao中,service继承即可:

????????3.1 代码

????????????//事物注解(许在Spring中配置,TransactionManager)

????????????@Transactional

????????????public class BaseDaoImpl<T> implements BaseDao<T>{

????????????????//这里需要配置sessionFactory在Spring容器中,自己配不难

????????????????//这个是注解,相当于Setter

????????????????@Resource

????????????????private SessionFactory sessionFactory;

????????????????//实体类型

????????????????protected Class<T> clazz;

?

????????????????//在构造函数中进行初始化clazz

????????????????public BaseDaoImpl(){

????????????????????ParameterirzedType pt=(ParameterizedType)this.getClass().getGenericSuperclass();

????????????????????this.clazz=(Class)pt.getActualTypeArguments()[0];

????????????????}

????????????????

????????????????//获取Session,方便操作数据库

????????????????protected Session getSession(){

????????????????????return sessionFactory.getCurrentSession();

????????????????}

?

????????????????public PageBean getBean(int pageNum,HqlHelper hqlHelper){

????????????????????

????????????????????//参数集合

????????????????????private List<Object> parameters=hqlHelper.getParameters();

????????????????????//配置的页面大小

????????????????????private int pageSize=Configuration.getPageSize();

????????????????????

????????????????????//recordCount,总记录数

????????????????????Query countQuery=getSession().createQuery(HqlHelper.getCountHql());

????????????????????if(parameters!=null && parameters.size()>0){

????????????????????????for(int i=0;i<parameters.size();i++){

????????????????????????????countQuery.setParameter(i,parameters.get(i));

????????????????????????}????

????????????????????}????????????????????

????????????????????Long recordCount=(Long)countQuery.uniqueResult();

?

????????????????????//recordList,当前页的记录列表

????????????????????Query listQuery=getSession().createQuery(HqlHelper.getQueryListHql());

????????????????????//设置查询参数

????????????????????if(parameters!=null && parameters.size()>0){

????????????????????????for(int i=0;i<parameters.size;i++){

????????????????????????????listQuery.setParameter(i,parameters.get(i));

????????????????????????}

????????????????????}

????????????????????//获取当前页的记录

????????????????????listQuery.setFirstResutl(pageSize*(pageNum-1));

????????????????????listQuery.setMaxResults(pageSize);

????????????????????List recordList=listQuery.list();

????????????????????

????????????????????return new PageBean(pageNum,recordCount.intValue(),pageSize,recordList);

????????????????}

????????????}

?

????4.设计Action:以UserAction为例

????????4.1 代码:

????????????//顺带把配置加上,交给Spring容器管理

????????????@Controller

????????????@Scope("prototype")

????????????public class UserAction extends ActionSupport{

????????????????

????????????????private int pageNum;

????????????????get... set...;

?

????????????????@Resource

????????????????private UserService userService;

?

????????????????//用户数据列表,分页显示

????????????????public String list(){

????????????????????new HqlHelper(User.class,"u")//

????????????????????.buildPageBeanForStruts2(pageNum,userService);

????????????????}

????????????}

?

????5.页面:设计一个公共页面 pageView.jspf,通用的

%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>

<%@taglibprefix="s"uri="/struts-tags"%>

?

<divid=PageSelectorBar>

????<divid=PageSelectorMemo>

????????页次:${currentPage}/${pageCount}页&nbsp;每页显示:${pageSize}条&nbsp;总记录数:${recordCount}条

????</div>

????<divid=PageSelectorSelectorArea>

????????

????????<ahref="javascript:gotoPage(1)"title="首页"style="cursor: hand;"><imgsrc="${pageContext.request.contextPath}/style/blue/images/pageSelector/firstPage.png"/></a>

?

????????<s:iteratorbegin="%{beginPageIndex}"end="%{endPageIndex}"var="num">

????????????<s:iftest="currentPage==#num">

????????????????<%--当前页 --%>

????????????????<spanclass="PageSelectorNum PageSelectorSelected">${num}</span>

????????????</s:if>

????????????<s:else>

????????????????<%--非当前页 --%>

????????????????<spanclass="PageSelectorNum"style="cursor: hand;"onClick="gotoPage(${num});">${num}</span>

????????????</s:else>

????????</s:iterator>

????????<ahref="Javascript:gotoPage(${pageCount})"title="尾页"style="cursor: hand;"><img

????????????????src="${pageContext.request.contextPath}/style/blue/images/pageSelector/lastPage.png"/></a>转到:

????????<selectid="pn"onchange="gotoPage(this.value)">

????????????<s:iteratorbegin="1"end="%{pageCount}"var="num">

????????????????<optionvalue="${num}">

????????????????????${num}

????????????????</option>

????????????</s:iterator>

????????</select>

????????<scripttype="text/javascript">

????????????//回显页码

????????????$("#pn").val(${currentPage});

????????</script>

????</div>

</div>

?

?

<scripttype="text/javascript">

????function gotoPage(pageNum){

????????????//window.location.href="topicAction_show.action?id=${id}&pageNum="+pageNum;

????????????$(document.forms[0]).append("<input type='hidden' name='pageNum' value='"+pageNum+"'/>");

????????????document.forms[0].submit();//提交表单????

????????}

</script>

?