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个特殊的对象,它们分别是:
- parametes对象:用于访问HTTP请求参数;调用的是HttpServletRequest的getParameter()方法。
- request对象:用于访问HttpServletRequest对象;调用的是它的getAttribute()方法。
- session对象:用于访问HttpSession对象;调用它的getAttribute()方法。
- application对象:用于访问ServletContext对象;同样调于它的getAttribute()方法。
- attr对象:用于依次搜索PageContext、HttpServletRequest、HttpSession、ServletContext中的属性。
也就是说在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>
这两个标签用法基本相同,同时支持List与List之间的合并,Map与Map之间的合并和Map与List之间的合并,它前主要的区别是合并后排列的顺利不同,如下的运行结果:
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中,同其它标签不同。
其中的start属性用于指定从第三个元素开始选取包含"编程"字样的元素,除了这些属性,还有count用于指定选取个数的属性,则上面的运行结果如下:
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();
}
}
接着在页面上使用sort标签调用:
<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对象获取。
其上运行结果如下:
二、数据标签
摘录:李刚--《轻量级J2EE企业应用实战---Struts2+Spring3+Hibernate整合开发》第3版
1.action标签
功能:允许在JSP页面中直接调用Action
属性:
- var 可选,将该action放入ValueStack中
- name 必填,指定Action的名称
- namespace 可选,Action所在namespace命名空间
- executeResult 可选,是否包含Action的执行结果到当前页面,默认为false,即不含。
- ignoreContextParams 可选,指定该页面的请求参数是否需要传入调用的Action,默认为true,表传入。
2.bean标签
功能:创建JavaBean实例
属性:
- name 必填,要实例化JavaBean的类全名。
- var 可选, 指定实例化后的JavaBean实例名。
3.date标签
功能:用于格式化一个时间
属性:
- format 可选,指定时间格式。
- nice 可选,是否输出指定日期与当前时刻之间的时差。默认为false
- name 必填,要格式化的日期。
- var 可选,将格式化的字符串放入StackContext。
注意,如果指定nice="ture"后再同时指定format属性,则format将失效,即输出时差。
4.debug标签
功能:用于查看ValueStack和StackContext中所有的值信息。
在页面中直接使用<s:debug />
5.include标签
功能:用于将JSP页面,或者一个Service包含到本地页面中。
属性:
- value 必填,指定包含的JSP页面或Servlet。
6.param标签
功能:为其它标签提供参数。
属性:
- name 可选,设置参数名。
- value 可选,指定参数值。
7.push标签
功能:将某个值放到ValueStack的栈顶。
属性:
- value 必填,指定将推入栈顶的属性。
注意,被push标签放入ValueStack中的对象只在push标签内时才有效,一旦离开push标签,则刚放入的属性将被移出ValueStack。
8.set标签
功能:用于将某值放入指定范围内。
属性:
- scope 可选,指定范围,有application,session,request,page或action 5个值,默认为action。
- value 可选,指定的变量值。
- var 可选,指定后的变量名。
9.url标签
功能:生成一个URL地址。
属性:
- action 可选,指定生成URL为哪 个action,如果不提供则使用value属性。
- anchor 可选,指定URL锚点。
- encode 可选,指定是否需要对参数进行编码,默认为true。
- ecapeAmp 可选,是否需对&编码,默认为true。
- forceAddSchemeHostAndPort 可选,强调添加scheme、主机和端口号,默认false。
- includeContext 可选,指定是否添加上下文到URL中。
- includeParams 可选,指定是否包含请求参数,该参数只能为none、get、all。默认为get。
- method 可选,指定Action的方法。如果指定了action属性。则将URL链接到指定Action的特点方法。
- namespace 可选,Action的命名空间。
- portletMode 可选,指定结果页面的portlet模式。
- scheme 可选,用于设置scheme属性。
- value 可选,指定生成URL的地址值,如果value值不提供就用action值属性指定。
- var 可选,用于指定就该属性放入ValueStack中。
- windowState 可选,指定结果页面的portlet的窗口状态。
10.property标签
功能:输出指定值,property标签输入出value属性指定的值。
属性:
- default 可选,如果需要输出的值为null,则显示default属性指定的值。
- escape 可选,指定是否escapeHTML代码,默认为true。
- value 可选,指定需要输出的值,如果没有指定value属性,则默认输出ValueStack栈顶值。