<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

    經過幾天業余時間的研究,已經做了一套關于分頁的高效解決方案,所謂的高效,就是在數據庫底層,也做了分頁查詢,因此在進行大數據量的查詢時,速度會很快。如果不做底層的分頁的話,數據量超過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 方濤升 閱讀(672) 評論(1)  編輯  收藏 所屬分類: j2ee

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

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    文章分類

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产亚洲精品自在久久| 日本一道一区二区免费看| 中文字幕无码日韩专区免费| 成年网在线观看免费观看网址| 亚洲欧美黑人猛交群| 亚洲综合国产成人丁香五月激情 | 91免费国产在线观看| 69式互添免费视频| 99久久久精品免费观看国产 | 日韩电影免费观看| 久久国产精品免费视频| 久草福利资源网站免费| 99爱在线精品视频免费观看9| 9277手机在线视频观看免费| 69视频免费在线观看| av无码国产在线看免费网站| 免费观看的a级毛片的网站| 精品少妇人妻AV免费久久洗澡| 日本一线a视频免费观看| 免费在线观看黄网| 国产亚洲成归v人片在线观看| 国产亚洲精品自在久久| 亚洲综合小说久久另类区| 亚洲午夜电影在线观看高清 | 国产成人A人亚洲精品无码| 伊人久久综在合线亚洲2019| 亚洲美女免费视频| 亚洲av永久无码一区二区三区| 国产精品日本亚洲777| 精品国产污污免费网站入口| a毛片免费在线观看| 最近免费中文字幕大全免费 | 国产午夜无码片免费| 久久久久久久久久国产精品免费 | 国产精品玖玖美女张开腿让男人桶爽免费看| jizz日本免费| 99re免费99re在线视频手机版| 最近免费中文字幕大全| 亚洲日本一区二区三区在线不卡| 亚洲AV无码久久精品蜜桃| 亚洲91精品麻豆国产系列在线|