Java中要分页可以用以下技术实现:
a,拼写sql语句来实现。
b,控制res(结果集)。
c,放进list集合中根据设置遍历次数来达到分页的目的。
d,使用Hibernate来分页。
但是前面的b和c方法很占资源,故不推荐使用。下面来说说其他两种:
一:JDBC使用SQL语句分页
使用SQL语句来实现分页,必须top子句来查询。根据sql语句返回该页的结果。
top子句为:
-------------------------------------------------------------
select top AA * from test
where testid
not in
(
select top BB testid from test orderby testid
)
order by testid
-------------------------------------------------------------
其中AA位置为每页你要显示的条数,而BB部分为当前页码-1乘以每页要显示的条数,也就是AA位置上的数字。(nowPage-1*pageSize)。当点击下一页的时候通过url传递当前第几页信息,动态的拼写sql语句就能得到不同的结果集,从而达到分页的目的。
二:使用Hibernate进行分页
使用Hibernate分页基本原理同上。只是hibernate帮程序员进行了封装,只需要传递和设置参数即可。
细分分为6步:
1,拼写HQL语句
2,得到Session对象
3,得到Query对象
4,设置Query对象的setFirstResult(int count)值
5,设置Query对象的setMaxResults(int count)值
6,执行Query的list方法返回分页的结果集;
在第5步和第6步中需要int型数值参数。不说了,看代码:
public List select(int nowPage, int pageSize)
{
Session session = null;
try
{
String hql ="from Test";
session =getHibernateTemplate().getSessionFactory().openSession();
Query query =session.createQuery(hql);
query.setFirstResult((nowPage- 1) * pageSize);
query.setMaxResults(pageSize);
return query.list();
}
finally
{
/-/以下代码为避免hibernate占用内存资源过多而做的处理
session.close();
session.clear();
session =null;
getHibernateTemplate().clear();
getHibernateTemplate().flush();
System.out.println("模版清空过了!");
}
}
另外,在分页的时候还需要总页数。看代码吧:
1---sql语句为select count(*) from test
2---hibernate
public int getPageCount()
{
---- 一共多少页 默认0页
String hql = "select count(t)from Test t";
---- 得到了一共多少条记录
Object o =getHibernateTemplate().getSessionFactory().openSession()
.createQuery(hql).uniqueResult();
---- 得到了一共多少行
int rowCount =Integer.parseInt(o.toString());
---- 每页三条数据
pageCount = rowCount / 3;
if (rowCount % 3 != 0) {
pageCount++;
}
return pageCount;
}
上面仅仅是讲理论,下面是做的一个示例。
最近再做一个简易BBS,其中要用到分页技术,以前做过一个小型网上书店系统,记得当时是用弄了一个接口:PagingInterface,其中有得到总记录数、得到总页数、和一些根据当前页到结束页的查询方法。 然后再一个UserDAO类、BookDAO类中继承Paging方法,实现相应的“一些根据当前页到结束页的查询方法”等,然后再一个PagingServlet类中调用这些方法。。。。具体的类代码这里也不贴了,这种方法复用性不高,结构性差,不推荐使用。这次做这个BBS,经过几次的调试,终于弄成功了。下面是分页的主类:
[html] view plain copy
1. /**
2. * 分页对象,进行一系列分页操作
3. *
4. * @author weiyiorng
[html] view plain copy
1. * @version 1.0 12/03/20
2. * */
3. public class SplitPage {
4. // 声明一些常量
5. FIRSTPAGE = "first";// 请求的是首页
6. PREVIOUSPAGE = "previous";// 请求上一页
7. NEXTPAGE = "next";// 请求下一页
8. LASTPAGE = "last";// 请求最后一页
9.
10. // 声明一些变量
11. pageRow = 3;// 每页显示记录数
12. totalRow = 0;// 总的记录数,有数据库操作类DAO提供
13. currentPage = 1;// 当前的页面
14. firstPage = 1;// 首页位置
15. totalPage = 1;// 总的页面数,默认为一页
16.
17. public int getPageRow() {
18. return pageRow;
19. }
20.
21. /**
22. * 重新设置每页显示的记录数
23. *
24. * @param pageRow
25. * 新的每页显示记录数
26. */
27. public void setPageRow(int pageRow) {
28. pageRow
29. try {
30. throw new Exception();// 如果pageRow被设置为零,应当抛出异常.
31. } catch (Exception e) {
32. // TODO Auto-generated catch block
33. e.printStackTrace();
34. }
35. }
36.
37. this.pageRow = pageRow;// 修改每页的记录数
38. this.totalPage = this.totalRow / this.pageRow
39. this.pageRow
40. }
41.
42. public int getTotalRow() {
43. return totalRow;
44. }
45.
46. public void setTotalRow(int totalRow) {// 设置分页对象的总记录属性后,就应该根据每页面显示记录数,计算得到总的页面数
47. this.totalRow = totalRow;
48. this.totalPage = this.totalRow/this.pageRow+((this.totalRow%this.pageRow==0)?0:1);
49. System.out.println("当前页"+this.currentPage);
50.
51. }
52.
53. public int getCurrentPage() {
54. return currentPage;
55. }
56.
57. public void setCurrentPage(int currentPage) {
58. this.currentPage = currentPage;
59. }
60.
61. public int getFirstPage() {
62. return firstPage;
63. }
64.
65. public void setFirstPage(int firstPage) {
66. this.firstPage = firstPage;
67. }
68.
69. public int getTotalPage() {
70. return totalPage;
71. }
72. //不应该提供方法设置总页面数,它是计算得到的
73.
74. /**
75. * 根据请求的标示符参数重新计算要现实的页面
76. *
77. * @param flag
78. * 请求转向的页面标示符
79. * @return int 返回新页
80. */
81. public int toNewPage(String flag) {
82. newPage = this.currentPage;
83. if (flag != null && !"".equals(flag)) {
84. if (SplitPage.FIRSTPAGE.equals(flag)) {
85. newPage = 1;
86. } else if (SplitPage.LASTPAGE.equals(flag)) {
87. newPage = this.totalPage;
88. } else if (SplitPage.NEXTPAGE.equals(flag)) {
89. newPage = this.currentPage
90. this.currentPage
91. } else if (SplitPage.PREVIOUSPAGE.equals(flag)) {
92. newPage = this.currentPage
93. this.currentPage
94. } else {
95. // 传入的是个数字字符串参数
96. newPage = Integer.parseInt(flag.trim());
97. }
98. } else {// 请求的参数为空,则当前页码不变
99. newPage = this.currentPage;
100. }
101. this.setCurrentPage(newPage);// 记得重新设置当期页面
102. return newPage;
103. }
104. }
为什么说这个类重要呢?因为你在想要分页的时候,所有的分页参数都可以在这里面设置,动态静态的都可以实现,复用性很高!
下面声明一个分页接口,设置具体的分页对象(比如你要分页的是用户列表还是帖子列表)等:
[java] view plain copy
1. public interface
2. /**
3. * 查询所有的记录,调用分页生成器类中的分页方法查询数据
4. *
5. * @param splitPage
6. * 分页对象
7. * @return List<Object>
8. * */
9. public List<UserInfoVo> findUserAll(SplitPage splitPage);//查询用户列表
10. /**
11. * 查询所有的记录,调用分页生成器类中的分页方法查询数据
12. *
13. @param
[java] view plain copy
1. * 分页对象
2. @return
3. * */
4. public List<ForumInfoVo> findForumAll(SplitPage splitPage);//查询帖子
5. /**
6. * 提供总的记录数
7. * */
8.
9. public int
10. /**
11. * 查询所有的记录,调用分页生成器类中的分页方法查询数据
12. *
13. * @param splitPage
14. * 分页对象
15. * @return List<Object>
16. * */
17. public
18. }
然后在各个DAO类(用户DAO、帖子DAO、RefoumDAO等)中实现此接口相应方法,注意在各个DAO类中应该有一个totalRow总记录数的获取和设置方法,得到指定记录数方法,简单起见,我这里是直接得到所有记录getAllRecord()(可以再分页显示时调用以设置分页类别,如查询某一个昵称的所有用户等)。
接下咱废话少说,直接上显示分页效果的代码:
forumList.jsp
[java] view plain copy
1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
2. <%@taglib prefix="c" uri="http://java.sun.com/jsf/core"%>
3. <%@page import="com.weiyi.bbs.dao.ForumInfoDAO"%>
4. <%@page import="com.weiyi.bbs.util.*"%>
5. <%@page import="com.weiyi.bbs.domain.*"%>
6. <%
7. String path = request.getContextPath();
8. "://"
9. ":"
10. "/";
11. %>
12. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
13. <html>
14. <head>
15. "<%=basePath%>">
16.
17. <title>帖子列表</title>
18.
19. "pragma" content="no-cache">
20. "cache-control" content="no-cache">
21. "expires" content="0">
22. "keywords" content="keyword1,keyword2,keyword3">
23. "description" content="This is my page">
24. "text/javascript" src="js/common.js" charset="utf-8"></script>
25. "text/javascript" charset="utf-8">
26. function goPage(){
27. "selectPage").value;
28. "userId").value;
29. "forumList.jsp?flag="+v+"&userId="+u;
30. }
31. </script>
32. </head>
33. <!--spage分页对象,保存分页的详细信息 ,存在Session中,每次查询或者是分页数据时只要设置此对象的当前页 -->
34. <!-- dao帖子操作类,主要用来获取总记录数-->
35. "spage" class="com.weiyi.bbs.util.SplitPage"
36. "session"></jsp:useBean>
37. "dao" class="com.weiyi.bbs.dao.ForumInfoDAO"
38. "session"></jsp:useBean>
39. <%
40. "flag");
41. int
42. dao.setTotalRows(dao.getAllRecord());
43. int
44. spage.setTotalRow(totalRows);
45. %>
46. <body>
47. "wrap">
48. <h3>
49. 查看帖子列表
50. </h3>
51. "hidden" name="userId" id="userId" value="<%=request.getParameter("userId")%>"/>
52. "destroyservlet">退出</a>
53. <a
54. "forumcontroller?type=toNewForum&userId=<%=request.getParameter("userId")%>&power=user">发新帖</a>
55. "border">
56. <thead>
57. <tr>
58. <th>
59. ID
60. </th>
61. <th>
62. 标题
63. </th>
64. <th>
65. 发帖人
66. </th>
67. <th>
68. 发帖时间
69. </th>
70. <th>
71. 操作
72. </th>
73. </tr>
74. </thead>
75. <tbody>
76. <%
77. List<ForumInfoVo> list = dao.findForumAll(spage);
78. for
79. %>
80. <tr>
81. <td><%=forum.getId()%></td>
82. <td><%=forum.getTitle()%></td>
83. <td><%=forum.getAuthorName()%></td>
84. <td><%=forum.getCreateTime()%></td>
85. <td>
86. <a
87. "forumcontroller?type=look&power=user&userId=<%=request.getParameter("userId")%>&id=<%=forum.getId()%>">查看</a>
88. </td>
89. </tr>
90. <%
91. }
92. %>
93. </tbody>
94. </table>
95. "foot">
96. "forumList.jsp?flag=<%=SplitPage.FIRSTPAGE%>&userId=<%=request.getParameter("userId")%>">首页</a>
97. "forumList.jsp?flag=<%=SplitPage.PREVIOUSPAGE%>&userId=<%=request.getParameter("userId")%>">上一页</a>
98. "forumList.jsp?flag=<%=SplitPage.NEXTPAGE%>&userId=<%=request.getParameter("userId")%>">下一页</a>
99. "forumList.jsp?flag=<%=SplitPage.LASTPAGE%>&userId=<%=request.getParameter("userId")%>">末页</a>
100. "selectPage" name="selectPage" οnchange="goPage();">
101. <%
102. for (int i = 1; i <= spage.getTotalPage(); ++i) {
103. %>
104. "<%=i%>"
105. "selected='selected'"
106. ""%> ><%=i%></option>
107. <%
108. }
109. %>
110.
111. </select>
112. <label><%=spage.getCurrentPage()%>/<%=spage.getTotalPage()%>页
113. </label>
114. </div>
115. </div>
116. </body>
117. </html>
运行效果:
有什么地方有不足之处,往各位同行多多指教哈!