Struts2自定义标签实例

转自:http://blog.csdn.net/gqltt/article/details/6976771

自定义Button功能描述:

<tangs:button  items="apple,orange,banana"/>

解析后为:

<input  type="button"  name="apple"  value="apple" />

<input  type="button"  name="orange"  value="orange" />

<input  type="button"  name="banana"  value="banana" />


文件配置:



自定义标签主要包括三个步骤:

1/创建tld文件,影射标签名和标签的java类;

2/编写java类,改类需要ComponentTagSupport类;

3/编写jsp页面进行测试。

tangs.tld

[html]  view plain copy
  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">  
  3. <taglib>  
  4.     <tlib-version>2.2.3</tlib-version>  
  5.     <jsp-version>1.2</jsp-version>  
  6.     <short-name>tangs</short-name>  
  7.     <uri>/tangs</uri>  
  8.     <display-name>"Tangs Tags"</display-name>  
  9.     <tag>  
  10.         <name>button</name>  
  11.         <tag-class>com.gq.tag.button.ButtonTag</tag-class>  
  12.         <body-content>empty</body-content>  
  13.         <attribute>  
  14.             <name>items</name>  
  15.             <required>true</required>  
  16.             <rtexprvalue>true</rtexprvalue>  
  17.         </attribute>  
  18.     </tag>  
  19. </taglib>  
这里要注意的是:<rtexpvalue>true</rtexpvalue> 时候,可以使用 JSP 表达式

rtexprvalue的全称是 Run-time Expression Value, 它用于表示是否可以使用JSP表达式.

当在<attribute>标签里指定<rtexprvalue>true</rtexprvalue>时
, 表示该自定义标签的某属性的值可以直接指定或者通过动态计算指定,  example as follow:

<sql:query var="result" >
    select * from mytable order by nameid
</sql:query>
<%request.setAttribute("nameid", "2"); %>
<myTag:cupSize cupSize="1" cupSizes="${result}"></myTag:cupSize>
<myTag:cupSize cupSize="${nameid}" cupSizes="${result}"></myTag:cupSize>


当在<attribute>标签里指定<rtexprvalue>false</rtexprvalue>时, 表示该自定义标签的某属性的值只能直接指定,  example as follow:
<myTag:cupSize cupSize="1" cupSizes="${result}"></myTag:cupSize>

_________________________________________________________________________

ButtonTag.java

[java]  view plain copy
  1. /** 
  2. *创建日期   :2011-11-16 
  3. *创建用户   :GongQiang 
  4. *变更情况   : 
  5. *文档位置   $Archive:test_struct2/com.gq.tag.button/ButtonTag.java$ 
  6. *最后变更   $Author:  $ 
  7. *变更日期   $Date: $ 
  8. *当前版本   $Revision: $ 
  9. * 
  10. *Copyright (c) 2004 Sino-Japanese Engineering Corp, Inc. All Rights Reserved. 
  11. */  
  12. package com.gq.tag.button;  
  13.   
  14. import javax.servlet.http.HttpServletRequest;  
  15. import javax.servlet.http.HttpServletResponse;  
  16.   
  17. import org.apache.struts2.components.Component;  
  18. import org.apache.struts2.views.jsp.ComponentTagSupport;  
  19.   
  20. import com.opensymphony.xwork2.util.ValueStack;  
  21.   
  22. public class ButtonTag extends ComponentTagSupport {  
  23.     private static final long serialVersionUID = 1L;  
  24.       
  25.     private String items;  
  26.   
  27.     public String getItems() {  
  28.         return items;  
  29.     }  
  30.   
  31.   
  32.     public void setItems(String items) {  
  33.         this.items = items;  
  34.     }  
  35.   
  36.     /** 
  37.      * getBean 在类ComponentTagSupport中为抽象,子类必须实现 
  38.      */  
  39.     @Override  
  40.     public Component getBean(ValueStack valueStack, HttpServletRequest request, HttpServletResponse response) {  
  41.         return new ButtonService( valueStack );  
  42.     }  
  43.   
  44.   
  45.     @Override  
  46.     protected void populateParams() {  
  47.         super.populateParams();  
  48.           
  49.         ButtonService buttonService = (ButtonService) getComponent();  
  50.         buttonService.setItems( getItems() );  
  51.     }  
  52. }  

_________________________________________________________________________

ButtonService.java

[java]  view plain copy
  1. /** 
  2. *创建日期   :2011-11-16 
  3. *创建用户   :GongQiang 
  4. *变更情况   : 
  5. *文档位置   $Archive:test_struct2/com.gq.tag.button/ButtonService.java$ 
  6. *最后变更   $Author:  $ 
  7. *变更日期   $Date: $ 
  8. *当前版本   $Revision: $ 
  9. * 
  10. *Copyright (c) 2004 Sino-Japanese Engineering Corp, Inc. All Rights Reserved. 
  11. */  
  12. package com.gq.tag.button;  
  13.   
  14. import java.io.IOException;  
  15. import java.io.Writer;  
  16.   
  17. import org.apache.struts2.components.Component;  
  18.   
  19. import com.opensymphony.xwork2.util.ValueStack;  
  20.   
  21. public class ButtonService extends Component {  
  22.     private String items;  
  23.       
  24.     public String getItems() {  
  25.         return items;  
  26.     }  
  27.   
  28.   
  29.     public void setItems(String items) {  
  30.         this.items = items;  
  31.     }  
  32.   
  33.   
  34.     /** 
  35.      * Component 没有默认构造器,子类必须指明构造器 
  36.      *  
  37.      * @param valueStack 
  38.      */  
  39.     public ButtonService(ValueStack valueStack) {  
  40.         super(valueStack);  
  41.     }  
  42.   
  43.   
  44.     @Override  
  45.     public boolean start(Writer writer) {  
  46.         String[] itemValues = getItemValues();  
  47.           
  48.         //如下操作,仅仅显示出itemValues 的button  
  49.         StringBuilder sb = new StringBuilder();  
  50.         for( String value : itemValues ){  
  51.             sb.append( "<input type=\"button\" name=\"" + value + "\" value=\"" + value + "\">" );  
  52.         }  
  53.         try {  
  54.             writer.write( sb.toString() );  
  55.         } catch (IOException e) {  
  56.             throw new RuntimeException( "Construct <tangs:button /> error" );  
  57.         }  
  58.           
  59.         return super.start(writer);  
  60.     }  
  61.       
  62.     private String[] getItemValues( ){  
  63.         if( items == null || items.trim().equals( "" ) ){  
  64.             return new String[]{};  
  65.         }  
  66.           
  67.         // 直接给属性items 赋值, <tangs:button items="apple,orange,banana"/>  
  68.         if( items.contains( "," ) ){ //假设必须是多个  
  69.             return items.split( "," );  
  70.         }  
  71.         // 通过JSP运行获取值,<tangs:button items="fruits"/>  
  72.         else{  
  73.             return (String[])this.getStack().findValue( items ); //这样写,只支持struts2 的ongl语法  
  74.         }  
  75.           
  76.     }  
  77.       
  78. }  

通过如上三个文件,tangs.tld、ButtonTag.java 和 ButtonService.java 的定义 <tangs:button />自定义标签已经完成,下面演示使用:

struts.xml 配置文件中添加 ButtonTag:

[html]  view plain copy
  1. <!-- 演示标签 -->  
  2. <package name="tag" extends="struts-default" namespace="/tag">  
  3.     <action name="Tag" class="com.gq.action.TagTestAction">  
  4.         <result name="success">/tagTest/tags.jsp</result>  
  5.         <interceptor-ref name="defaultStack"/>  
  6.     </action>  
  7.       
  8.     <action name="ButtonTag" class="com.gq.tag.button.ButtonActionTest">  
  9.         <result name="success">/tagTest/buttonTag.jsp</result>  
  10.         <interceptor-ref name="defaultStack"/>  
  11.     </action>  
  12. </package>  


ButtonActionTest.java

[java]  view plain copy
  1. /** 
  2. *创建日期   :2011-11-16 
  3. *创建用户   :GongQiang 
  4. *变更情况   : 
  5. *文档位置   $Archive:test_struct2/com.gq.tag.button/ButtonActionTest.java$ 
  6. *最后变更   $Author:  $ 
  7. *变更日期   $Date: $ 
  8. *当前版本   $Revision: $ 
  9. * 
  10. *Copyright (c) 2004 Sino-Japanese Engineering Corp, Inc. All Rights Reserved. 
  11. */  
  12. package com.gq.tag.button;  
  13.   
  14. import com.opensymphony.xwork2.ActionSupport;  
  15.   
  16. public class ButtonActionTest extends ActionSupport {  
  17.     private static final long serialVersionUID = 1L;  
  18.       
  19.     public String[] getFruits(){  
  20.         return new String[]{ "apple""apple""apple"};  
  21.     }  
  22.   
  23.     @Override  
  24.     public String execute() throws Exception {  
  25.         return SUCCESS;  
  26.     }  
  27. }  

JSP 页面 buttonTag.jsp

[html]  view plain copy
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <%@taglib prefix="s" uri="/struts-tags" %>  
  3. <%@taglib prefix="tangs" uri="/tangs" %>  
  4. <%  
  5. String path = request.getContextPath();  
  6. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  7. %>  
  8.   
  9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  10. <html>  
  11.   <head>  
  12.     <base href="<%=basePath%>">  
  13.       
  14.     <title>My JSP 'buttonTag.jsp' starting page</title>  
  15.   
  16.   </head>  
  17.     
  18.   <body>  
  19.     页面直接给定属性<br/>  
  20.     <tangs:button items="apple,orange,banana"/>  
  21.       
  22.     <br/>  
  23.     <br/>  
  24.     运行时获取值<br/>  
  25.     <tangs:button items="fruits"/>  
  26.   </body>  
  27. </html>  

访问页面效果:




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值