WebWork 2 : 非UI类标签
This page last changed on Dec 14, 2004 by plightbo.
通用标签<ww:param />允许为支持增加参数的标签设置参数.
你可以将param标签放置在支持参数标签的内部, param标签把参数加入到它的父标签. 如果value没有给定, 它将使用正文内容(body)作为value值. 在下面的例子中, 每一个param标签都把参数加到Counter上. 这意味着param将调用Counter对应的setter方法. <ww:bean name="'webwork.util.Counter'" id="year"> <ww:param name="'first'" value="text('firstBirthYear')"/> <ww:param name="'last'" value="2000"/> <ui:combobox label="'Birth year'" size="6" maxlength="4" name="'birthYear'" list="#year"/> </ww:bean> <ww:property />property标签从值栈中提取值并显示.
下面的例子描述它的不同用法: Print getX().getY()
<ww:property value="x.y"/>
缺生情况下将对HTML字符进行转码, 然而如果property标签的内容包含在正文(body)中时, 将不进行转码. 显示使用escape属性将覆盖缺省行为. 引用的文字在转码时, 其外面的引号(quote)将被去掉. 还要注意如果property标签的正文为空时(has an empty body), 它的行为与没有正文时一样.<ww:push />利用ww:push, 你可以将对象压入值栈的顶部.
与ww:set(见下文)标签的功能类似, 因此在决定使用前应当都看一下. <ww:push value="counter"> <ww:property value="count"/> </ww:push> 要将一个活动放入值栈中可以使用下面的代码: <ww:action name="'SomeAction'" id="sa"/> <ww:push value="#sa"> foo = <ww:property value="foo"/> </ww:push> <ww:set />使用ww:set标签, 你可以在JSP中创建一个自己命名变量. 可以使用#variableName的形式引用该变量.
将值栈中对象的值设置到指定的scope中. 如果值未给定, 将使用栈顶值. 如果scope未指定, 缺省的scope是活动上下文, 如果该请求并未执行任何活动, 将使用PageContext. 组合化标签<ww:action />Action标签提供另一种调用活动的方法. 这是除了调用一个URL之外的另一个办法; 即 - *.action会被发送到ServletDispatcher.
如果指定了id属性, 被执行的活动就可以使用"#id"在活动上下文中引用. 本例中, 活动ClientInfo将被执行, 它的方法将被用于获取信息并执行条件检查.<ww:action name="'ClientInfo'" id="cinfo"> <ww:param name="detailedMode" value="false"/> </ww:action> Browser:<ww:property value="#cinfo.browser"/><br> Version:<ww:property value="#cinfo.version"/><br> Supports GIF:<ww:if test="#cinfo.supportsType('image/gif') == true">Yes</ww:if> <ww:else>No</ww:else><br> <ww:bean />创建一个JavaBean并初始化它的属性, 并将它放入ActionContext.
本例中, Counter被用作bean. 我们可以调用需要的方法. 本例中,我们调用setFirst()将出生年设置为1975并调用setLast()将它设置为2000. 然后将Counter作为一个迭代器显示一个组合框(combo box). <ww:bean name="'webwork.util.Counter'" id="year"> <ww:param name="'first'" value="text('firstBirthYear')"/> <ww:param name="'last'" value="2000"/> <ui:combobox label="'Birth year'" size="6" maxlength="4" name="'birthYear'" list="#year"/> </ww:bean> <ww:include />用于包含另一个页面或活动.
本例中, beaninfo.jsp引入了一个Person对象people[0]. 看一下beaninfo.jsp的例子并注意它是如何利用".."从值栈中取出父页面的值. <ww:property value="people[0]"> <ww:include value="'beaninfo.jsp'"/> </ww:property> <h1>RSS viewer</h1>
<ww:include value="'rss.viewer.action'"/>
流程控制标签返回<ww:if />根据条件决定语句是否执行.
本例中, 如果测试条件为true将执行标签内容(body). elseIf标签和else标签将不被执行. <ww:if test="true == true"> <b>if: Success</b> </ww:if> <ww:elseIf test="true == true"> <b>elseIf: Failure</b> </ww:elseIf> <ww:else> <b>else: Failure</b> </ww:else> <ww:elseif />当前一个测试失败后用于决定语句是否执行.
本例中, 由于elseIf标签的条件为true而if标签的条件为false, 因此将执行其内容(body). <ww:if test="true == false"> <b>if: Failures</b> </ww:if> <ww:elseIf test="true == true"> <b>elseIf: Success</b> </ww:elseIf> <ww:else> <b>else: Failure</b> </ww:else> <ww:else />如果前一个测试为false时执行.
本例中, 由于if标签和elseIf标签的条件均为false, else标签将执行其内容(body). <ww:if test="true == false"> <b>if: Failures</b> </ww:if> <ww:elseIf test="true == false"> <b>elseIf: Failure</b> </ww:elseIf> <ww:else> <b>else: Success</b> </ww:else> 迭代标签返回<ww:iterator />Iterator标签将在一个集合之上进行迭代. 可迭代的值可以是下列之一: java.util.Collection, java.util.Iterator, java.util.Enumeration, java.util.Map, 数组, XML节点 或XML的NodeList.
本例中, iterator标签将在Counter上进行迭代. property标签将输出从1到10的迭代值. <ww:bean name="'webwork.util.Counter'"> <ww:param name="'last'" value="10"/> <ww:iterator> <ww:property/><br /> </ww:iterator> </ww:bean> 本例中, 我们使用一对IteratorStatus以查看迭代中的位置. <h1>Testing iterator status</h1> <ww:bean name="'webwork.util.Counter'" id="rowcounter"> <ww:param name="'first'" value="0"/> <ww:param name="'last'" value="5"/> </ww:bean> <table border="1"> <ww:iterator value="#rowcounter" status="rowstatus"> <tr> <ww:bean name="'webwork.util.Counter'" id="colcounter"> <ww:param name="'first'" value="0"/> <ww:param name="'last'" value="5"/> </ww:bean> <ww:iterator value="#colcounter" status="colstatus"> <!-- if it is (first row) or (first column) or (last row) then output the column number. --> <ww:if test="#rowstatus.first==true || #colstatus.first==true || #rowstatus.last==true"> <th><ww:property value="#colstatus.count"/></th> </ww:if> <ww:else> <td><ww:property/></td> </ww:else> </ww:iterator> </tr> </ww:iterator> </table> 这里我们利用IteratorStatus完成隔行加入一个额外的换行. 这在绘制隔行不同的底色的HTML表格时十分有用. 奇数和偶数属性据可使用. <ww:iterator status="status"> <ww:if test="#status.odd == true"> <br /> </ww:if> <br /> </ww:iterator> Here we use the IteratorStatus determine every fourth row to insert an extra line break. <ww:iterator status="status"> <ww:if test="#status.modulus(4) == 0"> <br /> </ww:if> <br /> </ww:iterator> 下面列出IteratorStatus对象可用的操作:
<ww:generator />使用给定值生成迭代器(Iterator).
本例中创建了两个迭代器. 一个是val="'foo,bar,xyzzy'" 另一个是val="' '". <h1>Testing append, subset, and value generators</h1> <table border="1"> <ww:bean name="'webwork.util.Counter'"> <ww:param name="'last'" value="5"/> <ww:iterator id="colcount"> <tr> <!-- Generator will create an Iterator that has 5 items. The first 3 are "foo,bar,xyzzy". Item 4 and 5 will be foo and bar respectively. If the count is more than the items, you start over. --> <ww:generator val="'foo,bar,xyzzy'" separator="','" count="#colcount" id="values"/> <!-- Generator will create an Iterator that has infinite . Count=-1 means indefinite. --> <ww:generator val="' '" count="-1" id="space"/> <ww:append> <ww:param name="'source'" value="#values"/> <ww:param name="'source'" value="#space"/> <ww:subset count="6"> <ww:iterator> <td width="40"><ww:property/></td> </ww:iterator> </iterator:subset> </iterator:append> </tr> </ww:iterator> </ww:bean> </table> 该标签目前是多余的, 可以使用OGNL来完成: <ww:iterator value="{1, 2, 3, 4}">
</ww:iterator>
<ww:append />Append标签用于添加一个迭代器列表. 迭代的值将被添加在一起并作为一个迭代器使用. 该迭代器的输出顺序与添加顺序一致.
本例中, 添加了两个迭代器#values和#spaces. 这意味着#spaces的值在#values之后. <h1>Testing append, subset, and value generators</h1> <table border="1"> <ww:bean name="'webwork.util.Counter'"> <ww:param name="'last'" value="5"/> <ww:iterator id="colcount"> <tr> <ww:generator val="'foo,bar,xyzzy'" separator="','" count="#colcount" id="values"/> <ww:generator val="' '" count="-1" id="space"/> <ww:append> <ww:param name="'source'" value="#values"/> <ww:param name="'source'" value="#space"/> <ww:subset count="6"> <ww:iterator> <td width="40"><ww:property/></td> </ww:iterator> </iterator:subset> </iterator:append> </tr> </ww:iterator> </ww:bean> </table> <ww:subset />Subset标签仅迭代source的一部分. 它从起点开始并进行count指定的迭代次数. 如果你想迭代到最后, 可以将count设置为-1. 如果不提供source属性, 将使用值栈的当前对象- ".".
本例中, subset标签将对值栈中当前对象的6个元素进行迭代. <h1>Testing append, subset, and value generators</h1> <table border="1"> <ww:bean name="'webwork.util.Counter'"> <ww:param name="'last'" value="5"/> <ww:iterator id="colcount"> <tr> <ww:generator val="'foo,bar,xyzzy'" separator="','" count="#colcount" id="values"/> <ww:generator val="' '" count="-1" id="space"/> <ww:append> <ww:param name="'source'" value="#values"/> <ww:param name="'source'" value="#space"/> <ww:subset count="6"> <ww:iterator> <td width="40"><ww:property/></td> </ww:iterator> </iterator:subset> </iterator:append> </tr> </ww:iterator> </ww:bean> </table> <ww:merge />将几个迭代器合并为一个. 该标签将这些迭代器交织在一起. If one iterator runs out, it will drop off and the others will continue weaving until there are no more values.
本例中, #foo, #bar, and #xyzzy被合并在一起. 因此, 输出顺序是foo, bar, xyzzy until #foo #xyzzy iterators run out in which case #bar will finish. Three value generators with merge and subset limits:<br> <ww:generator val="'foo'" count="5" id="foo"/> <ww:generator val="'bar'" count="10" id="bar"/> <ww:generator val="'xyzzy'" count="5" id="xyzzy"/> <ww:merge> <ww:param name="'source'" value="#foo"/> <ww:param name="'source'" value="#bar"/> <ww:param name="'source'" value="#xyzzy"/> <ww:subset count="30"> <ww:iterator status="status"> <ww:property value="#status.count"/>:<ww:property/><br> </ww:iterator> </iterator:subset> </iterator:merge> <ww:sort />Sort可以对一个迭代器进行排序. 它使用你提供的比较器(Comparator)进行比较, 使用Collections.sort()方法进行排序.
本例进行升序排序. <ww:bean name="'webwork.util.Counter'" id="counter"> <ww:param name="'first'" value="0"/> <ww:param name="'last'" value="5"/> </ww:bean> <ww:bean name="'webwork.util.Sorter'" id="sorter"/> Ascending:<br /> <ww:sort source="#counter" comparator="#sorter.ascending"> <ww:iterator> <ww:property/><br /> </ww:iterator> </iterator:sort> 本例进行降序排序. <ww:bean name="'webwork.util.Sorter'" id="sorter"/> <ww:bean name="'webwork.util.Counter'" id="counter"> <ww:param name="'first'" value="0"/> <ww:param name="'last'" value="5"/> </ww:bean> Descending:<br> <ww:sort source="#counter" comparator="#sorter.descending"> <ww:iterator> <ww:property/><br> </ww:iterator> </iterator:sort> 本例进行字符串升序排序. <ww:bean name="'webwork.util.Sorter'" id="sorter"/> Sorting strings:<br> <ww:generator val="'Rickard,Maurice,Hristo'" separator="','" id="names"/> <ww:sort source="#names" comparator="#sorter.ascending"> <ww:iterator> <ww:property/><br> </ww:iterator> </iterator:sort> 注意Id 属性"id"为元素指定名字. 该名称在整个文档中必须是唯一的. 该属性是由TagSupport提供的, 因此永远是一个字符串. 不需要像其他WebWork标签那样使用字符串文法(string literal); 也就是说 - id="'age'". 你可以直接使用id="age". 必需注意的是所有将某些值保存在值栈的标签(如i18n或bean)都将在标签结束时从值栈中将它们删除. 因此, 如果你用bean标签实例化一个bean(<ww:bean name="'br.univap.fcc.sgpw.util.FormattersHelper'">), 该bean仅在</ww:bean>标签之前才能在值栈中访问. |
Document generated by Confluence on Dec 14, 2004 16:36 |