结果集到分页

如何将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中,使用LIMITOFFSET子句很容易:

 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; } 

在这里输入图像描述