*分页:
>思路: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}页 每页显示:${pageSize}条 总记录数:${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>