爱程序网

Java Web 开发中如何进行分页

来源: 阅读:

*分页:
>思路:JavaBean(PageBean)->Action(UserAction)->Service(HqlHelper)->Jsp

  1. 设计实体PageBean(分页之后显示的页面实体类),具体的属性有:当前页(currentPage),总记录
    数(recordCount),每页显示记录数(pageSize),总页数(pageCount),   

    其中总页数pageCount=(recourdCount+pageSize-1)/pageSize;

    这个公式需要自己理解,还有当前页的记录列表集合
     (recordList),开始页面的索引号(beginPageIndex),结束页面的索引号(endPageIndex);

  2. 操作用户的动作(UserAction),依赖用户的数据访问对象(UserDao),获取当前页的数据列表集合
    之后放到Action的值栈中,分发到分页的当前页显示该数据集合。

  3.
    3.1 在服务类中实现方法:protected PageBean getPageBean(int pageNum,HqlHelper hql);
    3.2 这里涉及到一个业务逻辑工具类即HqlHelper(查询语句助手)

  4. Jsp页面,见下文

  摘要:所用框架为:Hibernate+Spring+Struts2,以分页显示后台用户列表为例
  1.设计实体:页面类PageBean
  1.1 分析:
  当前页:currentPage(请求数据)
  总记录数:recordCount(查数据库:count(*))
  页面大小:pageSize(配置文件设置值)
  本页的数据列表:recordList(查询数据库:select *)

  总页数:pageCount(计算)=(recordCount+pageSize-1)/pageSize;
  开始索引:beginPageIndex(计算)
  结束索引:endPageIndex(计算)

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

    

  1 1.2 代码,这里以显示10个页码索引为例:
  2             public class PageBean{
  3 
  4                 private int currentPage;
  5                 private int recordCount;
  6                 private int pageSize;
  7                 private List recordList;
  8 
  9                 private int pageCount;
 10                 private int beginPageIndex;
 11                 private int endPageIndex;
 12 
 13                 public PageBean(int currentPage,int recordCount,int pageSize,int recordList){
 14                     //当前页
 15                     this.currentPage=currentPage;
 16                     //总记录数
 17                     this.recordCount=recordCount;
 18                     //页面大小
 19                     this.pageSize=pageSize;
 20                     //当前页的总记录列表
 21                     this.recordList=recordList;
 22 
 23                     //计算pageCount:总记录数
 24                     //这里可以用逻辑判断,如:
 25                     /*
 26                     *if(recordCount%pageSize==0){
 27                     *    pageCount=recordCount/pageSize;    
 28                     *}else{
 29                     *    pageCount=recordCount/pageSize+1;
 30                     *}
 31                     */
 32                     //或则用算法,自己琢磨
 33                     pageCount=(recordCount+pageSize-1)/pageSize;
 34                     
 35                     //这里以显示十个页码索引为例,设置开始页码索引和结束页码索引
 36                     //当页面总数小于10个时
 37                     if(pageCount<=10){
 38                         beginPageIndex=1;
 39                         endPageIndex=pageCount;
 40                     }else{
 41                         //当页面总素大于10个时
 42                         beginPageIndex=currentPage-4;
 43                         endPageIndex=currentPage+5;
 44 
 45                         if(beginPageIndex<1){
 46                             beginPageIndex=1;
 47                             endPageIndex=10;
 48                         }
 49                         else if(endPageIndex>pageCount){
 50                             beginPageIndex=pageCount-9;
 51                             endPageIndex=pageCount;
 52                         }
 53                     }
 54                 }
 55                 
 56                 //Setter和Getter
 57                 set...
 58                 get...
 59             }
 60     2.设置实体工具类:HqlHelper
 61         2.1 分析
 62         2.2 代码
 63             public class HqlHelper{
 64                 //from子句
 65                 private String fromClause;
 66                 //where子句
 67                 private String whereClause;
 68                 //排序子句
 69                 private String orderClause;
 70                 
 71                 //参数集合,Hql语句中where子句中用到的参数对象
 72                 private List<Object> parameters=new ArrayList<Object>();
 73                 
 74                 //构造函数设置fromClause,默认别名为”o“
 75                 public HqlHelper(Class clazz){
 76                     this.fromClause="FROM "+clazz.getSimpleName+" o";
 77                 }
 78                 //自定义别名
 79                 public HqlHelper(Class clazz,String alias){
 80                     this.fromClause="FROM "+clazz.getSimpleName+alias;
 81                 }
 82                 
 83                 //设置where子句的,以及用到的参数对象,这就是查询条件
 84                 public HqlHelper addCondition(String condition,Object... params){
 85                     if(whereClause.length()==0){
 86                         whereClause=" WHERE "+condition;
 87                     }else{
 88                         where+=" AND "+condition;
 89                     }
 90                     
 91                     if(params!=null && params.length>0){
 92                         for(Object o:params){
 93                             parameters.add(0);
 94                         }
 95                     }
 96                     return this;
 97                 }
 98                 //设置是否追加,这个接口留给用户,到时方便用户开发
 99                 public HqlHelper addCondition(boolean append,String condition,Object... params){
100                     if(append){
101                         addCondition(condition,params);
102                     }
103                     return this;
104                     
105                 }
106                 
107                 //设置排序条件子句
108                 public HqlHelper addOrder(String propertityName,boolean isAsc){
109                     if(orderClause!=null && orderClause.length()>0){
110                         orderClause=" ORDER BY "+propertityName+(isAsc?" ASC":" DESC");
111                     }else{
112                         orderClause+=", "+popertityName+(isAsc?" ASC":" DESC");
113                     }
114                     
115                     return this;
116                 }
117                 //这个增加了是否追加排序条件子句
118                 public HqlHelper addOrder(boolean append ,String propertityName,boolean isAsc){
119                     if(append){
120                         addOrder(propertityName,isAsc);
121                     }
122                     return this;
123                 }
124                 
125                 //得到查询子句hql
126                 public String getQueryListHql(){
127                     return fromClause+whereClause+orderClause;
128                 }
129 
130                 //计数hql
131                 public String getCountHql(){
132                     return "SELECT COUNT(*) "+fromClause+whereClause;
133                 }
134                 
135                 //参数集合get接口,供外部访问
136                 public List<Object> getParameters(){
137                     return parameters;
138                 }
139                 
140                 //这里只要两个参数,跳转的页面,和继承了BaseDao(自己抽取的接口,很有用的)的service
141                 public HqlHelper buildPageBeanForStruts2(int pageNum,BaseDao<?> service){
142                     
143                     PageBean pageBean=service.getBean(pageNum,this);
144                     ActionContext.getContext.getValueStack.push(pageBean);
145                     return this;
146                 }
147             }
148     3.设计service,这里把方法放到BaseDao中,service继承即可:
149         3.1 代码
150             //事物注解(许在Spring中配置,TransactionManager)
151             @Transactional
152             public class BaseDaoImpl<T> implements BaseDao<T>{
153                 //这里需要配置SessionFactory在Spring容器中,自己配不难
154                 //这个是注解,相当于Setter
155                 @Resource
156                 private SessionFactory sessionFactory;
157                 //实体类型
158                 protected Class<T> clazz;
159 
160                 //在构造函数中进行初始化clazz
161                 public BaseDaoImpl(){
162                     ParameterirzedType pt=(ParameterizedType)this.getClass().getGenericSuperclass();
163                     this.clazz=(Class)pt.getActualTypeArguments()[0];
164                 }
165                 
166                 //获取Session,方便操作数据库
167                 protected Session getSession(){
168                     return sessionFactory.getCurrentSession();
169                 }
170 
171                 public PageBean getBean(int pageNum,HqlHelper hqlHelper){
172                     
173                     //参数集合
174                     private List<Object> parameters=hqlHelper.getParameters();
175                     //配置的页面大小
176                     private int pageSize=Configuration.getPageSize();
177                     
178                     //recordCount,总记录数
179                     Query countQuery=getSession().createQuery(HqlHelper.getCountHql());
180                     if(parameters!=null && parameters.size()>0){
181                         for(int i=0;i<parameters.size();i++){
182                             countQuery.setParameter(i,parameters.get(i));
183                         }    
184                     }                    
185                     Long recordCount=(Long)countQuery.uniqueResult();
186 
187                     //recordList,当前页的记录列表
188                     Query listQuery=getSession().createQuery(HqlHelper.getQueryListHql());
189                     //设置查询参数
190                     if(parameters!=null && parameters.size()>0){
191                         for(int i=0;i<parameters.size;i++){
192                             listQuery.setParameter(i,parameters.get(i));
193                         }
194                     }
195                     //获取当前页的记录
196                     listQuery.setFirstResutl(pageSize*(pageNum-1));
197                     listQuery.setMaxResults(pageSize);
198                     List recordList=listQuery.list();
199                     
200                     return new PageBean(pageNum,recordCount.intValue(),pageSize,recordList);
201                 }
202             }
203 
204     4.设计Action:以UserAction为例
205         4.1 代码:
206             //顺带把配置加上,交给Spring容器管理
207             @Controller
208             @Scope("prototype")
209             public class UserAction extends ActionSupport{
210                 
211                 private int pageNum;
212                 get... set...;
213 
214                 @Resource
215                 private UserService userService;
216 
217                 //用户数据列表,分页显示
218                 public String list(){
219                     new  HqlHelper(User.class,"u")//
220                     .buildPageBeanForStruts2(pageNum,userService);
221                 }
222             }
 1 5.页面:设计一个公共页面 pageView.jspf,通用的
 2     代码:
 3     <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 4     <%@ taglib prefix="s" uri="/struts-tags"%>
 5 
 6     <div id=PageSelectorBar>
 7     <div id=PageSelectorMemo>
 8         页次:${currentPage}/${pageCount}页 &nbsp; 每页显示:${pageSize}条 &nbsp; 总记录数:${recordCount}条
 9     </div>
10     <div id=PageSelectorSelectorArea>
11         
12         <a href="javascript:gotoPage(1)" title="首页" style="cursor: hand;">
13         <img src="${pageContext.request.contextPath}/style/blue/images/pageSelector/firstPage.png" /> 
14         </a>
15 
16         <s:iterator begin="%{beginPageIndex}" end="%{endPageIndex}" var="num">
17             <s:if test="currentPage==#num">
18                 <%--当前页 --%>
19                 <span class="PageSelectorNum PageSelectorSelected">${num}</span>
20             </s:if>
21             <s:else>
22                 <%--非当前页 --%>
23                 <span class="PageSelectorNum" style="cursor: hand;" onClick="gotoPage(${num});">${num}</span>
24             </s:else>
25         </s:iterator>
26         <a href="javascript:gotoPage(${pageCount})" title="尾页" style="cursor: hand;"> <img
27                 src="${pageContext.request.contextPath}/style/blue/images/pageSelector/lastPage.png" /> </a> 转到:
28         <select id="pn" onchange="gotoPage(this.value)">
29             <s:iterator begin="1" end="%{pageCount}" var="num">
30                 <option value="${num}">
31                     ${num}
32                 </option>
33             </s:iterator>
34         </select>
35         <script type="text/javascript">
36             //回显页码
37             $("#pn").val(${currentPage});
38         </script>
39     </div>
40     </div>
41 
42 
43     <script type="text/javascript">
44     function gotoPage(pageNum){
45             //window.location.href="topicAction_show.action?id=${id}&pageNum="+pageNum;
46             $(document.forms[0]).append("<input type='hidden' name='pageNum' value='"+pageNum+"'/>");
47             document.forms[0].submit();//提交表单    
48         }
49     </script>

 

关于爱程序网 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助