*分頁:
????摘要:所用框架為:Hibernate+SPRing+Struts2,以分頁顯示后臺用戶列表為例
????1.設計實體:頁面類PageBean
????????1.1 分析:
????????????當前頁:currentPage(請求數(shù)據(jù))
????????????總記錄數(shù):recordCount(查數(shù)據(jù)庫:count(*))
????????????頁面大小:pageSize(配置文件設置值)
????????????本頁的數(shù)據(jù)列表:recordList(查詢數(shù)據(jù)庫:select *)
?
????????????總頁數(shù):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;
????????????????????//總記錄數(shù)
????????????????????this.recordCount=recordCount;
????????????????????//頁面大小
????????????????????this.pageSize=pageSize;
????????????????????//當前頁的總記錄列表
????????????????????this.recordList=recordList;
?
????????????????????//計算pageCount:總記錄數(shù)
????????????????????//這里可以用邏輯判斷,如:
????????????????????/*
????????????????????*if(recordCount%pageSize==0){
????????????????????*????pageCount=recordCount/pageSize;????
????????????????????*}else{
????????????????????*????pageCount=recordCount/pageSize+1;
????????????????????*}
????????????????????*/
????????????????????//或則用算法,自己琢磨
????????????????????pageCount=(recordCount+pageSize-1)/pageSize;
????????????????????
????????????????????//這里以顯示十個頁碼索引為例,設置開始頁碼索引和結束頁碼索引
????????????????????//當頁面總數(shù)小于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;
????????????????
????????????????//參數(shù)集合,Hql語句中where子句中用到的參數(shù)對象
????????????????private List<Object> parameters=new ArrayList<Object>();
????????????????
????????????????//構造函數(shù)設置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子句的,以及用到的參數(shù)對象,這就是查詢條件
????????????????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;
????????????????}
????????????????//設置是否追加,這個接口留給用戶,到時方便用戶開發(fā)
????????????????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;
????????????????}
?
????????????????//計數(shù)hql
????????????????public String getCountHql(){
????????????????????return "SELECT COUNT(*) "+fromClause+whereClause;
????????????????}
????????????????
????????????????//參數(shù)集合get接口,供外部訪問
????????????????public List<Object> getParameters(){
????????????????????return parameters;
????????????????}
????????????????
//這里只要兩個參數(shù),跳轉的頁面,和繼承了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;
?
????????????????//在構造函數(shù)中進行初始化clazz
????????????????public BaseDaoImpl(){
????????????????????ParameterirzedType pt=(ParameterizedType)this.getClass().getGenericSuperclass();
????????????????????this.clazz=(Class)pt.getActualTypeArguments()[0];
????????????????}
????????????????
????????????????//獲取Session,方便操作數(shù)據(jù)庫
????????????????protected Session getSession(){
????????????????????return sessionFactory.getCurrentSession();
????????????????}
?
????????????????public PageBean getBean(int pageNum,HqlHelper hqlHelper){
????????????????????
????????????????????//參數(shù)集合
????????????????????private List<Object> parameters=hqlHelper.getParameters();
????????????????????//配置的頁面大小
????????????????????private int pageSize=Configuration.getPageSize();
????????????????????
????????????????????//recordCount,總記錄數(shù)
????????????????????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());
????????????????????//設置查詢參數(shù)
????????????????????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;
?
????????????????//用戶數(shù)據(jù)列表,分頁顯示
????????????????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}頁 每頁顯示:${pageSize}條 總記錄數(shù):${recordCount}條 ????</div> ????<divid=PageSelectorSelectorArea> ???????? ????????<ahref="javascr><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> |
?
新聞熱點
疑難解答