Gna*_*air 18 java pagination jsp jdbc
如何将Resultset对象转换为JSP上的分页视图?
例如,这是我的查询和结果集:
pst = con.prepareStatement("select userName, job, place from contact");
rs = pst.executeQuery();
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 39
首先,您需要向JSP添加一个或两个额外的请求参数:firstrow和(可选)rowcount.该rowcount也可以留下,距离完全在服务器端definied.
然后向JSP添加一堆分页按钮:下一个按钮应该指示Servlet增加值firstrow的值rowcount.在前面的按钮应该明显递减的价值firstrow与价值rowcount.不要忘记正确处理负值和溢出!你可以借助它来做到这一点SELECT count(id).
然后触发特定的SQL查询以检索结果的子列表.但确切的SQL语法取决于所使用的数据库.在MySQL和PostgreSQL中,使用LIMIT和OFFSET子句很容易:
private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM"
+ " contact ORDER BY id LIMIT %d OFFSET %d";
public List<Contact> list(int firstrow, int rowcount) {
String sql = String.format(SQL_SUBLIST, firstrow, rowcount);
// Implement JDBC.
return contacts;
}
Run Code Online (Sandbox Code Playgroud)
在Oracle中,您需要一个子查询with rownum子句,它应该如下所示:
private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM"
+ " (SELECT id, username, job, place FROM contact ORDER BY id)"
+ " WHERE ROWNUM BETWEEN %d AND %d";
public List<Contact> list(int firstrow, int rowcount) {
String sql = String.format(SQL_SUBLIST, firstrow, firstrow + rowcount);
// Implement JDBC.
return contacts;
}
Run Code Online (Sandbox Code Playgroud)
在DB2中,您需要OLAP函数row_number():
private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM"
+ " (SELECT row_number() OVER (ORDER BY id) AS row, id, username, job, place"
+ " FROM contact) AS temp WHERE row BETWEEN %d AND %d";
public List<Contact> list(int firstrow, int rowcount) {
String sql = String.format(SQL_SUBLIST, firstrow, firstrow + rowcount);
// Implement JDBC.
return contacts;
}
Run Code Online (Sandbox Code Playgroud)
我不做MSSQL,但它在语法上类似于DB2.另请参阅此主题.
最后,使用JSTL以常规方式在JSP页面中显示子列表c:forEach.
<table>
<c:forEach items="${contacts}" var="contact">
<tr>
<td>${contact.username}</td>
<td>${contact.job}</td>
<td>${contact.place}</td>
</tr>
</c:forEach>
</table>
<form action="yourservlet" method="post">
<input type="hidden" name="firstrow" value="${firstrow}">
<input type="hidden" name="rowcount" value="${rowcount}">
<input type="submit" name="page" value="next">
<input type="submit" name="page" value="previous">
</form>
Run Code Online (Sandbox Code Playgroud)
请注意,有些人可能会建议您需要SELECT整个表并保存List<Contact>在会话范围内并使用List#subList()分页.但这远远没有内存效率,有数千行和多个并发用户.
对于那些对使用h:dataTable组件的JSF/MySQL上下文中的类似答案感兴趣的人,您可能会发现本文很有用.它还包含一些有用的语言无关数学,以使"类似Google"的分页很好地工作.
| 归档时间: |
|
| 查看次数: |
33413 次 |
| 最近记录: |