Servlets 映射内部映射的JSTL分页

Servlets 映射内部映射的JSTL分页,servlets,jdbc,collections,pagination,jstl,Servlets,Jdbc,Collections,Pagination,Jstl,我需要实现简单的分页,每页显示100条记录,分页数据按日期排序。虽然我已正确排序了信息,但我无法考虑分页逻辑,因为resultset在map中,而map又在map中 下面是我的JSTL代码以及TitleList/Title的定义,我在其中添加resultset数据后正在迭代该代码 Map<Date, LinkedHashMap<Integer, String>> TitleList = new LinkedHashMap<Date, LinkedHashMap&l

我需要实现简单的分页,每页显示100条记录,分页数据按日期排序。虽然我已正确排序了信息,但我无法考虑分页逻辑,因为resultset在map中,而map又在map中

下面是我的JSTL代码以及TitleList/Title的定义,我在其中添加resultset数据后正在迭代该代码

 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> 
下面是servlet代码I,它将在从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"));
                    }

                }
Map TitleList=newlinkedhashmap();
String sqld=“选择不同的日期(时间戳)作为表ORDER BY DATE DESC LIMIT 730中的日期;”;
结果集rsd=null;
试一试{
rsd=stmt1.executeQuery(sqld);
}catch(SQLException-ex){
Logger.getLogger(myclass.class.getName()).log(Level.SEVERE,null,ex);
}
试一试{
while(rsd.next()){
LinkedHashMap Title=新建LinkedHashMap();
//系统输出打印(“测试”);
日期=rsd.getDate(“日期”);
//系统输出打印项次(日期);
String sql=“从表中选择标题,id,其中日期(时间戳)='”“+DATE+”“ORDER BY id DESC”;
//System.out.println(sql);
结果集rs=stmt.executeQuery(sql);
rs.last();
int numRows=rs.getRow();
//System.out.println(rs.getRow());
rs.beforeFirst();
while(rs.next()){

对于(int i=1;i在这种情况下,我假设您正在从数据库检索所有记录,现在您希望对其进行排序,并在页面上一次仅显示100条记录

  • 将结果存储在主数组列表中。然后使用公共列表子列表(int fromIndex, int toIndex)提取前100条记录并将此数据存储到请求范围中,并在jsp中使用它,如上所述
  • 当用户单击“下一步”按钮时,使用主arraylist,现在获取下一组100条记录,并使用新的记录集再次显示页面。请确保维护一个包含当前记录的startIndex计数的变量

  • 如果您有一个较大的列表,那么以这种方式进行分页可能会影响性能,因为该列表需要存储在会话中,以供同一用户的后续请求。

    请尝试此演示页面

    <%@ 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>
    
    
    
    标题


    我可以尝试尝试这种方法,看看结果如何。对于某些功能,我希望列表足够大。我也不会一次检索所有数据,我就是这样做的,我首先使用distinct子句运行查询以获得不同的日期,这些不同的日期存储在日期列表中,然后使用这些日期进行查询e另一个查询将给我标题和id,这个标题和id然后被输入到linkedhash映射。最后我将所有这些东西添加到另一个linkedhashmap中。Rickz,这就是我最后做的,解决了我的问题,它对column.key和column值循环了太多次。每个标记都有问题。{TitleList}是map中的map,它的项看起来像{2012/07/02,{1,title1}{2,title2},{3,title3}},所以当我使用foreach标记并尝试循环titlelist值字段时,它会变得疯狂。我认为titlelist是一个键为日期、值为maps的map。那么${fn:length(titlelist)}打印?也许我们应该使用一些虚拟数据来测试JSTL?我正在检查Rickz。它会再次更新。请给我一些时间确定它的打印18,也许这就是它不分页的原因。但是我在地图的值部分有100多条记录。每个日期可以有100多条记录,这部分我需要分页,如果ate的记录少于100条,因此应该对日期及其相关值进行分页。
    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);
        }
    
    <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
    
    <%@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>
    
        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);
    
            }
    
    <%@ 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>