论坛首页 入门技术论坛

《WebWork in action》第九章

浏览 3624 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-27  
第九章: 标签库

WebWork提供四类标签:

. 数据标签:  从值栈中取数据,将数据设置到值栈;
. 控制流标签:改变程序的执行流,以及基于系统的状态产生不同的输出;
. UI标签:    主要呈现表单外观;
. 杂项标签:  生成URL和输入国际化文本等。

语法:1. 对String类型外的内容依据值栈进行求值;
      2. 对String类型内容进行解析:WebWork查找符合%{...}样式的子串,然后对大括号间的表达式进行求值。

在默认情况下,WebWork 2.1.x关没有启用新语法,通过在webwork.properties中新增一行代码实现:

webwork.tag.altSyntax = true;

一. 数据标签

    1. property 标签:输出OGNL表达式的值;
      
       property标签的属性
       ------------------------------------------------------------------------------------------------
       属性      数据类型   是否必需  描述
       ------------------------------------------------------------------------------------------------
       value     Object      否       进行求值的表达式,如没设定,将会被设定为top
       default   String      否       如果依据value属性无法得到具体值,则使用default设定的默认值
       escape    Boolean     否       是否将输出内容进行HTML转义,例设为true, &将转义为&
       ------------------------------------------------------------------------------------------------

    2. set 标签:对值栈中的表达式进行求值,并将结果赋给特定作用域中的某个变量名。

       set标签的属性
       ------------------------------------------------------------------------------------------------
       属性      数据类型   是否必需  描述
       ------------------------------------------------------------------------------------------------
       name      String      是       在一个指定的作用域内被赋值的变量名
       value     Object      是       用于赋值的表达式
       scope     String      否       可选的值为:application, session,request, page或default(即action context)
       ------------------------------------------------------------------------------------------------           
 
       举例:

    <%@page contentType="text/html;charset=UTF-8" %>
    <%@taglib uri="webwork" prefix="ww" %>
    Name:     <ww:property value="#session['u'].name"/><br>
    Password: <ww:property value="#session.u.password"/><br>

每次都要重复使用#session['u']不仅烦人,而且容易出错。可以通过set标签定义一个临时变量,令这个变量指向user对象。

    <%@page contentType="text/html;charset=UTF-8" %>
    <%@taglib uri="webwork" prefix="ww" %>
    <ww:set name="u" value="#session.u"/>
    Name:     <ww:property value="#u.name"/><br>
    Password: <ww:property value="#u.password"/><br>

    3. push 标签:将对象压入值栈后直接对其进行多次操作,而不需要在每个与对象相关的表达式之前加上对象名称。

       push标签的属性
       ------------------------------------------------------------------------------------------------
       属性      数据类型   是否必需  描述
       ------------------------------------------------------------------------------------------------
       value     Object      是       需要压入值栈的树所对应的表达式
   
       如使用push标签,上个例子代码可进一步简化:

    <%@page contentType="text/html;charset=UTF-8" %>
    <%@taglib uri="webwork" prefix="ww" %>
    <ww:set name="u" value="#session.u"/>
    <ww:push value="#u">
    Name:     <ww:property value="name"/><br>
    Password: <ww:property value="password"/><br>
    </ww:push>

       push标签通常和JSP静态包含,实现部分代码重用;

    4. bean 标签:创建JavaBean,压入值栈以及赋给某个变量名。

       bean标签的属性
       ------------------------------------------------------------------------------------------------
       属性      数据类型   是否必需  描述
       ------------------------------------------------------------------------------------------------
       name      String      是       被创建的bean对应的包名和类名
       id        String      否       如果需在bean标签之外引用bean对象,可通过id属性设置引用名称

    <%@page contentType="text/html;charset=UTF-8" %>
    <%@taglib uri="webwork" prefix="ww" %>
    <ww:bean name="java.util.Date" id="now"/>
    <ww:bean name="com.opensymphony.webwork.util.DateFormatter">
        <ww:param name="format" value="'MM/dd/yyyy'"/>
        <ww:param name="date" value="now"/>   
        <ww:property value="formattedDate"/>
    </ww:bean>

        打印输出当前日期。虽然可用DateFormatter打印出格式化的日期,还是推荐使用国际化功能实现格式化的操作。

    5. action 标签:执行action并访问相应的数据。

       action 标签的属性
       ------------------------------------------------------------------------------------------------
       属性      数据类型   是否必需  描述
       ------------------------------------------------------------------------------------------------
       name      String      是       action名
       namespace String      否       action的namespace,默认值为当前页面所在的namespace
       id        String      否       引用action bean所需的名称,便于在页面后面的部分引用
       executeResult Boolean 否       为true,才执行action对应的result,默认值为false;

       使用action标签,可以在页面重用action输出的结果, 举例有一action往页面上输出一树形目录,该目录在多处要被使用,
       可以使用以下形式使用:
 
       <ww:action name="categoryTree" executeResult="true"/>     

       其中categoryTree为action在xwork.xml中的配置名称。

二. 控制标签
 
    1. iterator标签:轻松循环遍历任何对象集合,包括Collection, Map, Enumeraton, Iterator及array。同时可在action context
                     中定义一个变量,用于确定与当前循环状态相关的基本信息。

       iterator 标签的属性
       ------------------------------------------------------------------------------------------------
       属性      数据类型                          是否必需  描述
       ------------------------------------------------------------------------------------------------
       value     Collection,Map,Enumeration        是        被循环遍历的对象
                 Iterator或者array
       status    String                            否        如果设置了该属性,IteratorStatus对象就会被
                                                             置于action context中

       示例:
      
       a. action

    package ch9;

    import com.opensymphony.xwork.ActionSupport;
    import java.util.*;
    import ch4.User;

    public class IteratorTagTest extends ActionSupport {
        private String[] array = {"Monday","Tuesday","Wednesday","Thursday"};
        private List<User> list;
        private Map<Integer, String> map;
       
        @Override
        public String execute() {
            list = new ArrayList<User>();
            for(int i=0;i<10;i++) {
                User u = new User("user"+i, "resu"+i);
                list.add(u);
            }
            map = new HashMap<Integer, String>();
            for(int i=1;i<array.length;i++) {
                map.put(i, array[i]);
            }
            return SUCCESS;
        }

        public String[] getArray() {
            return array;
        }

        public void setArray(String[] array) {
            this.array = array;
        }

        public List<User> getList() {
            return list;
        }

        public void setList(List<User> list) {
            this.list = list;
        }

        public Map<Integer, String> getMap() {
            return map;
        }

        public void setMap(Map<Integer, String> map) {
            this.map = map;
        }
    }
         
       b. jsp

    <%@page contentType="text/html;charset=UTF-8" %>
    <%@taglib uri="webwork" prefix="ww" %>
    <html>
        <body>
            <h3>&lt;ww:iterator&gt;遍历数组</h3>
            <ww:iterator value="array">
                <ww:property value="top"/><br>
            </ww:iterator>
            <h3>&lt;ww:iterator&gt;遍历Collection</h3>
            <ww:iterator value="list">
                <ww:push value="top">
                    Name: <ww:property value="name"/>&nbsp;
                    Password: <ww:property value="password"/><br>   
                </ww:push>
            </ww:iterator>   
            <h3>&lt;ww:iterator&gt;遍历Map</h3>
            <ww:iterator value="map">
                <ww:property value="key"/>,
                <ww:property value="value"/><br>
            </ww:iterator>               
        </body>
    </html>

       c. 显示效果:

    <ww:iterator>遍历数组
    Monday
    Tuesday
    Wednesday
    Thursday

    <ww:iterator>遍历Collection
    Name: user0  Password: resu0
    Name: user1  Password: resu1
    Name: user2  Password: resu2
    Name: user3  Password: resu3
    Name: user4  Password: resu4
    Name: user5  Password: resu5
    Name: user6  Password: resu6
    Name: user7  Password: resu7
    Name: user8  Password: resu8
    Name: user9  Password: resu9

    <ww:iterator>遍历Map
    1, Tuesday
    2, Wednesday
    3, Thursday

       另通过status属性,在action context中生成一个IteratorStatus对象。该对象提供诸如集合大小、当前索引,以及当前遍
       历到的对象处于列表的单数索引位置还是双数索引位置等信息。如结合if/else标签,可实现奇数行和偶数行使用不同颜色
       阴影的表格。

    2. if/else标签:实现基本页面执行流及页面呈现。

       if/else 标签的属性
       ------------------------------------------------------------------------------------------------
       属性      数据类型       是否必需  描述
       ------------------------------------------------------------------------------------------------                
       test      Boolean        是        用于求值并返回true或false的布尔表达式
 
       刚才那个JSP我们再行改一下,使对Collection遍历的内容,一行红色,一行黑色相间隔:

        <h3>&lt;ww:iterator&gt;遍历Collection</h3>
        <ww:iterator value="list" status="status">
            <ww:if test="#status.even">
                <ww:set name="color" value="'black'"/>
            </ww:if>
            <ww:else>
                <ww:set name="color" value="'red'"/>           
            </ww:else>
            <font color="<ww:property value="color"/>">
            <ww:push value="top">
                Name: <ww:property value="name"/>&nbsp;
                Password: <ww:property value="password"/><br>   
            </ww:push>
            </font>
        </ww:iterator>   

三. 杂项标签
 
    1. include标签:功能与<jsp:include>类似,但提供了与WebWork更好的集成。

       include 标签的属性
       ------------------------------------------------------------------------------------------------
       属性      数据类型       是否必需  描述
       ------------------------------------------------------------------------------------------------                
       value     String         是        页面名称,action, servlet或任何引用的URL

       . 更好的WebWork集成:可利用值栈对使用%{...}符号的内容进行求值;
       . 对用户友好:       不管路径是绝对还是相对,最后均会重写为绝对的URL路径;

    2. URL标签:生成相对或绝对路径的URL,处理参数以及对URL进行编码。

       URL 标签的属性
       ------------------------------------------------------------------------------------------------
       属性            数据类型       是否必需  描述
       ------------------------------------------------------------------------------------------------   
       value           String         否        基本的URL。默认值为生成当前页面的URL
       includeParams   String         否        从all,get或none中选择参数,默认值为get
       id              String         否        如果指定了该属性,那么URL将不会输出,而是会保存于
                                                action context, 以作后用
       includeContext  Boolean        否        如果为true,那么生成的URL前面会加上应用程序所在的上下
                                                文路径。默认值为false;
       encode          Boolean        否        如果访问者没有启用cookie,则在URL中增加session ID.
       scheme          String         否        让你可以指定协议,默认为当前的设置(HTTP或HTTPS)

       举例:

       a. 生成search.action?query=XXX, 其中XXX为表达式求值后的具体数值;

          <ww:url value="search.action">
               <ww:param name="query" value="name"/>
          </ww:url>

       b. 包含当前页面的所有查询字符串

          includeParams属性设置为get, WebWork包含当前页面的所有查询字符串。
                               为none, 不包含任何参数。
                               为all, 所有参数都可以用不着URL的生成,包括通过POST请求提交的参数。

       c. 在URL前加上程序所在上下文

          只有设定includeContext值为true,且URL为绝对路径情况下才会加上程序所在上下文。

    3. text标签:显示特定语言的文本

       text 标签的属性
       ------------------------------------------------------------------------------------------------
       属性            数据类型       是否必需  描述
       ------------------------------------------------------------------------------------------------   
       name            String         是        用于在ResourceBundle中进行查找的键
       id              String         否        如果设置该属性,文本内容将会存储在action context中,
                                                那么通过属性值的名称可以进行引用
       value0          Object         否        参数1(deprecated)
       value1          Object         否        参数2(deprecated)
       value2          Object         否        参数3(deprecated)
       value3          Object         否        参数4(deprecated)

       示例:

       如searchResults键对应的英文文本如下: We searched {0} items in your database and found {1} matches. 那么可
       通过以下内容进行获取内容:

       <ww:text name="searchResults">
           <ww:param value="totalItems"/>
           <ww:param value="searchCount"/>
       </ww:text>

       那么第一个param的值对应参数{0},第二个param的值对应参数{1}。

    4. i18n标签:将某个资源包的内容压入栈中,让你可以在标签内部访问与资源包相关的i18n的资源

       i18n 标签的属性
       ------------------------------------------------------------------------------------------------
       属性            数据类型       是否必需  描述
       ------------------------------------------------------------------------------------------------          
       name            String         是        资源(resource boundle)的名称

       示例:

       <ww:i18n name="org.hibernate.auction.myBundle">
           <ww:text name="someKey"/>
       </ww:i18n>

       代码将从myBundle这个资源包中查找someKey对应的文本,而不是默认的资源包。

    5. param标签:辅助其他标签,实现参数内容传递;

       param 标签的属性
       ------------------------------------------------------------------------------------------------
       属性            数据类型       是否必需  描述
       ------------------------------------------------------------------------------------------------          
       name            String         否        应用于像URL或者action这样的父标签的参数名称
       value           Object         否        一个OGNL表达式,结果为被应用的值

       . 除了text标签外,其他标签使用参数的时侯都依照键/值对的形式;
       . 使用标签内容的内容进行设置,这种途径并不能为value属性赋值一个OGNL的表达式,只会被作为一个String
         的参数值;

         <ww:text name="searchResults">
             <ww:param>over 5 million</ww:param>
             <ww:param value="searchCount"/>
         </ww:text>
   发表时间:2007-09-27  
怎么发帖内容里的html代码均不见了?
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics