如何将Resultset对象转换为JSP上的分页视图?
例如,这是我的查询和结果集:
pst = con.prepareStatement("select userName, job, place from contact");
rs = pst.executeQuery();
答案 0 :(得分:39)
首先,您需要向JSP添加一个或两个额外的请求参数:firstrow
和(可选)rowcount
。 rowcount
也可以保留,并完全在服务器端进行定义。
然后向JSP添加一堆分页按钮: next 按钮应指示Servlet
增加firstrow
的值,其值为{{1} }。 上一个按钮显然应减少rowcount
的值,其值为firstrow
。不要忘记正确处理负值和溢出!你可以借助rowcount
。
然后触发特定的SQL查询以检索结果的子列表。但确切的SQL语法取决于使用的DB。在MySQL和PostgreSQL中,使用SELECT count(id)
和LIMIT
子句很容易:
OFFSET
在Oracle中,您需要一个带有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;
}
子句的子查询,它应该如下所示:
rownum
在DB2中,您需要OLAP函数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;
}
:
row_number()
我不做MSSQL,但它在语法上与DB2类似。另请参阅this topic。
最后,只需使用JSTL c:forEach
以常规方式在JSP页面中显示子列表。
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;
}
请注意,某些可能建议您需要<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>
整个表并将SELECT
保存在会话范围内并使用List#subList()
进行分页。但这远远超过远的内存效率,有数千行和多个并发用户。
对于那些对使用List<Contact>
组件的JSF / MySQL上下文中的类似答案感兴趣的人,您可能会发现this article很有用。它还包含一些有用的语言无关数学,以使“类似Google”的分页很好地工作。
答案 1 :(得分:3)
这个Oracle示例是错误的。
是的,在外部选择具有良好的ROWNUM值,但它仍然是伪列,所以我们不能使用BETWEEN。我们还需要一个选择。
正确的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
同志们,使用solid sql string和Statement类是SLOOOW。每次执行时,Oracle都必须解析SQL。
//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);
最快的解决方案是将你的sql放在oracle存储过程中,并使用CallableStatement来调用它。
//Fastest example
CallableStatement cs = conn.prepareCall("{? = call my_plsql_function(?)}");
cs.setInt(1, 11);
答案 2 :(得分:2)
以下是您可以做的几件事:
根据项目数确定总页数。
根据您确定的偏移量显示您的项目(仅从第48项开始显示)
=======
这是你的基本方法。你可以用以下方法调整它:
答案 3 :(得分:-1)
查找值列表模式,然后应用它。这通常是处理这类事情的最佳方式。
答案 4 :(得分:-1)
您可以将displaytag用于paigination或resultset,但是您可以从displattag
下载一些jar文件首先创建一个servlet StudentList.java
public class StudentList extends HttpServlet
{ public void service(HttpServletRequest request,HttpServletResponse response)抛出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 method
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;
}