2012-08-09 25 views
0

我需要實現簡單的分頁顯示每頁100條記錄和分頁數據按日期排序。儘管我已經正確地對信息進行了排序,但是我無法考慮分頁邏輯,因爲resultset是在地圖內這是再次舉行地圖裏面,JSTL分頁內地圖地圖

下面是我的JSTL代碼連同TitleList /標題的定義,我將它添加結果集數據後迭代。

Map<Date, LinkedHashMap<Integer, String>> TitleList = new LinkedHashMap<Date, LinkedHashMap<Integer, String>>(); 

LinkedHashMap<Integer, String> Title = new LinkedHashMap<Integer, String>(); 

<c:forEach items="${TitleList}" var="column"> 
      <p><c:out value="${column.key}"/></p>      
      <c:forEach var="Title" items="${column.value}"> 
       <p><a href="<%=request.getContextPath()%>/Test.do?id=${Title.key}"><c:out value="${Title.value}"/></a></p> 
      </c:forEach> 
     </c:forEach> 

雖然我可以通過添加分頁的結果集直接列出,但將被排序順序和功能,我期待for.Somehow上面的代碼殺人,我需要限制在100個記錄每頁,然後實現下一個按鈕,將再次顯示100條記錄。 欣賞一些關於此的想法。

更新:增加更多的信息,這是圖的樣子從servlet的地方我創造titlelist和標題地圖,

map = {2012-07-12={160=tstng, 159=testing}, 2012-07-10={158=test, 157=test, 156=Testing, 155=Testing, 154=Testing, 153=Testing, 152=Testing, 151=Testing, 150=Testing, 149=Testing, 148=Testing, 147=Testing, 146=Testing, 145=Testing, 144=Testing, 143=Testing, 142=Testing, 141=Teasting, 140=Teasting, 139=Testing, 138=Testing, 137=Testing , 136=Testing for testing, 135=Testing for testing, 134=Testing for Test, 133=Testing}, 2012-07-04={132=Testing for Broker}, 2012-07-03={131=Testing for Post, 130=1200 TESTIN}, 2012-07-01={129=testing}, 2012-03-30={128=upload test}, 2012-03-28={127=test}, 2012-01-08={126=1BHK flat for 1000$ at Journal Square}, 2012-01-04={125=tseting by kiran, 124=tseting by kiran, 123=tseting by kiran, 122=tseting by kiran, 121=tseting by kiran, 120=tseting by kiran, 119=tseting by kiran, 118=tseting by kiran, 117=tseting by kiran, 116=tseting by kiran, 115=tseting by kiran, 114=tseting by kiran, 113=tseting by kiran, 112=tseting by kiran, 111=tseting by kiran, 110=tseting by kiran, 109=tseting by kiran, 108=tseting by kiran, 107=tseting by kiran, 106=tseting by kiran, 105=tseting by kiran, 104=tseting by kiran}, 2012-01-02={103=testing, 102=testing, 101=testing, 100=testing, 99=testing, 98=testing, 97=testing, 96=testing, 95=testing, 94=testing, 93=testing, 92=testing, 91=testing, 90=testing, 89=testing, 88=testing, 87=testing, 86=testing, 85=testing, 84=testing, 83=testing, 82=testing, 81=testing, 80=testing, 79=testing, 78=testing, 77=testing, 76=testing, 75=testing, 74=testing}, 2011-12-09={73=The monthly consumer price index rose 4.2% from the year-ago period, reflecting a huge easing from Octoberâ??s 5.5% increase. }, 2011-12-08={72=Testing for dispplay}, 2011-11-25={71=Apartment for Rent at Journal Square for 1000$.Please see now., 70=Apartment for Rent at Journal Square for 1000$.Please see now., 69=testing, 68=AS, 67=A, 66=A, 65=q, 64=q, 63=Testing, 62=Testing}, 2011-11-24={61=testing, 60=tEST, 59=TESTING, 58=TESTING, 57=Testing, 56=Testing, 55=Testing, 54=tseting, 53=testing, 52=testing, 51=testing, 50=teting, 49=tESTING, 48=tESTING, 47=tESTING, 46=Testing, 45=TESTING, 44=TESTING, 43=tESTING}, 2011-11-23={42=Testing, 41=testing, 40=Testing, 39=tESTING, 38=TETING, 37=testing}, 2011-11-22={36=Testing, 35=Testing, 34=Testing, 33=Testing by Kiran, 32=testing, 31=Testing, 30=Testing by Kiran, 29=Testing byt kiran, 28=Testing by Kiran, 27=testing by kiran, 26=testing by kiran, 25=Testing , 24=TSETING, 23=Testing by Kiran}, 2011-11-21={22=testing, 21=Testng, 20=TESTING, 19=TESTING, 18=ESTING, 17=ESTING, 16=ESTING, 15=ESTING, 14=testing by kiran, 13=testing by Kiran, 12=Testing by Kiran, 11=testing by Kiran, 10=Testing by Kian, 9=Testing by Kiran, 8=Testing by Kiran, 7=Testing byKiran, 6=testing, 5=Test by Kiran, 4=Test by Kiran}, 2011-11-20={3=testing, 2=testing, 1=testing}} 

下面是servlet代碼我將從DB看完之後創建的地圖,

Map<Date, LinkedHashMap<Integer, String>> TitleList = new LinkedHashMap<Date, LinkedHashMap<Integer, String>>(); 
      String sqld = "Select Distinct DATE(timestamp) as DATE from table ORDER BY DATE DESC LIMIT 730 ;"; 
      ResultSet rsd = null; 
      try { 
       rsd = stmt1.executeQuery(sqld); 
      } catch (SQLException ex) { 
       Logger.getLogger(myclass.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      try { 
       while (rsd.next()) { 
        LinkedHashMap<Integer, String> Title = new LinkedHashMap<Integer, String>(); 
      //  System.out.println("Testing"); 
        Date Date = rsd.getDate("Date"); 
      //  System.out.println(Date); 
        String sql = "Select title,id from table Where DATE(timestamp) = '" + Date + "'ORDER BY id DESC"; 
      //   System.out.println(sql); 
        ResultSet rs = stmt.executeQuery(sql); 
        rs.last(); 
        int numRows = rs.getRow(); 
      //   System.out.println(rs.getRow()); 
        rs.beforeFirst(); 
        while (rs.next()) {         
         for (int i = 1; i <= numRows; i++) { 
          String title = rs.getString("title"); 
          Integer id = rs.getInt("id"); 
           Title.put(id, title);       
          TitleList.put(Date, Title); 
         } 
         System.out.println("Size of LinkedHashMap for Title : " + Title.size()); 
     //    System.out.println(rs.getString("title")); 
        } 

       } 

這裏是我試過Richz, 這裏是我得到的DAO類我不喜歡的東西下面,

string query ="select title,id,date(timestamp) as date from table"; 
list<TitleList> list = new ArrayList<Titlelist>(); 
try { 

resultset rs = stmt.executeQuery(query); 
    while(rs.next()){ 
    myclass myc = new myclass(); 
    myc.setcid(rs.getInt("id"); 
    myc.settitle(rs.getString("title"); 
    myc.settimestamp(rs.gettimestamp("timestamp"); 
    list.add(myc); 
    } 

和JSP

<c:foreach var="Titlelist" items="${Titlelist}"> 
    EL for title,id and title 
</c:foreach> 
With this approach I can do pagination date wise along pages and data looks like below along with pagination 

Date10 title10 
Date10 title09 



However I need data in this format, 
Date 10 
title10 
title09 

我試圖做名單列表中,但由於某些原因,我不能做它。我正在失去columns.My互聯網搜索之間的關係表明了我的分頁如上做了名單。 8月31日

更新的詳細信息,在這裏

好Richz是我的JSP,我已經使用完全相同的結構爲你的。

<%@page import="java.util.LinkedHashMap"%> 
<%@page import="java.util.Date"%> 
<%@page import="java.util.Map"%> 
<%@page import="java.util.List"%> 
<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@ include file="/header.jsp" %> 
<%@ include file="WEB-INF/jspf/navdisplay.jspf" %> 
<%@page import="java.util.ArrayList"%> 
<%@page session="true" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 

<!DOCTYPE html> 
<html> 
    <head> 
     <title>DB Test</title> 
    </head> 
    <body> 
     <c:set var="dateTotal" scope="session" value="${fn:length(list)}"/> 
     <c:set var="currentDate" value="${param.date}"/> 
     <c:if test="${empty currentDate or currentDate < 0}"> 
      <c:set var="currentDate" value="0"/> 
     </c:if> 
     <c:if test="${dateTotal <= currentDate}"> 
      <c:set var="currentDate" value="${dateTotal - 1}"/> 
     </c:if> 
     <c:set var="perPage" scope="session" value="10"/> 
     <c:set var="pageStart" value="${param.start}"/> 
     <c:if test="${empty pageStart or pageStart < 0}"> 
      <c:set var="pageStart" value="0"/> 
     </c:if> 
     <a href="?date=${currentDate - 1}">Previous Date</a> <a href="?date=${currentDate + 1}">Next Date</a><br/> 
     Titles <a href="?start=${pageStart - perPage}"><<</a>${pageStart + 1} - ${pageStart + perPage} <a href="?start=${pageStart + perPage}">>></a> 
     <c:forEach items="${list[currentDate]}" var="item" > 
      <p><c:out value="${item.key}"/></p> 
      <c:forEach var="Title" items="${item.value}" begin="${pageStart}" end="${pageStart + perPage - 1}" > 
       <p><a href="<%=request.getContextPath()%>/Test.do?id=${Title.key}"><c:out value="${Title.value}"/></a></p> 
      </c:forEach>     
     </c:forEach> 
    </body> 
</html> 

下面是小服務程序,其生成用於列表數據,

列表列表=新的ArrayList();

Map<Date, LinkedHashMap<Integer, String>> TitleList = new LinkedHashMap<Date, LinkedHashMap<Integer, String>>(); 
    String sqld = "Select Distinct DATE(ctimestamp) as DATE from table ORDER BY DATE DESC LIMIT 730 ;"; 
    ResultSet rsd = null; 
    try { 
     rsd = stmt1.executeQuery(sqld); 
    } catch (SQLException ex) { 
     Logger.getLogger(sortResultshs.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    try { 
     while (rsd.next()) { 
      LinkedHashMap<Integer, String> Title = new LinkedHashMap<Integer, String>(); 
    //  System.out.println("Testing"); 
      Date Date = rsd.getDate("Date"); 
    //   System.out.println(Date); 

      String sql = "Select title,id from table Where DATE(ctimestamp) = '" + Date + "'ORDER BY id DESC"; 
    //  System.out.println(sql); 
      ResultSet rs = stmt.executeQuery(sql); 
      rs.last(); 
      int numRows = rs.getRow(); 
    //   System.out.println(rs.getRow()); 
      rs.beforeFirst(); 
      while (rs.next()) { 
       //  List<String> Title = new ArrayList<String>();    
       for (int i = 1; i <= numRows; i++) { 
        String title = rs.getString("title"); 
        Integer id = rs.getInt("id"); 
        Title.put(id, title); 
        TitleList.put(Date, Title);       

       } 

//    System.out.println(rs.getString("title")); 
      } 

      list.add(TitleList); 

     } 

和列表看起來像下面,

總行數爲:160 名單是:[{2012-07-12 = {160 = tstng,159 =測試},2012-07 -10 = {158 =測試,157 =測試,156 =測試,155 =測試,154 =測試,153 =測試,152 =測試,151 =測試,150 =測試,149 =測試,148 =測試,147 =測試,146 =測試,145 =測試,144 =測試,143 =測試,142 =測試,141 =排隊,140 =排隊,139 =測試,138 =測試,137 =測試,136 =測試測試,135 =測試測試,134 =測試測試,133 =測試},2012-07-04 = {132 =測試代理},2012-07-03 = {131 =測試測試,130 = 1200測試} 07-01 = {129 = testing},2012-03-30 = {128 = uplo廣告測試},2012年3月28日= {127 =測試},2012-01-08 = {126 = 1BHK平在1000 $在Journal Square},2012-01-04 = {125 = kiran,124 = kiran,123 = kiran,122 = kiran,121 = kiran,120 = kiran,119 = kiran,118 = kiran,117 = kiran,116 = tseting by kiran,115 = kiran,114 = kiran,113 = kiran,112 = kiran,111 = kiran,110 = kiran,109 = kiran,108 = kiran, 107 =測試,102 =測試,101 =測試,100 =測試,99 =測試,100 =測試,99 =測試98 =測試97 =測試96 =測試95 =測試94 =測試93 =測試92 =測試91 =測試90 =測試89 =測試88 =測試87 =測試, 86 =測試85 =測試84 =測試83 =測試82 =測試81 =測試80 =測試79 =測試78 =測試77 =測試76 =測試75 =測試74 =測試},2011-12-09 = {73 =每月消費者p大米指數較上年同期上漲4.2%,反映10月份的5.5%大幅回落。 },2011-12-08 = {72 =測試display},2011-11-25 = {71 =公寓出租在Journal Square爲1000 $。請看現在。,70 =公寓出租1000 $。請現在看,69 =測試,68 = AS,67 = A,66 = A,65 = q,64 = q,63 =測試,62 =測試,2011-11-24 = {61 = testing,60 =測試59 =測試58 =測試57 =測試56 =測試55 =測試54 =測試53 =測試52 =測試51 =測試50 =測試49 =測試48 =測試, 47 =測試,46 =測試,45 =測試,44 =測試,43 =測試} 2011-11-23 = 42 =測試41 =測試40 =測試39 =測試38 = TETING 37 =測試},2011-11-22 = {36 =測試,35 =測試,34 =測試,33 = Kiran測試,32 =測試,31 =測試,30 = Kiran測試,29 =測試byt kiran, Kiran測試,27 = kiran測試,26 = kiran測試,25 =測試,24 = TSETING,23 = Kiran測試,2011-11-21 = {22 =測試,21 = Testng,20 =測試, 19 =測試,18 =測試,17 =測試,16 =測試,15 =測試,14 = kiran測試,13 = Kiran測試,12 = Kiran測試,11 = Kiran測試,10 = Testin測試g由Kian測試,9 =由Kiran測試,8 =由Kiran測試,7 =由Kiran測試,6 =測試,5 =由Kiran測試,4 =由Kiran測試,2011-11-20 = {3 =測試,2 = testing,1 = testing}}]

回答

0

在這種情況下,我假設您正在從數據庫中獲取所有記錄,現在您想對其進行排序,並一次僅顯示100條記錄。要解決此問題,您可以採取以下方法

  1. 將結果存儲在主數組列表中。然後使用public List subList(int fromIndex, int toIndex)提取前100條記錄,並將這些數據存入請求範圍,並在jsp中使用它,如上所述
  2. 當用戶單擊Next按鈕時,使用master ArrayList,現在獲取下一組100條記錄,並再次使用新的記錄集顯示頁面。確保您維護一個具有當前記錄的startIndex計數的變量。

以這種方式進行分頁可能會導致性能下降,因爲此列表隨後需要存儲在會話中以供來自同一用戶的後續請求使用。

+0

我可以嘗試嘗試這種方法,看看我得到的結果如何。對於某些功能,我期望列表足​​夠大。 – 2012-08-09 16:58:18

+0

我也一次不檢索所有的數據,這是我怎麼做的,我首先運行帶有distinct子句的查詢以獲得不同的日期,這些不同的日期存儲在日期列表中,然後使用這些日期來激發另一個日期查詢這將給我標題和ID,這個標題和ID然後饋送到linkedhash map.and最後我添加所有這些東西在另一個linkedhashmap。 – 2012-08-09 17:01:16

+0

裏克茲,這是我終於做了什麼,哪個解決了我的問題, – 2012-09-24 00:35:18

0

請試試這個演示頁面。

<%@ page import="java.util.*" %> 
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
<% 
    //dummy data 
    List<Map> list = new ArrayList<Map>(); 
    long now = new Date().getTime(); 
    for(int i = 1; i < 4; i++){ 
    LinkedHashMap<Integer, String> titleMap = new LinkedHashMap<Integer, String>(); 
    for(int j = 1; j < 43 ;j++){ 
     titleMap.put(j, "title" + j); 
    } 
    Map<Date, LinkedHashMap<Integer, String>> dateMap = new LinkedHashMap<Date, LinkedHashMap<Integer, String>>(); 
    dateMap.put(new Date(now + 1000*60*60*25* i), titleMap); 
    list.add(dateMap); 
} 
pageContext.setAttribute("list", list); 
%> 
<c:set var="dateTotal" scope="session" value="${fn:length(list)}"/> 
<c:set var="currentDate" value="${param.date}"/> 
<c:if test="${empty currentDate or currentDate < 0}"> 
    <c:set var="currentDate" value="0"/> 
</c:if> 
<c:if test="${dateTotal <= currentDate}"> 
    <c:set var="currentDate" value="${dateTotal - 1}"/> 
</c:if> 
<c:set var="perPage" scope="session" value="10"/> 
<c:set var="pageStart" value="${param.start}"/> 
<c:if test="${empty pageStart or pageStart < 0}"> 
    <c:set var="pageStart" value="0"/> 
</c:if> 
<a href="?date=${currentDate - 1}">Previous Date</a> <a href="?date=${currentDate + 1}">Next Date</a><br/> 
Titles <a href="?start=${pageStart - perPage}"><<</a>${pageStart + 1} - ${pageStart + perPage} <a href="?start=${pageStart + perPage}">>></a> 
<c:forEach items="${list[currentDate]}" var="item" > 
    <p><c:out value="${item.key}"/></p> 
    <c:forEach var="Title" items="${item.value}" begin="${pageStart}" end="${pageStart + perPage - 1}" > 
      <p><a href="<%=request.getContextPath()%>/Test.do?id=${Title.key}"><c:out value="${Title.value}"/></a></p> 
    </c:forEach>     
</c:forEach> 
+0

是的,我試過這個,它沒有顯示 – 2012-08-09 17:02:12

+0

它爲column.key和column的值循環了太多次。每個標籤都出錯了。 – 2012-08-09 17:03:18

+0

{TitleList}是地圖內的地圖,其中的項目看起來像{2012/07/02,{{1,title1} {2,title2},{3,title3}},所以當我使用foreach標記並嘗試循環titlelist value字段,它變得瘋狂。 – 2012-08-09 17:07:28