1、struts2自定义标签Struts2中实现自定义分页标签 Struts2中实现自定义标签很简单,主要分为3步: 1.创建taglib文件(.tld),编写标签声明。 2.编写自定义标签类。 3.在页面中使用标签。 下面以一个自定义的分页标签为例,进行说明。 其实,开发自定义标签并不需要Struts2的支持,一般情况下,只需要继承javax.servlet.jsp.tagext.BodyTagSupport类,重写doStartTag,doEndTag等方法即可。这里在实现自定义标签时,继承的2个类分别是org.apache.struts2.views.jsp.ComponentTagSupp
2、ort和ponents.Component,ComponentTagSupport实际上是对BodyTagSupport的一次封装,看一下ComponentTagSupport类的继承关系就明了了:Java代码 1. java.lang.Object 2. extendedbyjavax.servlet.jsp.tagext.TagSupport 3. extendedbyjavax.servlet.jsp.tagext.BodyTagSupport 4. extendedbyorg.apache.struts2.views.jsp.StrutsBodyTagSupport 5. extend
3、edbyorg.apache.struts2.views.jsp.ComponentTagSupportjava.lang.Objectextended by javax.servlet.jsp.tagext.TagSupportextended by javax.servlet.jsp.tagext.BodyTagSupportextended by org.apache.struts2.views.jsp.StrutsBodyTagSupportextended by org.apache.struts2.views.jsp.ComponentTagSupport继承ComponentTa
4、gSupport类是为了获得标签中的属性值,并包装成Component对象。继承Component类是为了从Struts2中的ValueStack中获得相对应的值。1.声明自定义标签。首先,需要创建一个tld文件,这是一个标准的XML文件,这个文件中就包含有对自定义标签的声明,声明指出了标签的名字,实现标签的类,标签的属性等信息。当在页面中使用该标签时,web服务器就会从这个文件中找出相对应的标签类,并实例化后执行。这个文件其实与struts.xml文件的作用相类似。tangs.tldXml代码 1. 2. !DOCTYPEtaglibPUBLIC-/SunMicrosystems,Inc./
5、DTDJSPTagLibrary1.2/EN1. 2. 3. 2.2.34. 1.25. tangs6. /tangs7. TangsTags8. 9. 10. pages11. com.tangs.tag.PageTag/标签类 12. empty13. /标签中的属性 14. cpage/属性名 15. true/是否必须 16. true/表示该自定义标签的某属性的值可以直接指定或者通过动态计算指定 17. 18. 19. total20. true21. true22. 23. 24. url25. true26. true27. 28. 29. !DOCTYPE taglib PUB
6、LIC -/Sun Microsystems, Inc./DTD JSP Tag Library 1.2/EN 2.2.31.2tangs/tangsTangs Tagspagescom.tangs.tag.PageTag /标签类empty /标签中的属性cpage /属性名true /是否必须true /表示该自定义标签的某属性的值可以直接指定或者通过动态计算指定totaltruetrueurltruetrue2.编写标签类PageTag.javaJava代码 1. packagecom.tangs.tag; 2. 3. importcom.opensymphony.xwork2.util
7、.ValueStack; 4. importjavax.servlet.http.HttpServletRequest; 5. importjavax.servlet.http.HttpServletResponse; 6. importponents.Component; 7. importorg.apache.struts2.views.jsp.ComponentTagSupport; 8. 9. /* 10. *分页标签 11. *authortangs 12. */13. publicclassPageTagextendsComponentTagSupport 14. privateS
8、tringcpage;/当前页 15. privateStringtotal;/总页数 16. privateStringurl;/请求地址 17. 18. publicvoidsetCpage(Stringcpage) 19. this.cpage=cpage; 20. 21. 22. publicvoidsetTotal(Stringtotal) 23. this.total=total; 24. 25. 26. publicvoidsetUrl(Stringurl) 27. this.url=url; 28. 29. 30. Override31. publicComponentgetB
9、ean(ValueStackarg0,HttpServletRequestarg1,HttpServletResponsearg2) 32. returnnewPages(arg0);/返回PagesComponent,分页的逻辑处理都在这个Component中 33. 34. 35. /获得参数 36. protectedvoidpopulateParams() 37. super.populateParams(); 38. 39. Pagespages=(Pages)component; 40. pages.setCpage(cpage); 41. pages.setTotal(total
10、); 42. pages.setUrl(url); 43. 44. package com.tangs.tag;import com.opensymphony.xwork2.util.ValueStack;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import ponents.Component;import org.apache.struts2.views.jsp.ComponentTagSupport;/* 分页标签* author tangs*/pu
11、blic class PageTag extends ComponentTagSupport private String cpage; /当前页private String total; /总页数private String url; /请求地址public void setCpage(String cpage) this.cpage = cpage;public void setTotal(String total) this.total = total;public void setUrl(String url) this.url = url;Overridepublic Compone
12、nt getBean(ValueStack arg0, HttpServletRequest arg1, HttpServletResponse arg2) return new Pages(arg0); /返回Pages Component,分页的逻辑处理都在这个Component中/获得参数protected void populateParams() super.populateParams();Pages pages = (Pages)component;pages.setCpage(cpage);pages.setTotal(total);pages.setUrl(url); Pag
13、es.javaJava代码 1. packagecom.tangs.tag; 2. 3. importcom.opensymphony.xwork2.util.ValueStack; 4. importjava.io.IOException; 5. importjava.io.Writer; 6. importjava.util.logging.Level; 7. importjava.util.logging.Logger; 8. importponents.Component; 9. 10. /* 11. *分页逻辑Bean 12. *authortangs 13. */14. publi
14、cclassPagesextendsComponent 15. privateStringcpage; 16. privateStringtotal; 17. privateStringurl; 18. 19. publicStringgetCpage() 20. returncpage; 21. 22. 23. publicvoidsetCpage(Stringcpage) 24. this.cpage=cpage; 25. 26. 27. publicStringgetTotal() 28. returntotal; 29. 30. 31. publicvoidsetTotal(Strin
15、gtotal) 32. this.total=total; 33. 34. 35. publicStringgetUrl() 36. returnurl; 37. 38. 39. publicvoidsetUrl(Stringurl) 40. this.url=url; 41. 42. 43. 44. publicPages(ValueStackarg0) 45. super(arg0); 46. 47. 48. Override49. publicbooleanstart(Writerwriter) 50. booleanresult=super.start(writer); 51. try
16、 52. StringBuilderstr=newStringBuilder(); 53. booleanisValid=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.
17、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.en
18、dsWith() 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. IntegercpageInt=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(首页上一页ahref=); 101. str.append(url); 102. str.append(?cpage=+total+&total=+total+&url=+url);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1