struts2自定义标签.docx
《struts2自定义标签.docx》由会员分享,可在线阅读,更多相关《struts2自定义标签.docx(41页珍藏版)》请在冰豆网上搜索。
struts2自定义标签
Struts2中实现自定义分页标签
Struts2中实现自定义标签很简单,主要分为3步:
1.创建taglib文件(.tld),编写标签声明。
2.编写自定义标签类。
3.在页面中使用标签。
下面以一个自定义的分页标签为例,进行说明。
其实,开发自定义标签并不需要Struts2的支持,一般情况下,只需要继承javax.servlet.jsp.tagext.BodyTagSupport类,重写doStartTag,doEndTag等方法即可。
这里在实现自定义标签时,继承的2个类分别是org.apache.struts2.views.jsp.ComponentTagSupport和ponents.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
java.lang.Object
extendedbyjavax.servlet.jsp.tagext.TagSupport
extendedbyjavax.servlet.jsp.tagext.BodyTagSupport
extendedbyorg.apache.struts2.views.jsp.StrutsBodyTagSupport
extendedbyorg.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" "
1.
2.
3. 2.2.3
4. 1.2
5. tangs
6. /tangs
7. "Tangs Tags"
8.
9.
10. pages
11. com.tangs.tag.PageTag //标签类
12. empty
13. //标签中的属性
14. cpage //属性名
15. true //是否必须
16. true //表示该自定义标签的某属性的值可以直接指定或者通过动态计算指定
17.
18.
19. total
20. true
21. true
22.
23.
24. url
25. true
26. true
27.
28.
29.
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEtaglibPUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.2//EN""
2.2.3
1.2
tangs
/tangs
"TangsTags"
pages
com.tangs.tag.PageTag//标签类
empty
//标签中的属性
cpage//属性名
true//是否必须
true//表示该自定义标签的某属性的值可以直接指定或者通过动态计算指定
total
true
true
url
true
true
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 ponents.Component;
7.import org.apache.struts2.views.jsp.ComponentTagSupport;
8.
9./**
10. * 分页标签
11. * @author tangs
12. */
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.}
packagecom.tangs.tag;
importcom.opensymphony.xwork2.util.ValueStack;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importponents.Component;
importorg.apache.struts2.views.jsp.ComponentTagSupport;
/**
*分页标签
*@authortangs
*/
publicclassPageTagextendsComponentTagSupport{
privateStringcpage;//当前页
privateStringtotal;//总页数
privateStringurl;//请求地址
publicvoidsetCpage(Stringcpage){
this.cpage=cpage;
}
publicvoidsetTotal(Stringtotal){
this.total=total;
}
publicvoidsetUrl(Stringurl){
this.url=url;
}
@Override
publicComponentgetBean(ValueStackarg0,HttpServletRequestarg1,HttpServletResponsearg2){
returnnewPages(arg0);//返回PagesComponent,分页的逻辑处理都在这个Component中
}
//获得参数
protectedvoidpopulateParams(){
super.populateParams();
Pagespages=(Pages)component;
pages.setCpage(cpage);
pages.setTotal(total);
pages.setUrl(url);
}
}
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 ponents.Component;
9.
10./**
11. * 分页逻辑Bean
12. * @author tangs
13. */
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("95. str.append(url);
96. str.append("?
cpage=1&total="+total+"&url="+url);
97. str.append("'>[首页]
98. str.append(url);
99. str.append("?
cpage=" + (cpageInt - 1) + "&total=" + total+"&url="+url);
100. str.append("'>[上一页]
101. str.append(url);
102. str.append("?
cpage=" + total + "&total=" + total+"&url="+url);