常用的Struts 2.0的标志(Tag)介绍

转自:http://www.blogjava.net/max/archive/2006/10/18/75857.html

在介绍常用标志前,我想先从总体上,对Struts 1.x与Struts 2.0的标志库(Tag Library)作比较。

Struts 1.xStruts 2.0
分类将标志库按功能分成HTML、Tiles、Logic和Bean等几部分严格上来说,没有分类,所有标志都在URI为“/struts-tags”命名空间下,不过,我们可以从功能上将其分为两大类:非UI标志和UI标志
表达式语言(expression languages)不支持嵌入语言(EL)OGNL、JSTL、Groovy和Velcity

以上表格,纯属个人总结,如有所不足或错误,请不吝指正

好了,我要开始介绍“常用”(这里所谓的“常用”,是指在已往工作中使用Struts里经常用到的)的标志了。

要在JSP中使用Struts 2.0标志,先要指明标志的引入。通过在JSP的代码的顶部加入以下代码可以做到这点。
<%@ taglib prefix = "s" uri = "/struts-tags" %>
  1. 非UI标志
    • if、elseif和else

      描述:
      执行基本的条件流转。

      参数:

      名称必需默认类型描述备注
      testBoolean决定标志里内容是否显示的表达式else标志没有这个参数
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:

      <% @pagecontentType = " text/html;charset=UTF-8 " %>
      <% @taglibprefix = " s " uri = " /struts-tags " %>
      <! DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN" >
      < html >
      < head >
      < title > ConditionFlow </ title >
      </ head >
      < body >
      < h3 > ConditionFlow </ h3 >
      <!--
      这里有点小技巧:
      本来可以用#parameters.name[0]来获得,请求中name的值。但是,在我实现include例子时,
      无论我用param标志给name赋任何值,#parameters里面不会含有任何值,所以#parameters.name也为空值。

      其原因为:
      当使用include标志时,被包含的页面(included)里#parameters拿到的是包含页面里的请求参数。

      因此,这里必须手工调用request.getParameter("name")。
      -->
      < s:set name ="name" value ="<%=" '"+request.getParameter("name")+"'"% > "/>
      < s:if test ="#name=='Max'" >
      Max'sfilehere
      </ s:if >
      < s:elseif test ="#name=='Scott'" >
      Scott'sfilehere
      </ s:elseif >
      < s:else >
      Other'sfilehere
      </ s:else >
      </ body >
      </ html >
      例1 condition.jsp
    • iterator

      描述:
      用于遍历集合(java.util.Collection)或枚举值(java.util.Iterator)。

      参数:

      名称必需默认类型描述
      statusString如果设置此参数,一个IteratorStatus的实例将会压入每个遍历的堆栈
      valueObject/String要遍历的可枚举的(iteratable)数据源,或者将放入新列表(List)的对象
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:

      <% @pagecontentType = " text/html;charset=UTF-8 " %>
      <% @pageimport = " java.util.List " %>
      <% @pageimport = " java.util.ArrayList " %>
      <% @taglibprefix = " s " uri = " /struts-tags " %>

      <! DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN" >
      <%
      Listlist
      = new ArrayList();
      list.add(
      " Max " );
      list.add(
      " Scott " );
      list.add(
      " Jeffry " );
      list.add(
      " Joe " );
      list.add(
      " Kelvin " );
      request.setAttribute(
      " names " ,list);
      %>
      < html >
      < head >
      < title > Iterator </ title >
      </ head >
      < body >
      < h3 > Names: </ h3 >
      <!--
      1、此处的空property元素用于获得当前iterator的值
      2、 status被设成stuts,在iterator的里面就可以通过#stuts取得IteratorStatus的对象。IteratorStatus 类包含当前序号信息,如是否第一个或最后一个,是否为奇数序号。这些信息在我们做格式化的时候,显得非常有用。
      -->
      < ol >
      < s:iterator value ="#request.names" status ="stuts" >
      < s:if test ="#stuts.odd==true" >
      < li > White < s:property /></ li >
      </ s:if >
      < s:else >
      < li style ="background-color:gray" >< s:property /></ li >
      </ s:else >
      </ s:iterator >
      </ ol >
      </ body >
      </ html >
      例2 iterator.jsp
    • i18n

      描述:
      加载资源包到值堆栈。它可以允许text标志访问任何资源包的信息,而不只当前action相关联的资源包。

      参数:

      名称必需默认类型描述
      valueObject/String资源包的类路径(如com.xxxx.resources.AppMsg)
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:

      HelloWorld = HelloWrold!
      例3 classes\ ApplicationMessages.properties

      <% @pagecontentType = " text/html;charset=UTF-8 " %>
      <% @taglibprefix = " s " uri = " /struts-tags " %>

      <! DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN" >
      < html >
      < head >
      < title > Internationization </ title >
      </ head >
      < body >
      < h3 >
      < s:i18n name ="ApplicationMessages" >
      < s:text name ="HelloWorld" />
      </ s:i18n >
      </ h3 >
      </ body >
      </ html >
      例3 i18n.jsp
    • include

      描述:
      包含一个servlet的输出(servlet或jsp的页面)。

      参数:

      名称必需默认类型描述
      valueString要包含的jsp或servlet
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:

      <% @pagecontentType = " text/html;charset=UTF-8 " %>
      <% @taglibprefix = " s " uri = " /struts-tags " %>

      <! DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN" >
      < html >
      < head >
      < title > Iterator </ title >
      </ head >
      < body >
      < h3 > InteratorPage </ h3 >
      < s:include value ="/condition.jsp" >
      < s:param name ="name" > Max </ s:param >
      </ s:include >
      < h3 > i18n </ h3 >
      < s:include value ="/i18n.jsp" />
      </ body >
      </ html >
      例4 include.jsp
    • param

      描述:
      为其他标签提供参数,比如include标签和bean标 签. 参数的name属性是可选的,如果提供,会调用Component的方法addParameter(String, Object), 如果不提供,则外层嵌套标签必须实现UnnamedParametric接口(如TextTag)。

      value的提供有两种方式,通过value属性或者标签中间的text,不同之处我们看一下例子:

      < param name = "color" > blue </ param > <!-- (A) -->

      < param name = "color" value = "blue" /> <!-- (B) -->
      (A)参数值会以String的格式放入statck.
      (B)该值会以java.lang.Object的格式放入statck.

      参数:

      名称必需默认类型描述
      nameString参数名
      valueStringvalue表达式
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:
      请参考例4。

    • set

      描述:
      set标签赋予变量一个特定范围内的值。当希望给一个变量赋一个复杂的表达式,每次访问该变量而不是复杂的表达式时用到。其在两种情况下非常有用: 复杂的表达式很耗时 (性能提升) 或者很难理解 (代码可读性提高)。

      参数:

      名称必需默认类型描述
      nameString变量名字
      scopeString变量作用域,可以为application, session, request, page, 或action.
      valueObject/String将会赋给变量的值
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:
      请参考例1。

    • text

      描述:
      支持国际化信息的标签。国际化信息必须放在一个和当前 action同名的resource bundle中,如果没有找到相应message,tag body将被当作默认message,如果没有tag body,message的name会被作为默认message。

      参数:

      名称必需默认类型描述
      nameString资源属性的名字
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:
      请参考例3。

    • url

      描述:
      该标签用于创建url,可以通过"param"标签提供request参数。

      当includeParams的值时'all'或者'get', param标签中定义的参数将有优先权,也就是说其会覆盖其他同名参数的值。

      参数: 略

      例子:

      <% @pagecontentType = " text/html;charset=UTF-8 " %>
      <% @taglibprefix = " s " uri = " /struts-tags " %>
      <! DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN" >
      < html >
      < head >
      < title > URL </ title >
      </ head >
      < body >
      < h3 > URL </ h3 >
      < a href ='<s:url value ="/i18n.jsp" /> '>i18n </ a >< br />
      < s:url id ="url" value ="/condition.jsp" >
      < s:param name ="name" > Max </ s:param >
      </ s:url >
      < s:a href ="%{url}" > if\elseif\else </ s:a >
      </ body >
      </ html >
      例5 url.jsp
    • property

      描述:
      得到'value'的属性,如果value没提供,默认为堆栈顶端的元素。

      参数:

      名称必需默认类型描述
      defaultString如果属性是null则显示的default值
      escapetrueBooelean是否escape HTML
      value栈顶Object要显示的值
      idObject/String用来标识元素的id。在UI和表单中为HTML的id属性

      例子:
      请参考例2。

  2. UI标志

    UI标志又可以分为表单UI和非 表单UI两部分。表单UI部分基本与Struts 1.x相同,都是对HTML表单元素的包装。不过,Struts 2.0加了几个我们经常在项目中用到的控件如:datepicker、doubleselect、timepicker、 optiontransferselect等。因为这些标志很多都经常用到,而且参数也很多,要在一篇文章详细说明并非易事。

    需要深入了解这些标志的朋友,可以到以下查看以下网址:
    http://wiki.javascud.org/display/ww2cndoc/Tags WebWork2文档中文化计划(中文)
    http://cwiki.apache.org/WW/tag-reference.html Tag Developers Guide(英文)
    本文有相当的内容也来自这两处。

    在此,我虽然不能够详细讲述这些标志,但是可以与大家分享一个来Struts 2.0 Show Case一个例子。

    /**/ /*
    *$Id:UITagExample.java4203852006-07-1000:57:05Zmrdon$
    *
    *Copyright2006TheApacheSoftwareFoundation.
    *
    *LicensedundertheApacheLicense,Version2.0(the"License");
    *youmaynotusethisfileexceptincompliancewiththeLicense.
    *YoumayobtainacopyoftheLicenseat
    *
    *
    http://www.apache.org/licenses/LICENSE-2.0
    *
    *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
    *distributedundertheLicenseisdistributedonan"ASIS"BASIS,
    *WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
    *SeetheLicenseforthespecificlanguagegoverningpermissionsand
    *limitationsundertheLicense.
    */
    package org.apache.struts2.showcase;

    import org.apache.struts2.ServletActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.Validateable;
    import com.opensymphony.xwork2.util.OgnlValueStack;

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.io.File;

    /***/ /**
    */
    public class UITagExample extends ActionSupport implements Validateable {

    private static final long serialVersionUID = - 94044809860988047L ;
    Stringname;
    Datebirthday;
    Stringbio;
    StringfavoriteColor;
    Listfriends;
    boolean legalAge;
    Stringstate;
    Stringregion;
    Filepicture;
    StringpictureContentType;
    StringpictureFileName;
    StringfavouriteLanguage;
    StringfavouriteVehicalType
    = " MotorcycleKey " ;
    StringfavouriteVehicalSpecific
    = " YamahaKey " ;

    ListleftSideCartoonCharacters;
    ListrightSideCartoonCharacters;

    ListfavouriteLanguages
    = new ArrayList();
    ListvehicalTypeList
    = new ArrayList();
    MapvehicalSpecificMap
    = new <span s
    <!-- Baidu Button BEGIN -->
    <script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script><!-- Baidu Button END --><!--192.168.100.36--> <!-- Baidu Button BEGIN --><script type="text/javascript" id="bdshare_js" data="type=tools&amp;uid=1536434"></script><script type="text/javascript" id="bdshell_js"></script><script type="text/javascript"> document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000) </script><!-- Baidu Button END -->
    主题推荐
    struts 2 tag helloworld 国际化 application
    猜你在找
    <script src="http://csdnimg.cn/jobreco/job_reco.js" type="text/javascript"></script><script type="text/javascript"> csdn.position.show({ sourceType: "blog", tplType: "blogDetail", searchType: "detail", searchKey: "39926373", username: "", containerId: "job_blog_reco" }); </script>
    <script type="text/javascript"> var searchtitletags = '常用的Struts 2.0的标志(Tag)介绍' + ',' + 'struts 2,tag,helloworld,国际化,application'; searchService({ index: 'blog', query: searchtitletags, from: 10, size: 10, appendTo: '#res-relatived', url: 'recommend', his: 2, client: "blog_cf_enhance", tmpl: '<dd style="background:url(http://static.blog.youkuaiyun.com/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px;"><a href="#{ url }" title="#{ title }" strategy="#{ strategy }">#{ title }</a></dd>' }); </script>
    <script type="text/javascript"> new Ad(4, 'ad_cen'); </script>
    查看评论
    * 以上用户言论只代表其个人观点,不代表优快云网站的观点或立场
    <script type="text/javascript"> var fileName = '39926373'; var commentscount = 0; var islock = false </script><script type="text/javascript" src="http://static.blog.youkuaiyun.com/scripts/comment.js"></script>
    <script type="text/javascript"> new Ad(5, 'ad_bot'); </script>
    <script type="text/javascript"> $(function () { $("#ad_frm_0").height("90px"); setTimeout(function(){ $("#ad_frm_2").height("200px"); },1000); /* if($("#comment_content").length>0) { $("#quick-reply").show(); $("#quick-reply").click(function(){ setEditorFocus(); }); } var d_top = $('#d-top-a'); document.onscroll = function () { var scrTop = (document.body.scrollTop || document.documentElement.scrollTop); if (scrTop > 500) { d_top.show(); } else { d_top.hide(); } } $('#d-top-a').click(function () { scrollTo(0, 0); this.blur(); return false; }); */ }); </script><style type="text/css"> .tag_list { background: none repeat scroll 0 0 #FFFFFF; border: 1px solid #D7CBC1; color: #000000; font-size: 12px; line-height: 20px; list-style: none outside none; margin: 10px 2% 0 1%; padding: 1px; } .tag_list h5 { background: none repeat scroll 0 0 #E0DBD3; color: #47381C; font-size: 12px; height: 24px; line-height: 24px; padding: 0 5px; margin: 0; } .tag_list h5 a { color: #47381C; } .classify { margin: 10px 0; padding: 4px 12px 8px; } .classify a { margin-right: 20px; white-space: nowrap; } </style>
    <style> #popup_mask { position: absolute; width: 100%; height: 100%; background: #000; z-index: 9999; left: 0px; top: 0px; opacity: 0.3; filter: alpha(opacity=30); display: none; } </style> <script type="text/javascript"> $(function(){ setTimeout(function(){ $(".comment_body:contains('回复')").each(function(index,item){ var u=$(this).text().split(':')[0].toString().replace("回复","") var thisComment=$(this); if(u) { $.getJSON("https://passport.youkuaiyun.com/get/nick?callback=?", {users: u}, function(a) { if(a!=null&&a.data!=null&&a.data.length>0) { nick=a.data[0].n; if(u!=nick) { thisComment.text(thisComment.text().replace(u,nick)); } } }); } }); },200); setTimeout(function(){ $("a img[src='http://js.tongji.linezing.com/stats.gif']").parent().css({"position":"absolute","left":"50%"}); },300); }); function loginbox(){ var $logpop=$("#pop_win"); $logpop.html('<iframe src="https://passport.youkuaiyun.com/account/loginbox?service=http://static.blog.youkuaiyun.com/callback.htm" frameborder="0" height="600" width="400" scrolling="no"></iframe>'); $('#popup_mask').css({ opacity: 0.5, width: $( document ).width() + 'px', height: $( document ).height() + 'px' }); $('#popup_mask').css("display","block"); $logpop.css( { top: ($( window ).height() - $logpop.height())/ 2 + $( window ).scrollTop() + 'px', left:($( window ).width() - $logpop.width())/ 2 } ); setTimeout( function () { $logpop.show(); $logpop.css( { opacity: 1 } ); }, 200 ); $('#popup_mask').unbind("click"); $('#popup_mask').bind("click", function(){ $('#popup_mask').hide(); var $clopop = $("#pop_win"); $("#common_ask_div_sc").css("display","none"); $clopop.css( { opacity: 0 } ); setTimeout( function () { $clopop.hide(); }, 350 ); return false; }); } </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值