- 浏览: 10222 次
- 性别:
- 来自: 北京
Struts2中实现自定义分页标签
Struts2中实现自定义标签很简单,主要分为3步:
1.创建taglib文件(.tld),编写标签声明。
2.编写自定义标签类。
3.在页面中使用标签。
下面以一个自定义的分页标签为例,进行说明。
其实,开发自定义标签并不需要Struts2的支持,一般情况下,只需要继承javax.servlet.jsp.tagext.BodyTagSupport类,重写doStartTag,doEndTag等方法即可。这里在实现自定义标签时,继承的2个类分别是org.apache.struts2.views.jsp.ComponentTagSupport和org.apache.struts2.components.Component,ComponentTagSupport实际上是对BodyTagSupport的一次封装,看一下ComponentTagSupport类的继承关系就明了了:
Java代码
1. java.lang.Object
2. extended by javax.servlet.jsp.tagext.TagSupport
3. extended by javax.servlet.jsp.tagext.BodyTagSupport
4. extended by org.apache.struts2.views.jsp.StrutsBodyTagSupport
5. extended by org.apache.struts2.views.jsp.ComponentTagSupport
继承ComponentTagSupport类是为了获得标签中的属性值,并包装成Component对象。继承Component类是为了从Struts2中的ValueStack中获得相对应的值。
1.声明自定义标签。
首先,需要创建一个tld文件,这是一个标准的XML文件,这个文件中就包含有对自定义标签的声明,声明指出了标签的名字,实现标签的类,标签的属性等信息。当在页面中使用该标签时,web服务器就会从这个文件中找出相对应的标签类,并实例化后执行。这个文件其实与struts.xml文件的作用相类似。
tangs.tld
Xml代码
1. <?xml version="1.0" encoding="UTF-8"?>
2. <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
1.
2. <taglib>
3. <tlib-version>2.2.3</tlib-version>
4. <jsp-version>1.2</jsp-version>
5. <short-name>tangs</short-name>
6. <uri>/tangs</uri>
7. <display-name>"Tangs Tags"</display-name>
8.
9. <tag>
10. <name>pages</name>
11. <tag-class>com.tangs.tag.PageTag</tag-class> //标签类
12. <body-content>empty</body-content>
13. <attribute> //标签中的属性
14. <name>cpage</name> //属性名
15. <required>true</required> //是否必须
16. <rtexprvalue>true</rtexprvalue> //表示该自定义标签的某属性的值可以直接指定或者通过动态计算指定
17. </attribute>
18. <attribute>
19. <name>total</name>
20. <required>true</required>
21. <rtexprvalue>true</rtexprvalue>
22. </attribute>
23. <attribute>
24. <name>url</name>
25. <required>true</required>
26. <rtexprvalue>true</rtexprvalue>
27. </attribute>
28. </tag>
29. </taglib>
2.编写标签类
PageTag.java
Java代码
1. package com.tangs.tag;
2.
3. import com.opensymphony.xwork2.util.ValueStack;
4. import javax.servlet.http.HttpServletRequest;
5. import javax.servlet.http.HttpServletResponse;
6. import org.apache.struts2.components.Component;
7. import org.apache.struts2.views.jsp.ComponentTagSupport;
8.
9.
13. public class PageTag extends ComponentTagSupport {
14. private String cpage; //当前页
15. private String total; //总页数
16. private String url; //请求地址
17.
18. public void setCpage(String cpage) {
19. this.cpage = cpage;
20. }
21.
22. public void setTotal(String total) {
23. this.total = total;
24. }
25.
26. public void setUrl(String url) {
27. this.url = url;
28. }
29.
30. @Override
31. public Component getBean(ValueStack arg0, HttpServletRequest arg1, HttpServletResponse arg2) {
32. return new Pages(arg0); //返回Pages Component,分页的逻辑处理都在这个Component中
33. }
34.
35. //获得参数
36. protected void populateParams() {
37. super.populateParams();
38.
39. Pages pages = (Pages)component;
40. pages.setCpage(cpage);
41. pages.setTotal(total);
42. pages.setUrl(url);
43. }
44. }
Pages.java
Java代码
1. package com.tangs.tag;
2.
3. import com.opensymphony.xwork2.util.ValueStack;
4. import java.io.IOException;
5. import java.io.Writer;
6. import java.util.logging.Level;
7. import java.util.logging.Logger;
8. import org.apache.struts2.components.Component;
9.
10.
14. public class Pages extends Component {
15. private String cpage;
16. private String total;
17. private String url;
18.
19. public String getCpage() {
20. return cpage;
21. }
22.
23. public void setCpage(String cpage) {
24. this.cpage = cpage;
25. }
26.
27. public String getTotal() {
28. return total;
29. }
30.
31. public void setTotal(String total) {
32. this.total = total;
33. }
34.
35. public String getUrl() {
36. return url;
37. }
38.
39. public void setUrl(String url) {
40. this.url = url;
41. }
42.
43.
44. public Pages(ValueStack arg0) {
45. super(arg0);
46. }
47.
48. @Override
49. public boolean start(Writer writer) {
50. boolean result = super.start(writer);
51. try {
52. StringBuilder str = new StringBuilder();
53. boolean isValid = true;
54.
55. //从ValueStack中取出数值
56. if (isValid) {
57. if (total.startsWith("%{") && total.endsWith("}")) {
58. total = total.substring(2, total.length() -1);
59. total = (String)this.getStack().findValue(total);
60. isValid = total == null ? false : true;
61. } else {
62. isValid = false;
63. }
64. }
65. if (isValid) {
66. if (cpage.startsWith("%{") && cpage.endsWith("}")) {
67. cpage = cpage.substring(2, cpage.length() - 1);
68. cpage = (String)this.getStack().findValue(cpage);
69. isValid = cpage == null ? false : true;
70. } else {
71. isValid = false;
72. }
73. }
74. if (isValid) {
75. if (url.startsWith("%{") && url.endsWith("}")) {
76. url = url.substring(2, url.length() - 1);
77. url = (String)this.getStack().findValue(url);
78. isValid = url == null ? false : true;
79. } else {
80. isValid = false;
81. }
82. }
83.
84. if (isValid) {
85. Integer cpageInt = Integer.valueOf(cpage);
86. //当前页与总页数相等
87. if (cpage.equals(total)) {
88. //如果total = 1,则无需分页,显示“[第1页] [共1页]”
89. if ("1".equals(total)) {
90. str.append("[第 " + cpage + " 页]");
91. str.append(" [共 " + total + " 页]");
92. } else {
93. //到达最后一页,显示“[首页] [上一页] [末页]”
94. str.append("<a href='");
95. str.append(url);
96. str.append("?cpage=1&total="+total+"&url="+url);
97. str.append("'>[首页]</a> <a href='");
98. str.append(url);
99. str.append("?cpage=" + (cpageInt - 1) + "&total=" + total+"&url="+url);
100. str.append("'>[上一页]</a> <a href='");
101. str.append(url);
102. str.append("?cpage=" + total + "&total=" + total+"&url="+url);
103. str.append("'>[末页]</a>");
104. }
105. } else {
106. //当前页与总页数不相同
107. if ("1".equals(cpage)) {
108. //第一页,显示“[首页] [下一页] [末页]”
109. str.append("<a href='");
110. str.append(url);
111. str.append("?cpage=1&total="+total+"&url="+url);
112. str.append("'>[首页]</a> <a href='");
113. str.append(url);
114. str.append("?cpage=" + (cpageInt + 1) + "&total=" + total+"&url="+url);
115. str.append("'>[下一页]</a> <a href='");
116. str.append(url);
117. str.append("?cpage=" + total + "&total=" + total+"&url="+url);
118. str.append("'>[末页]</a>");
119. } else {
120. //不是第一页,显示“[首页] [上一页] [下一页] [末页]”
121. str.append("<a href='");
122. str.append(url);
123. str.append("?cpage=1&total="+total+"&url="+url);
124. str.append("'>[首页]</a> <a href='");
125. str.append(url);
126. str.append("?cpage=" + (cpageInt - 1) + "&total=" + total+"&url="+url);
127. str.append("'>[上一页]</a> <a href='");
128. str.append(url);
129. str.append("?cpage=" + (cpageInt + 1) + "&total=" + total+"&url="+url);
130. str.append("'>[下一页]</a> <a href='");
131. str.append(url);
132. str.append("?cpage=" + total + "&total=" + total+"&url="+url);
133. str.append("'>[末页]</a>");
134. }
135. }
136. }
137.
138. writer.write(str.toString());
139.
140. } catch (IOException ex) {
141. Logger.getLogger(Pages.class.getName()).log(Level.SEVERE, null, ex);
142. }
143. return result;
144. }
145. }
3.服务端
服务端主要是获得请求然后转向显示的页面
DisplayAction.java
Java代码
1.
5.
6. package com.tangs.action;
7.
8. import com.opensymphony.xwork2.ActionSupport;
9.
10.
14. public class DisplayAction extends ActionSupport {
15. private String cpage;
16. private String total;
17. private String url;
18.
19. public String list() {
20.
21. //Get data from server
22. //...
23. //这里没有做任何逻辑,直接跳转到了页面
24. return SUCCESS;
25. }
26. public String getCpage() {
27. return cpage;
28. }
29.
30. public void setCpage(String cpage) {
31. this.cpage = cpage;
32. }
33.
34. public String getTotal() {
35. return total;
36. }
37.
38. public void setTotal(String total) {
39. this.total = total;
40. }
41.
42. public String getUrl() {
43. return url;
44. }
45.
46. public void setUrl(String url) {
47. this.url = url;
48. }
49.
50.
51. }
struts.xml
Xml代码
1. <?xml version="1.0" encoding="UTF-8"?>
2. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
3. <struts>
4. <package name="tagTest" extends="struts-default">
5. <action name="list" class="com.tangs.action.DisplayAction">
6. <result name="success">/list.jsp</result>
7. </action>
8. </package>
9. </struts>
4.在页面中使用标签
list.jsp
Html代码
1. <%@page contentType="text/html" pageEncoding="UTF-8"%>
2. <%@ taglib prefix="tangs" uri="/WEB-INF/tangs.tld"%>
3. <%@ taglib prefix="s" uri="/WEB-INF/struts-tags.tld"%>
4.
5. <html>
6. <head>
7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
8. <title>List</title>
9. </head>
10. <body>
11. 共 <s:property value="total"/> 页 第 <s:property value="cpage"/> 页<br>
12. <tangs:pages cpage="%{cpage}" total="%{total}" url="%{url}"/>
13. </body>
14. </html>
好了,启动服务器,从浏览器中输入http://localhost:7001/TagTest/list.page?cpage=1&total=5&url=list.page
就会得到下面的结果
发表评论
-
JSTL帮助文档
2011-10-08 18:19 4205一、核心标签库 <%@taglib uri=" ... -
JSP分页实例
2011-10-07 09:41 815分页技术实现 在开发网站的项目中难免会遇到各种各样的分页操作 ... -
Struts2 常用标签的使用方法
2011-10-07 09:15 2768Struts 2.1 Tags 最近学习 Struts 2 ... -
Java 单例模式解析
2011-10-07 09:05 826所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存 ... -
JavaScript 表单信息验证
2011-10-07 08:57 6761. 长度限制 <script> functi ...
相关推荐
本资源详细介绍了如何在Struts2中自定义分页标签,使得开发过程更加便捷。 在Struts2中,分页通常涉及到以下几个关键步骤: 1. **创建Action类**:首先,你需要创建一个Action类,该类将处理用户的请求,包括获取...
在这个基于Struts2的自定义分页标签的实践中,我们将深入探讨如何创建、配置和使用自定义标签来实现数据的分页展示,同时与Oracle数据库进行交互。 首先,理解分页的基本概念至关重要。分页是将大量数据分成小块,...
例如,在示例中创建了一个名为`tangs.tld`的文件,其中包含了对自定义分页标签`pages`的定义。TLD文件遵循JSP Tag Library 1.2的DTD规范,使得Web服务器可以解析并理解自定义标签的结构。 ```xml <!-- tangs.tld --...
8. **页面展示**:最后,在JSP页面中,我们可以使用Struts 2的内置标签结合自定义分页标签来展示数据和分页控件。 总结一下,实现Struts 2 自定义标签分页需要对Struts 2框架有深入理解,包括标签库的创建、Java类...
本篇文章将探讨如何在Struts2中实现自定义分页标签,这是一项非常实用的功能,尤其对于处理大量数据展示时,能显著提高用户体验。我们将深入源码,了解其工作原理,并提供一个自定义分页标签的实现过程。 首先,...
开发者可能结合Struts1标签库与自定义分页标签一起使用,实现更复杂的业务逻辑。 4. **实例化分页类**: 分页标签可能需要一个分页类的实例,这个类通常会包含当前页数、总页数、每页大小等属性,以及相关的计算...
通过对`TagDemo`的分析和学习,你可以更好地理解和应用Struts2自定义标签实现分页功能。 总之,Struts2自定义标签提供了一种灵活的方式,使得开发者能够在JSP页面中方便地实现分页效果。通过自定义标签,我们可以将...
在Struts2框架中,自定义标签是扩展和优化应用功能的重要手段,它允许开发者创建符合业务逻辑且...在实际项目中,根据业务需求,可以创建各种自定义标签,例如分页标签、数据表标签等,进一步优化开发效率和用户体验。
本教程将详细介绍如何在Struts2中自定义分页标签。 在传统的网页开发中,分页通常通过服务器端脚本或JavaScript实现,但在Struts2框架中,我们可以创建自定义标签来完成这一任务,使得代码更加模块化和易于维护。...
本项目"自定义分页标签struts2,spring"是针对Struts2和Spring框架的一个自定义标签实现,旨在简化开发过程,提高代码的可复用性和可维护性。下面我们将详细探讨这个项目中的关键技术点。 首先,Struts2是一个非常...
最后,在JSP页面中,我们可以像使用其他Struts2标签一样使用自定义的分页标签,通过属性传递参数。 ```jsp <%@ taglib prefix="s" uri="/struts-tags" %> ${currentPage}" total="${totalPages}" url="list....
本文将详细介绍如何在Struts2中实现分页标签,并提供一个简洁易懂的项目示例。 1. **Struts2分页概念**: 分页是将大量数据分割成若干小块,每次只加载一部分数据到页面上,使得用户可以逐页浏览,减轻服务器压力...
本教程主要探讨如何在Struts2框架下实现一个基于JSP的自定义分页组件,名为"zoo-paging-1.0.jar"。该组件不仅提供了分页功能,还附带了源代码和示例项目,方便开发者理解和应用。 首先,我们来理解分页的基本概念。...
在Java Web开发中,Struts框架是常用的MVC框架之一...这种方式比直接使用Struts的分页标签更加灵活,但需要更多的编码工作。总的来说,自定义标签是Java Web开发中的一个重要技能,能够提升应用的可维护性和可扩展性。
本项目以SSH(Struts2、Spring、Hibernate)经典框架为基础,通过自定义分页标签实现了这一功能。下面将详细介绍自定义分页标签在项目中的应用及其核心知识点。 首先,SSH框架是Java Web开发中广泛使用的三大组件。...
1. **配置Struts2分页标签**: 在Struts2的配置文件(struts.xml)中,需要声明这个自定义标签的namespace、action和result。同时,需要配置拦截器栈,确保分页相关的参数能够正确传递。 2. **编写自定义标签库**: ...
在JSP页面中,你可以这样使用自定义分页标签: ```jsp <%@ taglib prefix="s" uri="/struts-tags" %> <!-- 显示数据 --> ${yourList}" var="item"> <!-- 表格内容 --> <!-- 分页 --> ${yourAction}" ...