Servlets 映射内部映射的JSTL分页
我需要实现简单的分页,每页显示100条记录,分页数据按日期排序。虽然我已正确排序了信息,但我无法考虑分页逻辑,因为resultset在map中,而map又在map中 下面是我的JSTL代码以及TitleList/Title的定义,我在其中添加resultset数据后正在迭代该代码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
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>