atruts2分页
来源:互联网 发布:大圣归来豆瓣知乎 编辑:程序博客网 时间:2024/06/01 08:27
您还未登录 ! 我的应用 登录 注册 .
.论坛首页 → Java编程和Java企业应用版 → Struts → 也显示一下我的Struts2分页.全部 Hibernate Spring Struts iBATIS 企业应用 设计模式 DAO 领域模型 OO Tomcat SOA JBoss Swing Java综合 myApps快速开发平台,配置即开发、所见即所得,节约85%工作量 ? 上一页 1 2 3 4 下一页 ?浏览 4512 次主题:也显示一下我的Struts2分页精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
zhangjunji111
等级:
文章: 29
积分: 130
来自: 北京
发表时间:2010-01-28 < > 猎头职位: 上海: 30万起年薪诚聘平台高级架构师 相关文章:
■Struts2自定义分页标签,基于tangshuo的源码上改进的
■自己写的一个分页标签
■看到很多人都发布了hibernate dao 我都看了下 也写了一份 很多人都提了建议,将查询抽取出来这个建议不错,我这个就是吸取了大家的建议,还加了分页标签。
推荐圈子: GT-Grid
更多相关推荐 最近看见网上有不少基于Struts2+spring分页的东西,自己感觉都不是很适合,许多都只是对一个列表进行了分页,而没有考虑到查询条件等。个人认为,分页就是从前台把查询条件输入进去然后返回查询结果列表。这个问题的难点就是查询条件的传递,因为第一次查询时候需要输入查询条件,而以后点下一页时候,就不需要再次输入查询条件了。所以,第一次查询时候,需要把查询条件保存到某个地方,再次查询时候,把条件取出来,同时,这些要做的通用,等有许多查询页面时候,能最大限度的重用代码,好了,废话少说,下面展示我的分页代码
首先写一个Pages类,用来保存分页的一些信息,包括当前页码、记录总数、总页数、每页显示的记录数、查询条件等。代码如下:
Java代码
1.public class Pages {
2. private int pageNo = 1; // 当前页码
3.
4. private int totalNum = -1;// 记录总数
5.
6. private int totalPage = -1; // 总页数
7.
8. int perPageNum = 10; // 每页显示记录数
9.
10. private String queryParames;// 查询条件
11.
12. public String getQueryParames() {
13. return queryParames;
14. }
15.
16. public void setQueryParames(String queryParames) {
17. this.queryParames = queryParames;
18. }
19.
20. public Pages() {
21. }
22.
23. public Pages(int pageNo, int totalNum, int perPageNum) {
24. this.pageNo = pageNo;
25. this.totalNum = totalNum;
26. this.perPageNum = perPageNum;
27. this.executeCount();
28. }
29.
30. public void executeCount() {
31. this.totalPage = (int) Math.ceil((this.totalNum + this.perPageNum - 1)
32. / this.perPageNum);
33. if (this.totalPage <= 0) {
34. this.totalPage = 1;
35. }
36. int intPage = this.pageNo;
37. if (intPage > this.totalPage) {
38. this.pageNo = this.totalPage;
39. } else {
40. this.pageNo = intPage;
41. }
42. }
43.
44. public int getPageNo() {
45. return pageNo;
46. }
47.
48. public void setPageNo(int pageNo) {
49. this.pageNo = pageNo;
50. }
51.
52. public int getPerPageNum() {
53. return perPageNum;
54. }
55.
56. public void setPerPageNum(int perPageNum) {
57. this.perPageNum = perPageNum;
58. }
59.
60. public int getTotalNum() {
61. return totalNum;
62. }
63.
64. public void setTotalNum(int totalNum) {
65. this.totalNum = totalNum;
66. }
67.
68. public int getTotalPage() {
69. return totalPage;
70. }
71.
72. public void setTotalPage(int totalPage) {
73. this.totalPage = totalPage;
74. }
75.
76. public Map transQueryCondition() {
77. Map<String, String> map = new HashMap<String, String>();
78. if (StringUtils.isNull(queryParames)) {
79. return map;
80. }
81. String[] condtions = queryParames.split(";");
82. for (int i = 0; i < condtions.length; i++) {
83. if (StringUtils.isNull(condtions[i])) {
84. continue;
85. }
86. map.put(condtions[i].split(",")[0], condtions[i].split(",")[1]);
87. }
88. return map;
89. }
public class Pages {
private int pageNo = 1; // 当前页码
private int totalNum = -1;// 记录总数
private int totalPage = -1; // 总页数
int perPageNum = 10; // 每页显示记录数
private String queryParames;// 查询条件
public String getQueryParames() {
return queryParames;
}
public void setQueryParames(String queryParames) {
this.queryParames = queryParames;
}
public Pages() {
}
public Pages(int pageNo, int totalNum, int perPageNum) {
this.pageNo = pageNo;
this.totalNum = totalNum;
this.perPageNum = perPageNum;
this.executeCount();
}
public void executeCount() {
this.totalPage = (int) Math.ceil((this.totalNum + this.perPageNum - 1)
/ this.perPageNum);
if (this.totalPage <= 0) {
this.totalPage = 1;
}
int intPage = this.pageNo;
if (intPage > this.totalPage) {
this.pageNo = this.totalPage;
} else {
this.pageNo = intPage;
}
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPerPageNum() {
return perPageNum;
}
public void setPerPageNum(int perPageNum) {
this.perPageNum = perPageNum;
}
public int getTotalNum() {
return totalNum;
}
public void setTotalNum(int totalNum) {
this.totalNum = totalNum;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public Map transQueryCondition() {
Map<String, String> map = new HashMap<String, String>();
if (StringUtils.isNull(queryParames)) {
return map;
}
String[] condtions = queryParames.split(";");
for (int i = 0; i < condtions.length; i++) {
if (StringUtils.isNull(condtions[i])) {
continue;
}
map.put(condtions[i].split(",")[0], condtions[i].split(",")[1]);
}
return map;
} 下面写一个通用的Action类,用来初始化查询参数:
Java代码
1.public abstract class ListAction extends ActionSupport {
2. protected static final String LIST = "list";
3.
4. Logger logger = Logger.getLogger(ListAction.class);
5.
6. /*
7. * 当前页
8. */
9. private int pageNo = 1;
10.
11. /*
12. * 总页数
13. */
14. private int totalPage = -1;
15.
16. /*
17. * 总记录数
18. */
19. private int totalNum = -1;
20.
21. /*
22. * 查询参数
23. */
24. private String queryParames;
25.
26. private PageList pageList;
27.
28. public final String execute() {
29. initQuerycondition();
30. Pages pages = new Pages();
31. pages.setPageNo(this.getPageNo());
32. pages.setPerPageNum(10);
33. pages.setTotalNum(totalNum);
34. pages.executeCount();
35. this.setTotalPage(pages.getTotalPage());
36. pages.setQueryParames(queryParames);
37. queryPageList(pages);
38. this.setTotalPage(pages.getTotalPage());
39. this.setTotalNum(pages.getTotalNum());
40. return LIST;
41. }
42.
43. /**
44. * 实现每个查询结果列表,依据查询结果的不同而不同
45. * @param pages
46. */
47. protected abstract void queryPageList(Pages pages);
48.
49. /**
50. * 初始化查询参数的配置
51. */
52. protected void initQuerycondition() {
53. /*
54. *如果不是第一次查询,直接返回,否则设置查询参数,拼装成 queryParames
55. */
56. if (totalNum >= 0) {
57. return;
58. }
59. Map map = ActionContext.getContext().getParameters();
60. Iterator iter = map.keySet().iterator();
61. StringBuffer query = new StringBuffer();
62. while (iter.hasNext()) {
63. String key = (String) iter.next();
64. Object keyValue = ((Object[]) map.get(key))[0];
65. String value = "";
66. if (!StringUtils.isObjNull(keyValue)) {
67. query.append(";").append(key);
68. if (keyValue instanceof Date) {
69. value = DateUtils.trunsDateToString((Date) keyValue);
70. } else {
71. value = String.valueOf(keyValue);
72. }
73. query.append(",").append(value);
74. }
75. }
76. this.setQueryParames(query.toString());
77. }
78.
79.//get.....set...方法
80.}
public abstract class ListAction extends ActionSupport {
protected static final String LIST = "list";
Logger logger = Logger.getLogger(ListAction.class);
/*
* 当前页
*/
private int pageNo = 1;
/*
* 总页数
*/
private int totalPage = -1;
/*
* 总记录数
*/
private int totalNum = -1;
/*
* 查询参数
*/
private String queryParames;
private PageList pageList;
public final String execute() {
initQuerycondition();
Pages pages = new Pages();
pages.setPageNo(this.getPageNo());
pages.setPerPageNum(10);
pages.setTotalNum(totalNum);
pages.executeCount();
this.setTotalPage(pages.getTotalPage());
pages.setQueryParames(queryParames);
queryPageList(pages);
this.setTotalPage(pages.getTotalPage());
this.setTotalNum(pages.getTotalNum());
return LIST;
}
/**
* 实现每个查询结果列表,依据查询结果的不同而不同
* @param pages
*/
protected abstract void queryPageList(Pages pages);
/**
* 初始化查询参数的配置
*/
protected void initQuerycondition() {
/*
*如果不是第一次查询,直接返回,否则设置查询参数,拼装成 queryParames
*/
if (totalNum >= 0) {
return;
}
Map map = ActionContext.getContext().getParameters();
Iterator iter = map.keySet().iterator();
StringBuffer query = new StringBuffer();
while (iter.hasNext()) {
String key = (String) iter.next();
Object keyValue = ((Object[]) map.get(key))[0];
String value = "";
if (!StringUtils.isObjNull(keyValue)) {
query.append(";").append(key);
if (keyValue instanceof Date) {
value = DateUtils.trunsDateToString((Date) keyValue);
} else {
value = String.valueOf(keyValue);
}
query.append(",").append(value);
}
}
this.setQueryParames(query.toString());
}
//get.....set...方法
}再写一个Page类,继承Component,用来获取ValueStack中的参数值。
Java代码
1.public class Page extends Component {
2. private static final Log logger = LogFactory.getLog(Page.class);
3. public Page(ValueStack stack) {
4. super(stack);
5. }
6.
7. private String pageNo; // 当前页码
8.
9. private String totalPage; // 总页数
10.
11. private String totalNum; // 总记录数
12.
13. private String styleClass; // 分页的样式
14.
15. private String theme; // 分页的主题
16.
17. private String url; // action的路径
18.
19. private String urlType; // 路径的类型,主要用于URL重写的扩展
20.
21. private String queryParames;
22.
23. public String getQueryParames() {
24. return queryParames;
25. }
26.
27. public void setQueryParames(String queryParames) {
28. this.queryParames = queryParames;
29. }
30.
31. public boolean start(Writer writer) {
32. boolean result = super.start(writer);
33.
34. Object obj = this.getStack().findValue(pageNo);
35.
36. pageNo = String.valueOf((Integer) obj);
37.
38. obj = this.getStack().findValue(totalPage);
39.
40. totalPage = String.valueOf((Integer) obj);
41.
42. obj = this.getStack().findValue(totalNum);
43. totalNum = String.valueOf((Integer) obj);
44.
45. StringBuilder str = new StringBuilder();
46.
47. Map cont = this.getStack().getContext();
48.
49. StrutsRequestWrapper req = (StrutsRequestWrapper) cont
50. .get(StrutsStatics.HTTP_REQUEST);
51.
52. if (url == null || "".equals(url)) {
53.
54. url = (String) req
55. .getAttribute("javax.servlet.forward.request_uri");
56.
57. }
58. String pageStr = "?totalNum=" + totalNum + "&pageNo=";
59.
60. if ("dir".equals(urlType)) {
61. pageStr = "";
62.
63. if ("1".equals(pageNo)) {// 第一页时
64.
65. if (url.lastIndexOf("/") != url.length() - 1) {
66.
67. if (url.lastIndexOf("1") == url.length() - 1) {// 如果有页码1,则去掉1
68.
69. url = url.substring(0, url.length() - 1);
70.
71. } else if (url.lastIndexOf("/") != url.length() - 1) {// 如果没有页码1,并且最后不是'/'时,加上'/'
72.
73. url = url + "/";
74.
75. }
76.
77. }
78.
79. } else {
80.
81. url = url.substring(0, url.lastIndexOf("/") + 1);
82.
83. }
84.
85. }
86.
87.
88. // 下面这段处理主要是用来处理动态查询的参数,并拼接成url
89. StringBuffer perUrl = new StringBuffer("");
90. obj = this.getStack().findValue(queryParames);
91. if (!StringUtils.isObjNull(obj)) {
92. perUrl.append("&").append("queryParames").append("=").append(
93. StringUtils.decode((String) obj));
94. }
95.
96. //当前页
97. Integer cpageInt = Integer.valueOf(pageNo);
98. str.append("<span> ");
99. // 文本样式
100. if (theme == null || "text".equals(theme)) {
101. // 当前页与总页数相等
102. if (pageNo.equals(totalPage)) {
103. // 如果total = 1,则无需分页,显示“[第1页] [共1页]”
104. if ("1".equals(totalPage)) {
105. str.append("[第 " + pageNo + " 页]");
106.
107. str.append(" [共 " + totalPage + " 页]");
108.
109. } else {
110.
111. // 到达最后一页,显示“[首页] [上一页] [末页]”
112. str.append("<a href='" + url + pageStr + "1" + perUrl
113. + "'>[首 页]</a> ");
114.
115. str.append("<a href='" + url + pageStr + (cpageInt - 1)
116. + perUrl + "'>[上一页]</a>");
117.
118. str.append("[下一页]");
119.
120. str.append(" <a href='" + url + pageStr + totalPage
121. + perUrl + "'>[末 页]</a> ");
122.
123. }
124.
125. } else {
126.
127. // 当前页与总页数不相同
128. if ("1".equals(pageNo)) {
129.
130. // 第一页,显示“[首 页] [下一页] [末页]”
131.
132. str.append("<a href='" + url + pageStr + "1" + perUrl
133. + "'>[首 页]</a>");
134. str.append("[上一页]");
135. str.append("<a href='" + url + pageStr + (cpageInt + 1)
136. + perUrl + "'>[下一页]</a>");
137. str.append("<a href='" + url + pageStr + totalPage + perUrl
138. + "'>[末 页]</a>");
139.
140. } else {
141.
142. // 不是第一页,显示“[首页] [上一页] [下一页] [末页]”
143.
144. str.append("<a href='" + url + pageStr + "1" + perUrl
145. + "'>[首 页]</a>");
146.
147. str.append("<a href='" + url + pageStr + (cpageInt - 1)
148. + perUrl + "'>[上一页]</a>");
149.
150. str.append("<a href='" + url + pageStr + (cpageInt + 1)
151. + perUrl + "'>[下一页]</a>");
152.
153. str.append("<a href='" + url + pageStr + totalPage + perUrl
154. + "'>[末 页]</a>");
155.
156. }
157.
158. }
159.
160. } else if ("number".equals(theme)) { // 数字样式 [1 2 3 4 5 6 7 8 9 10 > // >>]
161. Integer totalInt = Integer.valueOf(totalPage);
162. // 如果只有一页,则无需分页
163. str.append("[ ");
164. if (totalInt == 1) {
165. str.append("<strong>1</strong> ");
166. } else {
167. //当前页
168. if (cpageInt > 1) {
169. // 当前不是第一组,要显示“<< <”
170. // <<:返回前一组第一页
171. // <:返回前一页
172. str.append("<a href='" + url + pageStr + "1" + perUrl
173. + "'> << </a> ");
174. str.append("<a href='" + url + pageStr + (cpageInt - 1)
175. + perUrl);
176. str.append("'><</a> ");
177. } else {
178. str.append("<< < ");
179. }
180. int v = (cpageInt - 4) > 0 ? (cpageInt - 4) : 1;
181. int v1 = (cpageInt + 4) < totalInt ? (cpageInt + 4) : totalInt;
182. if (v1 == totalInt) {
183. v = totalInt - 10;
184. v = (v <= 0 ? 1 : v); // 如果为负数,则修改为1
185.
186. } else if (v == 1 && v1 < totalInt) {
187. v1 = totalInt > 10 ? 10 : totalInt;
188. }
189. // 10个为一组显示
190. for (int i = v; i <= v1; i++) {
191. if (cpageInt == i) { // 当前页要加粗显示
192. str.append("<strong>" + i + "</strong> ");
193. } else {
194. str.append("<a href='" + url + pageStr + i + perUrl
195. + "'>" + i + "</a> ");
196. }
197. }
198. // 如果多于1组并且不是最后一组,显示“> >>”
199.
200. if (cpageInt < totalInt) {
201.
202. // >>:返回下一组最后一页
203.
204. // >:返回下一页
205.
206. str.append("<a href='" + url + pageStr + (cpageInt + 1)
207. + perUrl);
208.
209. str.append("'>></a> ");
210.
211. str.append("<a href='" + url + pageStr + totalInt + perUrl);
212.
213. str.append("'> >> </a> ");
214.
215. } else {
216.
217. str.append("> >> ");
218.
219. }
220.
221. }
222. str.append("]");
223. }
224. str.append("</span>");
225.
226. try {
227. writer.write(str.toString());
228. } catch (IOException e) {
229. logger.error(e);
230. }
231. return result;
232. }
233.//get set 方法区
234.}
public class Page extends Component {
private static final Log logger = LogFactory.getLog(Page.class);
public Page(ValueStack stack) {
super(stack);
}
private String pageNo; // 当前页码
private String totalPage; // 总页数
private String totalNum; // 总记录数
private String styleClass; // 分页的样式
private String theme; // 分页的主题
private String url; // action的路径
private String urlType; // 路径的类型,主要用于URL重写的扩展
private String queryParames;
public String getQueryParames() {
return queryParames;
}
public void setQueryParames(String queryParames) {
this.queryParames = queryParames;
}
public boolean start(Writer writer) {
boolean result = super.start(writer);
Object obj = this.getStack().findValue(pageNo);
pageNo = String.valueOf((Integer) obj);
obj = this.getStack().findValue(totalPage);
totalPage = String.valueOf((Integer) obj);
obj = this.getStack().findValue(totalNum);
totalNum = String.valueOf((Integer) obj);
StringBuilder str = new StringBuilder();
Map cont = this.getStack().getContext();
StrutsRequestWrapper req = (StrutsRequestWrapper) cont
.get(StrutsStatics.HTTP_REQUEST);
if (url == null || "".equals(url)) {
url = (String) req
.getAttribute("javax.servlet.forward.request_uri");
}
String pageStr = "?totalNum=" + totalNum + "&pageNo=";
if ("dir".equals(urlType)) {
pageStr = "";
if ("1".equals(pageNo)) {// 第一页时
if (url.lastIndexOf("/") != url.length() - 1) {
if (url.lastIndexOf("1") == url.length() - 1) {// 如果有页码1,则去掉1
url = url.substring(0, url.length() - 1);
} else if (url.lastIndexOf("/") != url.length() - 1) {// 如果没有页码1,并且最后不是'/'时,加上'/'
url = url + "/";
}
}
} else {
url = url.substring(0, url.lastIndexOf("/") + 1);
}
}
// 下面这段处理主要是用来处理动态查询的参数,并拼接成url
StringBuffer perUrl = new StringBuffer("");
obj = this.getStack().findValue(queryParames);
if (!StringUtils.isObjNull(obj)) {
perUrl.append("&").append("queryParames").append("=").append(
StringUtils.decode((String) obj));
}
//当前页
Integer cpageInt = Integer.valueOf(pageNo);
str.append("<span> ");
// 文本样式
if (theme == null || "text".equals(theme)) {
// 当前页与总页数相等
if (pageNo.equals(totalPage)) {
// 如果total = 1,则无需分页,显示“[第1页] [共1页]”
if ("1".equals(totalPage)) {
str.append("[第 " + pageNo + " 页]");
str.append(" [共 " + totalPage + " 页]");
} else {
// 到达最后一页,显示“[首页] [上一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a> ");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl + "'>[上一页]</a>");
str.append("[下一页]");
str.append(" <a href='" + url + pageStr + totalPage
+ perUrl + "'>[末 页]</a> ");
}
} else {
// 当前页与总页数不相同
if ("1".equals(pageNo)) {
// 第一页,显示“[首 页] [下一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a>");
str.append("[上一页]");
str.append("<a href='" + url + pageStr + (cpageInt + 1)
+ perUrl + "'>[下一页]</a>");
str.append("<a href='" + url + pageStr + totalPage + perUrl
+ "'>[末 页]</a>");
} else {
// 不是第一页,显示“[首页] [上一页] [下一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a>");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl + "'>[上一页]</a>");
str.append("<a href='" + url + pageStr + (cpageInt + 1)
+ perUrl + "'>[下一页]</a>");
str.append("<a href='" + url + pageStr + totalPage + perUrl
+ "'>[末 页]</a>");
}
}
} else if ("number".equals(theme)) { // 数字样式 [1 2 3 4 5 6 7 8 9 10 > // >>]
Integer totalInt = Integer.valueOf(totalPage);
// 如果只有一页,则无需分页
str.append("[ ");
if (totalInt == 1) {
str.append("<strong>1</strong> ");
} else {
//当前页
if (cpageInt > 1) {
// 当前不是第一组,要显示“<< <”
// <<:返回前一组第一页
// <:返回前一页
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'> << </a> ");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl);
str.append("'><</a> ");
} else {
str.append("<< < ");
}
int v = (cpageInt - 4) > 0 ? (cpageInt - 4) : 1;
int v1 = (cpageInt + 4) < totalInt ? (cpageInt + 4) : totalInt;
if (v1 == totalInt) {
v = totalInt - 10;
v = (v <= 0 ? 1 : v); // 如果为负数,则修改为1
} else if (v == 1 && v1 < totalInt) {
v1 = totalInt > 10 ? 10 : totalInt;
}
// 10个为一组显示
for (int i = v; i <= v1; i++) {
if (cpageInt == i) { // 当前页要加粗显示
str.append("<strong>" + i + "</strong> ");
} else {
str.append("<a href='" + url + pageStr + i + perUrl
+ "'>" + i + "</a> ");
}
}
// 如果多于1组并且不是�