结果集到分页
如何将Resultset对象转换为JSP上的分页视图?
例如,这是我的查询和结果集:
pst = con.prepareStatement("select userName, job, place from contact"); rs = pst.executeQuery();
首先,您需要向JSP添加一个或两个额外的请求参数: firstrow
和(可选) rowcount
。 行rowcount
也可以在服务器端完全保留。
然后在JSP中添加一堆分页button: 下一个button应该指示Servlet
使用rowcount
的值递增firstrow
的值。 前一个button显然应该用rowcount
的值减lessfirstrow
的值。 不要忘记处理负值和溢出正确! 你可以在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; }
在Oracle中,你需要一个带有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; }
在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; }
我不使用MSSQL,但它在语法上类似于DB2。 另请参阅此主题 。
最后,用JSTL c:forEach
通常的方式在JSP页面中呈现子列表。
<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>
请注意,有些人可能会build议您SELECT
整个表格,并将List<Contact>
保存在会话范围中,并使用List#subList()
进行分页。 但是,这对于数千行和多个并发用户来说是远远不够的 。
对于那些对使用h:dataTable
组件的JSF / MySQL上下文中的类似回答感兴趣的人,您可能会发现这篇文章很有用。 它还包含一些有用的语言不可知的math,可以很好地使“类似Google”的分页工作。
这个Oracle例子是错误的。
是的,在外部selectwhe具有良好的ROWNUM值,但它仍然是伪列,所以我们不能使用BETWEEN就可以了。 我们需要一个更多的select。
正确的sql代码是:
SELECT c.* FROM (SELECT c.*, ROWNUM as rnum FROM (SELECT id, username, job, place FROM contact ORDER BY id) c) c WHERE c.rnum BETWEEN 5 AND 10
同志们,使用稳固的sqlstring和Statement类是SLOOOW。 每次执行时,Oracle都必须parsingSQL。
//Slooow example Satement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select * from my_table where id = 11");
使用PreparedStatement和绑定参数。
//Faster example PreparedStatement ps = conn.getPrepareStatement("select * from my_table where id = ?"); ps.setInt(1, 11);
而最快的解决scheme是把你的SQL放在oracle存储过程中,并使用CallableStatement来调用它。
//Fastest example CallableStatement cs = conn.prepareCall("{? = call my_plsql_function(?)}"); cs.setInt(1, 11);
以下是你可以做的一些事情:
- 把结果集放到一些对象/logging列表中
- 根据您所需的页面大小,根据结果集计算出您将拥有多less页面。
- 根据要在页面上显示的项目数检查所需页面的请求参数和偏移量。 所以如果你在页面4上显示12,你的偏移量是48。
-
根据项目的数量确定总页数。
-
根据您确定的偏移量显示您的项目(仅从项目48开始显示)
- 根据您确定的总页数生成页面数量的分页。
=======
这是你的基本方法。 你可以调整这个:
- 确定一种方法来限制查询页面(但这不会帮助您确定页面大小)
- 花式的分页方式
- 等等..
查找价值列表模式,并应用它。 这通常是处理这些事情的最好方法。
你可以使用displaytag进行paigination或者resultset,但是你可以从displattag下载一些jar文件
首先你创build一个servlet StudentList.java
public class StudentList extends HttpServlet
{公共无效服务(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException {
ArrayList al=new ArrayList(); StudentDao stdo=new StudentDao(); // this is DAO Class (Data Acccess Object) try { al=stdo.getStudentList(); //getstudent list dao method } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } request.setAttribute("al",al); RequestDispatcher rd=request.getRequestDispatcher("StudentPaging.jsp"); rd.forward(request,response); }
}
// dao方法
public ArrayList getStudentList() throws SQLException,Exception { ArrayList ai=new ArrayList(); Connection con=null; Statement st=null; ResultSet rs=null; Date dt=new Date(); SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy"); StudentInformation sdata=null; con=MyConnection.creatConnection(); if(con!=null) { st=con.createStatement(); String select="select * from STUDENT"; System.out.println(select); rs=st.executeQuery(select); if(rs!=null) { while(rs.next()) { sdata=new StudentInformation(); sdata.setSid(rs.getString("SID")); sdata.setFirstName(rs.getString("FIRSTNAME")); sdata.setMiddleName(rs.getString("MIDDLENAME")); sdata.setLastName(rs.getString("LASTNAME")); dt=rs.getDate("SDATE"); sdata.setDateofbirth(sdf.format(dt)); sdata.setGender(rs.getString("GENDER")); sdata.setAddress(rs.getString("ADDRESS")); sdata.setHigestQulification(rs.getString("HIQULIFICATION")); sdata.setLanguageKnow(rs.getString("LANGUAGE")); sdata.setHobby(rs.getString("HOBBY")); sdata.setTermCondition(rs.getString("TERMCON")); ai.add(sdata); } } } return ai; }