零碎 关于分页
每篇一语:理想很丰满,现实很骨感!
1.实现分页
====================== 华丽丽的分割线 ======================
1.实现分页
1.1 dao层语句
1 public List<Shopping> pagingTest(int begin,int max) {
2 Session session = this.getSession();
3 Query q = session.createQuery("from Shopping order by activeStarttime desc");
4 if(max > 0) {
5 // 设置从第几条开始查询
6 q.setFirstResult(begin);
7 // 设置查最多几条记录
8 q.setMaxResults(max);
9 }
10 List<Shopping> list = q.list();
11
12 return list;
13 }
1.2 分页原理
没错,把原理放在这里而不是放在1.1。看了上面的代码后,分页其实很简单,对数据库而言,无非是 select * from tb_name limit startRow ,endRow;
而startRow等于上面代码的begin,endRow等于上面代码的begin+max。
简而言之,我们要做的事很简单,因为使用hibernate后,我们需要处理的,只是获得当前为第几页(开头的第一条数据),以及每页要显示多少条,然后把这2个参数传过来便可。
那么,问题的重点在于这两个参数的获得。
1.3 page工具类
1 package com.blank.sys;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 /*
7 * 分页
8 */
9 public class Page {
10 // 总行数 - 要进行分页的总行数
11 private int totalRows;
12
13 // 每页行数 - 要进行分页的数据每页要显示的行数
14 private int pageSize = 8;
15
16 // 当前页码 - 用于记录当前是第几页
17 private int currentPage;
18
19 // 总页数 - 一共有多少页,值为 总行数/每页行数
20 private int totalPages;
21
22 // 开始的行数 - 记录该页面由第几条数据开始
23 private int startRow;
24
25 public Page(int _totalRows) {
26 totalRows = _totalRows;
27 totalPages = totalRows / pageSize;
28 int mod = totalRows % pageSize;
29 if (mod > 0) {
30 totalPages++;
31 }
32 currentPage = 1;
33 startRow = 0;
34 }
35
36 public Page(int _totalRows, int _pageSize) {
37 totalRows = _totalRows;
38 pageSize = _pageSize;
39 totalPages = totalRows / pageSize;
40 int mod = totalRows % pageSize;
41 if (mod > 0) {
42 totalPages++;
43 }
44 currentPage = 1;
45 startRow = 0;
46 }
47
48 public int getStartRow() {
49 return startRow;
50 }
51
52 public int getTotalPages() {
53 return totalPages;
54 }
55
56 public int getCurrentPage() {
57 return currentPage;
58 }
59
60 public int getPageSize() {
61 return pageSize;
62 }
63
64 public void setTotalRows(int totalRows) {
65 this.totalRows = totalRows;
66 }
67
68 public void setStartRow(int startRow) {
69 this.startRow = startRow;
70 }
71
72 public void setTotalPages(int totalPages) {
73 this.totalPages = totalPages;
74 }
75
76 public void setCurrentPage(int currentPage) {
77 this.currentPage = currentPage;
78 }
79
80 public void setPageSize(int pageSize) {
81 this.pageSize = pageSize;
82 }
83
84 public int getTotalRows() {
85 return totalRows;
86 }
87
88 /**
89 * 该方法用于设置第一页
90 */
91 public void first() {
92 currentPage = 1;
93 startRow = 0;
94 }
95
96 /**
97 * 该方法用于设置前一页
98 */
99 public void previous() {
100 if (currentPage == 1) {
101 return;
102 }
103 currentPage--;
104 startRow = (currentPage - 1) * pageSize;
105 if(startRow < 0) {
106 startRow = 0;
107 }
108 }
109
110 /**
111 * 该方法用于设置下一页
112 */
113 public void next() {
114 if (currentPage < totalPages) {
115 currentPage++;
116 }
117 startRow = (currentPage - 1) * pageSize;
118 if(startRow < 0) {
119 startRow = 0;
120 }
121 }
122
123 /**
124 * 该方法用于设置最后一页
125 */
126 public void last() {
127 currentPage = totalPages;
128 startRow = (currentPage - 1) * pageSize;
129 if(startRow < 0) {
130 startRow = 0;
131 }
132 }
133
134 /**
135 * 该方法根据页面参数设置页码
136 * @param _currentPage 要设置的页面编号
137 */
138 public void refresh(int _currentPage) {
139 setCurrentPage(_currentPage);
140 refresh();
141 }
142
143 /**
144 * 该方法根据页面参数设置页码,页码从currentPage中获得
145 */
146 public void refresh() {
147 startRow = (currentPage - 1) * pageSize;
148 if (currentPage > totalPages) {
149 last();
150 }
151 if(currentPage < 1) {
152 first();
153 }
154 }
155
156 /**
157 * 生成一条序列
158 * @return
159 */
160 public List<Integer> getCounter() {
161 int min = (currentPage - 6 > 1) ?
162 (currentPage - 6) : 1;
163 int max = (totalPages <= 9) ? totalPages :
164 (currentPage + 2 <= 9 ? 9 : (currentPage + 2 <= totalPages ? (currentPage + 2) : totalPages));
165 List<Integer> list = new ArrayList<Integer>();
166 for(int i = min; i <= max; i++) {
167 list.add(i);
168 }
169 return list;
170 }
171 }
1.4 action层调用
1 public String findShoppingByType() {
2 int size = shoppingService.findShopByType(type, 0, 0).size();
3 page = new Page(size, 18);
4
5 // currentpage为当前页数,由页面传入,访问首页时无需传入,故判断是否为null
6 page.setCurrentpage(currentpage == null?1:currentpage);
7
8 // action参数为指令,用来区别如“上一页”“第一页”等
9 if("first".equals(action)){
10 // 如果是要反问第一页
11 page.first();
12 }else if("previous".equals(action)){
13 // 如果要访问前一页
14 page.previous();
15 }else if("next".equals(action)){
16 // 如果要访问下一页
17 page.next();
18 }else if("last".equals(action)){
19 // 若果要访问最后一页
20 page.last();
21 }else if("refresh".equals(action)) {
22 // 访问的页码
23 page.refresh();
24 }
25
26 M_list = shoppingService.findShopByType(type, page.getStartRow(), page.getPageSize());
27 return SUCCESS;
28 }