Struts2提供了一系列的标签,用于在页面视图中进行一些简单的逻辑运算,这样极大的方便了开发者的工作,下面就来大体的展示一下在Struts2中的控制标签和数据标签等一些非UI表单组件标签的运用:
一、控制标签:
1.条件判断标签:<s:if../>、<s:elseif../>、<s:else../>
<s:set name="age" value="29" /> <s:if test="#age>60" > 老年人 </s:if> <s:elseif test="#age>35"> 中年人 </s:elseif> <s:elseif test="#age>15"> 青年人 </s:elseif> <s:else> 少年 </s:else>
注意:在这里if中使用的是#age,因为set标签在Stack Context中定义了一个age属性,但由于Stack Context中只有访问根元素ValueStack中的属性时才不用加#号,访问其它的非根元素才加#;其中当系统创建了一个Action实例后,会将其保存到ValueStack中,故访问Action实例中的属性也不需加#;在StackContext中除了保放有ValueStack还保存了能访5个特殊的对象,它们分别是:
也就是说在OGNL表达式中访问它们时都必须加上前缀#。
2.迭代标签:<s:iterator../>
<table border="1" width="300"> <s:iterator value="{'C++入门经典', 'Java编程思想', 'Ajax权威指南', 'Ruby元编程', 'C#高级编程'}" var="book" status="it" > <tr <s:if test="#it.odd"> style="background-color:#bbbbbb" </s:if>> <td><s:property value="book" /> <br /></td> </tr> <s:if test="#it.last"> <tr <s:if test="#it.even"> style="background-color:#bbbbbb" </s:if>> <td> 共<s:property value="#it.count" />本书 </td> </tr> </s:if> </s:iterator> </table>
提示:其中当使用了status属性后除了使了上面的event、odd、count、last用于判断奇偶,个数和判断是否为最后一个方法外还可使用index用于得到迭代元素的索引。
运行结果如下:
3.分隔标签:<s:generator../>
<h3>在标签内部使用</h3> <table width="300" border="1"> <s:generator val="'C++入门经典 ,Java编程思想 , Ajax权威指南,Ruby元编程,C#高级编程'" separator="," > <s:iterator status="bs"> <tr <s:if test="#bs.odd">style="background-color:#bbb"</s:if>> <td><s:property /></td> </tr> </s:iterator> </s:generator> </table> <br /> <br /> <h3>在标签外部使用</h3> <s:generator val="'C++入门经典 ,Java编程思想 , Ajax权威指南,Ruby元编程,C#高级编程'" separator="," var="books"> </s:generator> <table border="1" width="300"> <s:iterator value="#books" status="bs"> <tr <s:if test="#bs.odd">style="background-color:#bbb"</s:if>> <td><s:property /></td> </tr> </s:iterator> </table>使用generator标签时,sparator属性是必须的。除了这些属性处还有可选属性count,它用于指定集合元素的总数;可选元素converter用于指定转换器。
运行结果如下:
4.集合合并标签:<s:append../>和<s:marge../>
<s:append var="books1"> <s:param value="#{'C++入门经典':'清华出版社','Java编程思想':'清华出版社'}"/> <s:param value="#{'Ajax权威指南','Ruby元编程','C#高级编程'}" /> </s:append> <s:merge var="books2"> <s:param value="#{'C++入门经典','Java编程思想'}"/> <s:param value="#{'Ajax权威指南':'电子出版社', 'Ruby元编程':'电子出版社','C#高级编程':'清华出版社'}" /> </s:merge> <h3>append标签合并的结果</h3> <s:iterator value="books1"> <s:property value="key" />| <s:property value="value" /><br /> </s:iterator> <br /> <h3>merge标签合并结果</h3> <s:iterator value="books2"> <s:property value="key" />| <s:property value="value" /><br /> </s:iterator>
5.取子集合标签:<s:subset../>
由于subset中存在一个可选decider属性:用于添加一个实现org.apache.struts2.util.SubsetIteratorFilter.Decider过滤类,所以我们事先要准备一个自定义Decider类,如下:
package org.websoft.bean; import org.apache.struts2.util.SubsetIteratorFilter; public class MyDecider implements SubsetIteratorFilter.Decider { @Override public boolean decide(Object element) throws Exception { String value = (String)element; return value.contains("编程"); } }
接下来使用subset标签如下:
<s:bean var="myDecider" name="org.websoft.bean.MyDecider" /> <s:subset source="{'C++入门经典', 'Java编程思想', 'Ajax权威指南', 'Ruby元编程', 'C#高级编程'}" start="2" decider="#myDecider" var="newList"> </s:subset> <%//注意这里由于使用的是subset的var属性,故使用了attr对象来获取 %> <s:iterator value="#attr.newList"> <s:property /><br /> </s:iterator>应该特别注意的是在这里获取子集合时使用的是attr对象,单纯使用#newList可能得不到值,因为subset的var属性是将新集合放入pageScope内,并不是StackContext中,同其它标签不同。
6.排序标签:<s:sort../>
由于在使用sort时它存在一个必填属性comparator:它于用指定定义排序规则的java.util.Comparator实例,故首先定义一个Comparator类如下:
package org.websoft.bean; import java.util.Comparator; @SuppressWarnings("unchecked") public class MyComparator implements Comparator { @Override public int compare(Object value1, Object value2) { return value1.toString().length() - value2.toString().length(); } }
<s:bean var="myDecider" name="org.websoft.bean.MyDecider" /> <s:subset source="{'C++入门经典', 'Java编程思想', 'Ajax权威指南', 'Ruby元编程', 'C#高级编程'}" start="2" decider="#myDecider" var="newList"> </s:subset> <%//注意这里由于使用的是subset的var属性,故使用了attr对象来获取 %> <s:iterator value="#attr.newList"> <s:property /><br /> </s:iterator>
其上运行结果如下:
二、数据标签
摘录:李刚--《轻量级J2EE企业应用实战---Struts2+Spring3+Hibernate整合开发》第3版
1.action标签
功能:允许在JSP页面中直接调用Action
属性:
2.bean标签
功能:创建JavaBean实例
属性:
3.date标签
功能:用于格式化一个时间
属性:
注意,如果指定nice="ture"后再同时指定format属性,则format将失效,即输出时差。
4.debug标签
功能:用于查看ValueStack和StackContext中所有的值信息。
在页面中直接使用<s:debug />
5.include标签
功能:用于将JSP页面,或者一个Service包含到本地页面中。
属性:
6.param标签
功能:为其它标签提供参数。
属性:
7.push标签
功能:将某个值放到ValueStack的栈顶。
属性:
注意,被push标签放入ValueStack中的对象只在push标签内时才有效,一旦离开push标签,则刚放入的属性将被移出ValueStack。
8.set标签
功能:用于将某值放入指定范围内。
属性:
9.url标签
功能:生成一个URL地址。
属性:
10.property标签
功能:输出指定值,property标签输入出value属性指定的值。
属性: