<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 33,  comments - 11,  trackbacks - 0

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

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

      一、底層:

      底層是基于Spring+Hibernate來做的。在DAO這一層,為其增加兩個方法,一個方法為根據(jù)HQL語句和條件進行查詢,另外一個方法為根據(jù)HQL語句、條件、開始的記錄位置,共顯示的記錄數(shù)進行分頁查詢。底層的分頁查詢用的是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,底層的工作就做完了!

    現(xiàn)在說中間的控制層。

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

    在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();//查詢條件中的內(nèi)容    
     54   
     55Service service = new Service();    
     56   
     57   
     58   
     59//拿到每頁要顯示的記錄數(shù)    
     60   
     61int pageSize = thisForm.getPageDisplay();    
     62   
     63request.setAttribute("pageSize",pageSize+"");    
     64   
     65//拿到目前要顯示得頁數(shù)    
     66   
     67int pageNumber = 1;    
     68   
     69String strPageNumber = request.getParameter("page");    
     70   
     71if(strPageNumber != null)    
     72   
     73pageNumber = Integer.parseInt(strPageNumber);    
     74   
     75//計算要顯示的頁數(shù)得第一條記錄的位置    
     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+"");//總條數(shù)    
     90   
     91   
     92   
     93// 設(shè)置總頁數(shù)    
     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)。


    下面說說表現(xiàn)層,代碼如下:
      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//直接跳轉(zhuǎn)到某個頁面    
     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內(nèi)容:    
     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<!-- 數(shù)據(jù)顯示部分 -->   
     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數(shù)據(jù):<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 方濤升 閱讀(672) 評論(1)  編輯  收藏 所屬分類: j2ee

    FeedBack:
    # re: ssh+taglib實現(xiàn)分頁
    2011-01-10 17:14 | Sky、超兒
    SQL往哪寫  回復(fù)  更多評論
      
    <2011年1月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    文章分類

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 大胆亚洲人体视频| 香港a毛片免费观看| 亚洲AV成人一区二区三区观看 | 亚洲AV无码成人精品区蜜桃| 亚洲日本中文字幕一区二区三区| 三年在线观看免费观看完整版中文| 亚洲韩国在线一卡二卡| 亚洲一级二级三级不卡| 亚洲天天在线日亚洲洲精| 亚洲va久久久噜噜噜久久狠狠| 欧洲美熟女乱又伦免费视频| 午夜私人影院免费体验区| 久久久久久99av无码免费网站 | 精品日韩亚洲AV无码一区二区三区| 无人在线直播免费观看| 精品无码国产污污污免费网站 | 亚洲精品无播放器在线播放| 亚洲欧美国产日韩av野草社区| 亚洲色精品aⅴ一区区三区| 亚洲春色在线视频| 久久精品国产亚洲av麻| 精品亚洲aⅴ在线观看| 亚洲性线免费观看视频成熟| 亚洲av无码一区二区三区人妖| 亚洲视频免费观看| 国产v亚洲v天堂a无| 日韩毛片在线免费观看| 中国一级毛片视频免费看| 久草免费福利视频| 野花高清在线观看免费完整版中文| 先锋影音资源片午夜在线观看视频免费播放| 国产亚洲美女精品久久久久| 粉色视频成年免费人15次| 久久WWW免费人成—看片| 日韩电影免费观看| 日韩一区二区a片免费观看| 免费a级毛片永久免费| 亚洲av无码专区国产乱码在线观看 | 亚洲AV无码一区二区三区牲色 | 中文字幕亚洲无线码| 亚洲国产一区二区三区青草影视|