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

本文介绍了Struts2.0中常用的标签及其用法,包括非UI标签如if、elseif、else、iterator等,以及UI标签如textfield、datepicker等,并通过示例展示了如何在JSP中使用这些标签。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本系列文章导航

为Struts 2.0做好准备

Struts 2的基石——拦截器(Interceptor)

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

在Struts 2.0中国际化(i18n)您的应用程序

转换器(Converter)—Struts 2.0中的魔术师

在Struts 2.0中实现表单数据校验(Validation)

在上一篇文章《为Struts 2.0做好准备 》中,我过于详细地介绍了Struts 2.0开发环境和运行环境的配置,所以,本文很少涉及的以上两方面的细节。如果,您看完《为Struts 2.0做好准备 》后,还有什么不明白,或者没法运行文中例子,请联系:Max.M.Yuan@gmail.com。

在介绍常用标志前,我想先从总体上,对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 ="<%=" &apos;"+request.getParameter("name")+"&apos;"% > "/>
      < s:if test ="#name==&apos;Max&apos;" >
      Max&apos;sfilehere
      </ s:if >
      < s:elseif test ="#name==&apos;Scott&apos;" >
      Scott&apos;sfilehere
      </ s:elseif >
      < s:else >
      Other&apos;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的值时&apos;all&apos;或者&apos;get&apos;, 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 =&apos;<s:url value ="/i18n.jsp" /> &apos;>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

      描述:
      得到&apos;value&apos;的属性,如果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 HashMap();

    Stringthoughts;

    public UITagExample() {
    favouriteLanguages.add(
    new Language( " EnglishKey " , " EnglishLanguage " ));
    favouriteLanguages.add(
    new Language( " FrenchKey " , " FrenchLanguage " ));
    favouriteLanguages.add(
    new Language( " SpanishKey " , " SpanishLanguage " ));

    VehicalTypecar
    = new VehicalType( " CarKey " , " Car " );
    VehicalTypemotorcycle
    = new VehicalType( " MotorcycleKey " , " Motorcycle " );
    vehicalTypeList.add(car);
    vehicalTypeList.add(motorcycle);

    Listcars
    = new ArrayList();
    cars.add(
    new VehicalSpecific( " MercedesKey " , " Mercedes " ));
    cars.add(
    new VehicalSpecific( " HondaKey " , " Honda " ));
    cars.add(
    new VehicalSpecific( " FordKey " , " Ford " ));

    Listmotorcycles
    = new ArrayList();
    motorcycles.add(
    new VehicalSpecific( " SuzukiKey " , " Suzuki " ));
    motorcycles.add(
    new VehicalSpecific( " YamahaKey " , " Yamaha " ));

    vehicalSpecificMap.put(car,cars);
    vehicalSpecificMap.put(motorcycle,motorcycles);
    }


    public ListgetLeftSideCartoonCharacters() {
    return leftSideCartoonCharacters;
    }

    public void setLeftSideCartoonCharacters(ListleftSideCartoonCharacters) {
    this .leftSideCartoonCharacters = leftSideCartoonCharacters;
    }


    public ListgetRightSideCartoonCharacters() {
    return rightSideCartoonCharacters;
    }

    public void setRightSideCartoonCharacters(ListrightSideCartoonCharacters) {
    this .rightSideCartoonCharacters = rightSideCartoonCharacters;
    }


    public StringgetFavouriteVehicalType() {
    return favouriteVehicalType;
    }


    public void setFavouriteVehicalType(StringfavouriteVehicalType) {
    this .favouriteVehicalType = favouriteVehicalType;
    }


    public StringgetFavouriteVehicalSpecific() {
    return favouriteVehicalSpecific;
    }


    public void setFavouriteVehicalSpecific(StringfavouriteVehicalSpecific) {
    this .favouriteVehicalSpecific = favouriteVehicalSpecific;
    }


    public ListgetVehicalTypeList() {
    return vehicalTypeList;
    }


    public ListgetVehicalSpecificList() {
    OgnlValueStackstack
    = ServletActionContext.getValueStack(ServletActionContext.getRequest());
    ObjectvehicalType
    = stack.findValue( " top " );
    if (vehicalType != null && vehicalType instanceof VehicalType) {
    Listl
    = (List)vehicalSpecificMap.get(vehicalType);
    return l;
    }

    return Collections.EMPTY_LIST;
    }


    public ListgetFavouriteLanguages() {
    return favouriteLanguages;
    }


    public Stringexecute() throws Exception {
    return SUCCESS;
    }


    /**/ /* GettersandSetters */

    public StringdoSubmit() {
    return SUCCESS;
    }


    // ===innerclass
    public static class Language {
    Stringdescription;
    Stringkey;

    public Language(Stringkey,Stringdescription) {
    this .key = key;
    this .description = description;
    }


    public StringgetKey() {
    return key;
    }

    public StringgetDescription() {
    return description;
    }


    }


    public static class VehicalType {
    Stringkey;
    Stringdescription;
    public VehicalType(Stringkey,Stringdescription) {
    this .key = key;
    this .description = description;
    }


    public StringgetKey() { return this .key;}
    public StringgetDescription() { return this .description;}

    public boolean equals(Objectobj) {
    if ( ! (obj instanceof VehicalType)) {
    return false ;
    }

    else {
    return key.equals(((VehicalType)obj).getKey());
    }

    }


    public int hashCode() {
    return key.hashCode();
    }

    }


    public static class VehicalSpecific {
    Stringkey;
    Stringdescription;
    public VehicalSpecific(Stringkey,Stringdescription) {
    this .key = key;
    this .description = description;
    }


    public StringgetKey() { return this .key;}
    public StringgetDescription() { return this .description;}

    public boolean equals(Objectobj) {
    if ( ! (obj instanceof VehicalSpecific)) {
    return false ;
    }

    else {
    return key.equals(((VehicalSpecific)obj).getKey());
    }

    }


    public int hashCode() {
    return key.hashCode();
    }

    }

    }
    例6 org.apache.struts2.showcase.UITagExample.java

    <% @pagecontentType = " text/html;charset=UTF-8 " pageEncoding = " UTF-8 " %>
    <% @taglibprefix = " s " uri = " /struts-tags " %>
    < html >
    < head >
    < title > UITagsExample </ title >
    < s:head />
    </ head >
    < body >

    < s:actionerror />
    < s:actionmessage />
    < s:fielderror />

    < s:form action ="exampleSubmit" method ="post" enctype ="multipart/form-data" tooltipConfig ="#{&apos;jsTooltipEnabled&apos;:&apos;true&apos;}" >
    < s:textfield
    label ="Name"
    name
    ="name"
    tooltip
    ="EnteryourNamehere" />

    < s:datepicker
    tooltip ="SelectYourBirthday"
    label
    ="Birthday"
    name
    ="birthday" />

    < s:textarea
    tooltip ="EnteryourBiography"
    label
    ="Biograph"
    name
    ="bio"
    cols
    ="20"
    rows
    ="3" />

    < s:select
    tooltip ="ChooseYourFavouriteColor"
    label
    ="FavoriteColor"
    list
    ="{&apos;Red&apos;,&apos;Blue&apos;,&apos;Green&apos;}"
    name
    ="favoriteColor"
    emptyOption
    ="true"
    headerKey
    ="None"
    headerValue
    ="None" />

    < s:select
    tooltip ="ChooseYourFavouriteLanguage"
    label
    ="FavouriteLanguage"
    list
    ="favouriteLanguages"
    name
    ="favouriteLanguage"
    listKey
    ="key"
    listValue
    ="description"
    emptyOption
    ="true"
    headerKey
    ="None"
    headerValue
    ="None" />

    < s:checkboxlist
    tooltip ="ChooseyourFriends"
    label
    ="Friends"
    list
    ="{&apos;Patrick&apos;,&apos;Jason&apos;,&apos;Jay&apos;,&apos;Toby&apos;,&apos;Rene&apos;}"
    name
    ="friends" />

    < s:checkbox
    tooltip ="ConfirmedthatyourareOver18"
    label
    ="Age18+"
    name
    ="legalAge" />

    < s:doubleselect
    tooltip ="ChooseYourState"
    label
    ="State"
    name
    ="region" list ="{&apos;North&apos;,&apos;South&apos;}"
    value
    ="&apos;South&apos;"
    doubleValue
    ="&apos;Florida&apos;"
    doubleList
    ="top==&apos;North&apos;?{&apos;Oregon&apos;,&apos;Washington&apos;}:{&apos;Texas&apos;,&apos;Florida&apos;}"
    doubleName
    ="state"
    headerKey
    ="-1"
    headerValue
    ="----------PleaseSelect----------"
    emptyOption
    ="true" />

    < s:doubleselect
    tooltip ="ChooseyourVehical"
    label
    ="FavouriteVehical"
    name
    ="favouriteVehicalType"
    list
    ="vehicalTypeList"
    listKey
    ="key"
    listValue
    ="description"
    value
    ="&apos;MotorcycleKey&apos;"
    doubleValue
    ="&apos;YamahaKey&apos;"
    doubleList
    ="vehicalSpecificList"
    doubleListKey
    ="key"
    doubleListValue
    ="description"
    doubleName
    ="favouriteVehicalSpecific" headerKey ="-1"
    headerValue
    ="----------PleaseSelect----------"
    emptyOption
    ="true" />

    < s:file
    tooltip ="UploadYourPicture"
    label
    ="Picture"
    name
    ="picture" />

    < s:optiontransferselect
    tooltip ="SelectYourFavouriteCartoonCharacters"
    label
    ="FavouriteCartoonsCharacters"
    name
    ="leftSideCartoonCharacters"
    leftTitle
    ="LeftTitle"
    rightTitle
    ="RightTitle"
    list
    ="{&apos;Popeye&apos;,&apos;He-Man&apos;,&apos;Spiderman&apos;}"
    multiple
    ="true"
    headerKey
    ="headerKey"
    headerValue
    ="---PleaseSelect---"
    emptyOption
    ="true"
    doubleList
    ="{&apos;Superman&apos;,&apos;MickeyMouse&apos;,&apos;DonaldDuck&apos;}"
    doubleName
    ="rightSideCartoonCharacters"
    doubleHeaderKey
    ="doubleHeaderKey"
    doubleHeaderValue
    ="---PleaseSelect---"
    doubleEmptyOption
    ="true"
    doubleMultiple
    ="true" />

    < s:textarea
    label ="YourThougths"
    name
    ="thoughts"
    tooltip
    ="Enteryourthoughtshere" />

    < s:submit onclick ="alert(&apos;aaaa&apos;);" />
    < s:reset onclick ="alert(&apos;bbbb&apos;);" />
    </ s:form >

    </ body >
    </ html >
    例6 example.jsp

    < action name ="example" class ="org.apache.struts2.showcase.UITagExample" >
    < result > example.jsp </ result >
    < result name ="input" > example.jsp </ result >
    </ action >
    例6 struts.xml代码片段

文章来源:http://www.blogjava.net/max/archive/2006/10/18/75857.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值