直接正题
一、INewsDao.java(DAO接口):
1 package cn.dy.dao;
2
3 import java.util.List;
4 import cn.dy.bean.News;
5
6 public interface INewsDao {
7
8 //其他代码省略
9
10
11 //分页查询
12 public List<News> queryForPage(String hql,int offset,int length);
13
14 //总记录条数
15 public int getCount(String hql);
16 }
17 二、dao实现类,因为第13行中q.list().get(0)的返回值为long,所以转换一下。
1 @SuppressWarnings("unchecked")
2 @Override
3 public List<News> queryForPage(String hql,int offset, int length) {
4 Query q = factory.getCurrentSession().createQuery(hql);
5 q.setFirstResult(offset);
6 q.setMaxResults(length);
7 return q.list();
8 }
9
10 @Override
11 public int getCount(String hql) {
12 Query q = factory.getCurrentSession().createQuery(hql);
13 return Integer.parseInt(q.list().get(0).toString());
14 }
三、INewsService.java业务接口,添加方法
public PageBean queryForPage(int pageSize, int currentPage);
四、业务实现类代码,注意修改参数
1 @Override
2 public PageBean queryForPage(int pageSize, int page) {
3 String hql = "select count(*) from News";
4 int count = newsDao.getCount(hql); // 总记录数
5 int totalPage = PageBean.countTotalPage(pageSize, count); // 总页数
6 int offset = PageBean.countOffset(pageSize, page); // 当前页开始记录
7 int length = pageSize; // 每页记录数
8 int currentPage = PageBean.countCurrentPage(page);
9 List<News> list = newsDao.queryForPage("from News", offset, length); // 该分页的记录
10 // 把分页信息保存到Bean中
11 PageBean pageBean = new PageBean();
12 pageBean.setPageSize(pageSize);
13 pageBean.setCurrentPage(currentPage);
14 pageBean.setAllRow(count);
15 pageBean.setTotalPage(totalPage);
16 pageBean.setList(list);
17 pageBean.init();
18 return pageBean;
19 }
五、action代码:
private int page;
private PageBean pageBean;
以及上面两个的get()、set()方法。
public String getPageList() {
this.pageBean = newsService.queryForPage(6, page);
return "newsList";
}
这个6,是每页6个数据,可以通过页面动态传值。
六、页面代码
1、显示代码:
1 <s:iterator value="pageBean.list">
2 <tr>
3 <td class="tocenter">
4 <s:property value="newsId" />
5 </td>
6 <td colspan="5">
7 <s:property value="newsContent" />
8 </td>
9 <td class="tocenter">
10 <s:property value="beginTime" />
11 </td>
12 </tr>
13 </s:iterator>
2、分页:
1 <tr>
2 <td width="13%" class="tocenter">
3 共
4 <s:property value="pageBean.totalPage" />
5 页
6 </td>
7 <td width="17%" class="tocenter">
8 共
9 <s:property value="pageBean.allRow" />
10 条记录
11 </td>
12 <td width="15%" class="tocenter">
13 当前第
14 <s:property value="pageBean.currentPage" />
15 页
16 </td>
17 <td colspan="4" width="55%" class="tocenter">
18 <s:if test="%{pageBean.currentPage == 1}">第一页 上一页 </s:if>
19 <s:else>
20 <a href="/DyEnigma/news/op_getPageList.do?page=1">第一页 </a>
21 <a href="/DyEnigma/news/op_getPageList.do?page=<s:property value="%{pageBean.currentPage-1}"/>">上一页 </a>
22 </s:else>
23 <s:if test="%{pageBean.currentPage != pageBean.totalPage}">
24 <a href="/DyEnigma/news/op_getPageList.do?page=<s:property value="%{pageBean.currentPage+1}"/>">下一页 </a>
25 <a href="/DyEnigma/news/op_getPageList.do?page=<s:property value="pageBean.totalPage"/>">最后一页</a>
26 </s:if>
27 <s:else>下一页 最后一页</s:else>
28 </td>
29 </tr>
七、PageBean文件
1package cn.dy.own;
2
3import java.util.List;
4
5@SuppressWarnings("unchecked")
6public class PageBean {
7
8 private List list;// 要返回的某一页的记录列表
9
10 private int allRow; // 总记录数
11 private int totalPage; // 总页数
12 private int currentPage; // 当前页
13 private int pageSize;// 每页记录数
14
15 @SuppressWarnings("unused")
16 private boolean isFirstPage; // 是否为第一页
17 @SuppressWarnings("unused")
18 private boolean isLastPage;// 是否为最后一页
19 @SuppressWarnings("unused")
20 private boolean hasPreviousPage; // 是否有前一页
21 @SuppressWarnings("unused")
22 private boolean hasNextPage;// 是否有下一页
23
24 public List getList() {
25 return list;
26 }
27
28 public void setList(List list) {
29 this.list = list;
30 }
31
32 public int getAllRow() {
33 return allRow;
34 }
35
36 public void setAllRow(int allRow) {
37 this.allRow = allRow;
38 }
39
40 public int getTotalPage() {
41 return totalPage;
42 }
43
44 public void setTotalPage(int totalPage) {
45 this.totalPage = totalPage;
46 }
47
48 public int getCurrentPage() {
49 return currentPage;
50 }
51
52 public void setCurrentPage(int currentPage) {
53 this.currentPage = currentPage;
54 }
55
56 public int getPageSize() {
57 return pageSize;
58 }
59
60 public void setPageSize(int pageSize) {
61 this.pageSize = pageSize;
62 }
63
64 /** *//**
65 * 初始化分页信息
66 */
67 public void init() {
68 this.isFirstPage = isFirstPage();
69 this.isLastPage = isLastPage();
70 this.hasPreviousPage = isHasPreviousPage();
71 this.hasNextPage = isHasNextPage();
72 }
73
74 /** *//**
75 * 以下判断页的信息,只需getter方法(is方法)即可
76 *
77 * @return
78 */
79 public boolean isFirstPage() {
80 return currentPage == 1; // 如是当前页是第1页
81 }
82
83 public boolean isLastPage() {
84 return currentPage == totalPage; // 如果当前页是最后一页
85 }
86
87 public boolean isHasPreviousPage() {
88 return currentPage != 1;// 只要当前页不是第1页
89 }
90
91 public boolean isHasNextPage() {
92 return currentPage != totalPage; // 只要当前页不是最后1页
93 }
94
95 /** *//**
96 * 计算总页数,静态方法,供外部直接通过类名调用
97 *
98 * @param pageSize每页记录数
99 * @param allRow总记录数
100 * @return 总页数
101 */
102 public static int countTotalPage(final int pageSize, final int allRow) {
103 int totalPage = allRow % pageSize == 0 ? allRow / pageSize : allRow / pageSize + 1;
104 return totalPage;
105 }
106
107 /** *//**
108 * 计算当前页开始记录
109 *
110 * @param pageSize每页记录数
111 * @param currentPage当前第几页
112 * @return 当前页开始记录号
113 */
114 public static int countOffset(final int pageSize, final int currentPage) {
115 final int offset = pageSize * (currentPage - 1);
116 return offset;
117 }
118
119 /** *//**
120 * 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替
121 *
122 * @paramPage 传入的参数(可能为空,即0,则返回1)
123 * @return 当前页
124 */
125 public static int countCurrentPage(int page) {
126 final int curPage = (page == 0 ? 1 : page);
127 return curPage;
128 }
129} OK,完工。