posts - 33,  comments - 11,  trackbacks - 0

          經過幾天業余時間的研究,已經做了一套關于分頁的高效解決方案,所謂的高效,就是在數據庫底層,也做了分頁查詢,因此在進行大數據量的查詢時,速度會很快。如果不做底層的分頁的話,數據量超過5W,速度將會慢的象烏龜一樣。

            這套解決方案,是按照MVC的模式來做的,基于STRUTS框架。分為三個部分,表現層用的是JSP,其中用了JSTLpager taglib做分頁;控制層就是用的很傳統的Action底層就用的是Spring+Hibernate。下面分三個部分慢慢說:

            一、底層:

            底層是基于Spring+Hibernate來做的。在DAO這一層,為其增加兩個方法,一個方法為根據HQL語句和條件進行查詢,另外一個方法為根據HQL語句、條件、開始的記錄位置,共顯示的記錄數進行分頁查詢。底層的分頁查詢用的是Hibernate提供的分頁查詢。

            方法體如下所示:

          DAO 代碼
           1 public List findByCondition(String sql,Object[] parems){    
           2   
           3           List result = new ArrayList();    
           4   
           5           try{    
           6   
           7                  result = getHibernateTemplate().find(sql,parems);    
           8   
           9           }
          catch(RuntimeException re){    
          10   
          11                  re.printStackTrace();    
          12   
          13           }
              
          14   
          15           return result;    
          16   
          17}
              
          18   
          19     
          20   
          21public List findByCondition(String sql,Object[] parems,int first,int max){    
          22   
          23           List result = new ArrayList();    
          24   
          25           try{    
          26   
          27                  Session sess = getSession();    
          28   
          29                  Query query = sess.createQuery(sql);    
          30   
          31                  for(int i = 0;i<parems.length;i++){    
          32   
          33                         if(parems[i] instanceof Integer){    
          34   
          35                                query.setInteger(i,((Integer)parems[i]).intValue());    
          36   
          37                         }
              
          38   
          39                         if(parems[i] instanceof String){    
          40   
          41                                query.setString(i,parems[i].toString());    
          42   
          43                         }
              
          44   
          45                  }
              
          46   
          47                  query.setFirstResult(first);    
          48   
          49                  query.setMaxResults(max);    
          50   
          51                  result = query.list();    
          52   
          53           }
          catch(RuntimeException re){    
          54   
          55                  re.printStackTrace();    
          56   
          57           }
              
          58   
          59           return result;    
          60   
          61    }
              
          62
          OK,底層的工作就做完了!

          現在說中間的控制層。

          在Struts的FORM中,增加private int pageDisplay = 10; 屬性,并增加對應的setter和getter方法。這個屬性是用來設置每頁顯示的記錄數,10是默認值,可以根據實際情況進行設置。

          在Struts的ACTION層,增加一個方法,代碼如下:
            1package com.excellence.struts.action;    
            2   
            3   
            4import java.util.List;    
            5   
            6   
            7import javax.servlet.http.HttpServletRequest;    
            8   
            9import javax.servlet.http.HttpServletResponse;    
           10   
           11   
           12import org.apache.struts.action.Action;    
           13   
           14import org.apache.struts.action.ActionForm;    
           15   
           16import org.apache.struts.action.ActionForward;    
           17   
           18import org.apache.struts.action.ActionMapping;    
           19   
           20   
           21import com.excellence.page.Service;    
           22   
           23import com.excellence.struts.form.CheckForm;    
           24   
           25public class CheckAction extends Action {    
           26   
           27public ActionForward execute(    
           28   
           29ActionMapping mapping,    
           30   
           31ActionForm form,    
           32   
           33HttpServletRequest request,    
           34   
           35HttpServletResponse response) {    
           36   
           37   
           38   
           39setSubPage(request,form);    
           40   
           41   
           42   
           43return mapping.findForward("result");    
           44   
           45}
              
           46   
           47   
           48   
           49private void setSubPage(HttpServletRequest request,ActionForm form){    
           50   
           51CheckForm thisForm = (CheckForm)form;    
           52   
           53String content = thisForm.getContent();//查詢條件中的內容    
           54   
           55Service service = new Service();    
           56   
           57   
           58   
           59//拿到每頁要顯示的記錄數    
           60   
           61int pageSize = thisForm.getPageDisplay();    
           62   
           63request.setAttribute("pageSize",pageSize+"");    
           64   
           65//拿到目前要顯示得頁數    
           66   
           67int pageNumber = 1;    
           68   
           69String strPageNumber = request.getParameter("page");    
           70   
           71if(strPageNumber != null)    
           72   
           73pageNumber = Integer.parseInt(strPageNumber);    
           74   
           75//計算要顯示的頁數得第一條記錄的位置    
           76   
           77int start = 0;    
           78   
           79start = (pageNumber - 1)*pageSize;    
           80   
           81   
           82   
           83List result = service.findByCondition("from Subpage where content like ? order by content",new Object[]{content},start,pageSize);     
           84   
           85   List counts = service.findByCondition("select count(*) from Subpage where content like ?",new Object[]{content});    
           86   
           87int count = Integer.parseInt(counts.get(0).toString());    
           88   
           89request.setAttribute("count",count+"");//總條數    
           90   
           91   
           92   
           93// 設置總頁數    
           94   
           95int totalPage = count % pageSize == 0 ? count / pageSize : (count / pageSize + 1);    
           96   
           97request.setAttribute("totalPage",totalPage+"");    
           98   
           99   
          100   
          101request.setAttribute("result",result);    
          102   
          103if(result.size() == 0)    
          104   
          105request.setAttribute("result",null);    
          106   
          107}
              
          108   
          109}
              
          110   
          111   
          112
          主要就是增加了一個私有的方法private void setSubPage(HttpServletRequest request,ActionForm form)。


          下面說說表現層,代碼如下:
            1<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>   
            2<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>   
            3<%@ taglib uri="/WEB-INF/c.tld" prefix="c"%>   
            4<%@ taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg"%>   
            5   
            6<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">   
            7<script type="text/javascript">   
            8function changePageSize(){    
            9document.forms[0].submit();    
           10}
              
           11//直接跳轉到某個頁面    
           12function jumpPage(){    
           13var page = document.getElementById('page').value;    
           14var offset = (page -1 )*document.getElementsByName('pageDisplay')[0].value;    
           15document.location.href('check.do?pager.offset='+offset+'&page='+page);    
           16}
              
           17</script>   
           18<html>   
           19<head>   
           20   
           21<title>My JSP 'index.jsp' starting page</title>   
           22   
           23<meta http-equiv="pragma" content="no-cache">   
           24<meta http-equiv="cache-control" content="no-cache">   
           25<meta http-equiv="expires" content="0">   
           26<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">   
           27<meta http-equiv="description" content="This is my page">   
           28   
           29<!--   
           30<link rel="stylesheet" type="text/css" href="styles.css">   
           31-->   
           32</head>   
           33   
           34<body>   
           35<!-- 查詢條件部分 -->   
           36<html:form action="/check.do" method="post">   
           37<table>   
           38<tr>   
           39<td>   
           40內容:    
           41</td>   
           42</tr>   
           43<tr>   
           44<td>   
           45<html:text property="content" />   
           46</td>   
           47</tr>   
           48<tr>   
           49<td>   
           50<input type="submit" />   
           51</td>   
           52</tr>   
           53</table>   
           54   
           55   
           56   
           57<!-- 數據顯示部分 -->   
           58<c:if test="${result != null}">   
           59<pg:pager items="${count}" maxPageItems="${pageSize}" index="center" maxIndexPages="5" export="offset,currentPageNumber=pageNumber" scope="request" url="check.do">   
           60   
           61   
           62數據:<br />   
           63   
           64<table width="100%" border="1">   
           65<c:forEach items="${result}" var="subpage">   
           66   
           67<tr>   
           68<td>   
           69<c:out value="${subpage.content}"></c:out>   
           70</td>   
           71<td>   
           72<c:out value="${subpage.intValue}"></c:out>   
           73</td>   
           74</tr>   
           75   
           76</c:forEach>     
           77</table>   
           78   
           79<pg:index>     
           80第    
           81<select id="page" onchange="jumpPage();">   
           82<pg:pages>   
           83<c:if test="${pageNumber == currentPageNumber}">   
           84<option value="${pageNumber}" selected="selected" >${pageNumber}</option>   
           85</c:if>   
           86<c:if test="${pageNumber != currentPageNumber}">   
           87<option value="${pageNumber}" >${pageNumber}</option>   
           88</c:if>   
           89</pg:pages>   
           90</select>   
           91頁    
           92<c:out value="${totalPage }"></c:out>頁    
           93<pg:first>   
           94<a href="<%= pageUrl %>&page=${pageNumber}">首頁</a>   
           95</pg:first>   
           96   
           97<pg:prev>   
           98<a href="<%= pageUrl %>&page=${pageNumber}">上一頁</a>   
           99</pg:prev>   
          100   
          101<pg:next>   
          102<a href="<%= pageUrl %>&page=${pageNumber }">下一頁</a>   
          103</pg:next>   
          104   
          105<pg:last>   
          106<a href="<%= pageUrl %>&page=${pageNumber }">末頁</a>   
          107</pg:last>   
          108 共${count}條記錄    
          109   
          110每頁顯示    
          111<html:text property="pageDisplay" onchange="changePageSize();"/>   
          112條記錄    
          113   
          114</pg:index>   
          115   
          116</pg:pager>   
          117</c:if>   
          118</html:form>   
          119</body>   
          120</html>   
          121


          注意:若要采用DispatchAction的話,需要進行以下更改,注意isOffset="true",多了一個<pg:param name="method" value="list" />
          1<pg:pager items="${count}" maxPageItems="${pageSize}" index="center"
          2                maxIndexPages="5" isOffset="true" export="offset,currentPageNumber=pageNumber"
          3                scope="request" url="managerInterview.do">
          4                <pg:param name="method" value="list" />


          java 代碼
          posted on 2009-06-12 11:12 方濤升 閱讀(680) 評論(1)  編輯  收藏 所屬分類: j2ee

          FeedBack:
          # re: ssh+taglib實現分頁
          2011-01-10 17:14 | Sky、超兒
          SQL往哪寫  回復  更多評論
            
          <2009年6月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 基隆市| 溆浦县| 色达县| 禹州市| 浑源县| 西城区| 莱西市| 林西县| 龙江县| 富顺县| 铜川市| 永宁县| 正定县| 塔城市| 宁武县| 班玛县| 迭部县| 南乐县| 富裕县| 易门县| 沙坪坝区| 比如县| 清丰县| 塘沽区| 高台县| 宜宾县| 新乡市| 甘德县| 虹口区| 庆城县| 沁源县| 七台河市| 大英县| 清涧县| 青铜峡市| 建德市| 红河县| 浪卡子县| 隆德县| 民乐县| 遂宁市|