在JSP中使用strus2的标签,必须要引入标签声明:
<%@ taglib uri="/struts-tags" prefix="s" %>
首先是Action类的代码:有两个属性,可以接收参数
package com.bjsxt.struts2.tags;
import com.opensymphony.xwork2.ActionSupport;
public class TagsAction extends ActionSupport {
private String password;
private String username;
public TagsAction() {
}
public String execute() {
this.addFieldError("fielderror.test", "wrong!");
return SUCCESS;
}
public String getPassword() {
return password;
}
public String getUsername() {
return username;
}
public void setPassword(String password) {
this.password = password;
}
public void setUsername(String username) {
this.username = username;
}
}
-
通用标签
1.property标签:用来输出指定值,取值栈中的对象可以直接通过OGNL表达式,要是去actioncontext中的对象用#号。参数如下:
<li>property: <s:property value="username"/> </li>
<li>property 取值为字符串: <s:property value="'username'"/> </li>
<li>property 设定默认值: <s:property value="admin" default="管理员"/> </li>
<li>property 设定HTML: <s:property value="'<hr/>'" escape="false"/> </li>
第一个"uesrname"是取的值栈中username的对象,因为在property标签中,value属性是一个Object对象,所以struts2会认为是对象,那么要取字符串用第二种双引号+单引号取到字符串
2.set标签 :用于将某个值放入指定的范围,参数如下:
id和name都已经废弃,用var代替,定义变量,用来引用值栈中对象,就是context中的名字,scope指定范围,默认范围是action也就是在actioncontext和request放入值,value是var变量的值,value对象在文档中式String,其实是Object对象
<li>set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName" value="username" /></li>
<li>set 从request取值: <s:property value="#request.adminName" /></li>
<li>set 从ActionContext取值: <s:property value="#adminName" /></li>
<s:debug></s:debug>
第一个:我们用<s:set var="username" value="uesrname"/>定义一个username变量,那么value的值是OGNL表达式还是字符串呢?查文档我们发现是字符串,但是实验结果是表明是对象,当不使用scope参数指定变量添加的范围,默认加到request和actioncontext中:我们传入username=u,从request和actioncontext中都取到了,而且值是u而不是username,说明value=“username”是OGNL表达式而不是字符串
用set设定指定范围再从指定范围取出:
<li>set 设定var,范围为ActionContext: <s:set var="adminPassword" value="password" scope="session"/></li>
<li>set 使用#取值: <s:property value="#adminPassword"/> </li>
<li>set 从相应范围取值: <s:property value="#session.adminPassword"/> </li>
我们前面说了默认情况,范围是request和ActionContext,那现在设定范围是session,就只能在session中取到
3.Bean标签+param标签
遵循JavaBean规范化实例类对象,该标签体内可以包含多个param标签来设置bean的属性,参数如下:name要实例化类的名称,var,如果设置了var属性,bean实例将被放到栈的上下文中
首先我们有我们的java类,dog有一个属性name
public class Dog {
private String name;
public Dog() {
}
public Dog(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "dog: " + name;
}
}
通过bean标签实例化dog类
<li>bean 定义bean,并使用param来设定新的属性值:
<s:bean name="com.bjsxt.struts2.tags.Dog" >
<s:param name="name" value="'pp'"></s:param>
<s:property value="name"/>
<s:debug></s:debug>
</s:bean>
</li>
- 我们没有定义参数var,这个时候bean实例化的对象会放在值栈中,通过param标签给name传参,并通过property取出值栈的值,但是一定要在bean标签内部来操作,一旦bean执行完,就会把这个实例出来的对象从值栈中拿走
定义var参数:这个时候实例化出来的对象就以名字为myDog放到ActionContext中,用param标签设置,用property标签加#取出值
<s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog">
<s:param name="name" value="'oudy'"></s:param>
</s:bean>
拿出值:
<s:property value="#myDog.name"/>
</li>
<s:debug></s:debug>
4.include标签:Include a servlet's output (result of servlet or a JSP page).对中文不友好,参数如下:只有一个value标签是String类型
<li>include _include1.html 包含静态英文文件
<s:include value="/_include1.html"></s:include>
</li>
<li>include _include2.html 包含静态中文文件
<s:include value="/_include2.html"></s:include>
</li>
<li>include _include1.html 包含静态英文文件,说明%用法
<s:set var="incPage" value="%{'/_include1.html'}" />
<s:include value="%{#incPage}"></s:include>
</li>
其中_include1.html内容是英文,_include2.html是中文,可以看到中文不显示,这个时候value是字符串
但是第三个,我们用set标签,定义一个变量value显然是一个object,这个时候需要用到%{#incPage},#incPage取到ActionContext的对象,如果不加%{},include标签value属性是String,Struts2会认为incPage是一个字符串,就去不到对象incPage并访问到该对象的内容_include1.html,加上Struts2就会认为是OGNL表达式
5.#,$,%用法
#:用来取ActionContext中的对象
$:可以用来传递参数,以及用在配置文件中
%:将文本解析为OGNL表达式,对于本来就是OGNL表达式不起作用
6.fielderror标签:输出指定错误信息(做简单的参数验证)
接受参数name,做验证,在Action类中处理如果name不是admin或者为空,我们添加FieldError信息
public String excute() {
if(name == null || !name.equals("admin")) {
this.addFieldError("name", "name is error");
this.addFieldError("name", "name is too long");
return ERROR;
}
return SUCCESS;
}
那么在jsp文件中我们通过fielderror标签存入到值栈中
<s:fielderror fieldName="name" theme="simple"/>
<br />
errors值
<s:property value="errors"/>
<br />
fieldErrors值
<s:property value="fieldErrors"/>
<s:debug></s:debug>
值栈中的内容如下:我们可以通过property标签来读取值栈中的内容,输出取错误信息,也可以通过fielderror来取
-
控制标签
7.if elseif else 标签:控制程序按提条件分支执行,if和elseif参数如下,test布尔类型,相当于条件决定后面该tag后面的内容是否执行。else没有参数。和java if-esle一样
<li>if elseif else:
age[0] = <s:property value="#parameters.age[0]" /> <br />
age=<s:property value="#parameters.age" /> <br />
<s:set var="age" value="#parameters.age[0]" />
<s:if test="#age < 0">wrong age!</s:if>
<s:elseif test="#parameters.age[0] < 20">too young!</s:elseif>
<s:else>yeah!</s:else><br />
<s:if test="#parameters.aaa == null">null</s:if>
<s:debug></s:debug>
</li>
第三行体现了set标签最常用的场景,就是修改变量名称
我们传入age参数,在ActionContext中有parameters对象,存放url传入进来的参数,age[0],说明age在parameters是一个数组类型的,因为我们不止可以传入一个age参数值,一定要加[ ]来取出你要的具体的值,不然会有问题
如图我们传入两个age参数,age输出所有的参数值,age[0]是第一个,然后我们用set标签将parameters.age[0]设置为age变量,且没有指定范围,那么parameters.age[0]就以age存入到ActionContext和request中,之后我们可以直接用#age来取得对象,然后根据条件test的真假显示标签中的内容。
最后一句判断parammeters中没有aaa对象,满足if的test条件,输出null。
7.iterator标签:用来遍历数组,集合An iterable value can be any of: java.util.Collection, java.util.Iterator。参数如下:
首先遍历集合
<li>遍历集合:<br />
<s:iterator value="{1, 2, 3}" >
<s:property/> |
</s:iterator>
</li>
<li>自定义变量:<br />
<s:iterator value="{'aaa', 'bbb', 'ccc'}" var="x">
<s:property value="#x.toUpperCase()"/> |
</s:iterator>
</li>
- value参数是我们要遍历的对象,是ognl表达式,在ognl表达式{}是自己创建成一个list(value参数说明后面有写),然后再iterator标签内部进行遍历,使用<s:property/> |循环输出值。
- 第二个我们自己定义变量,用value创建好新的list,用var给变量起名x。那么在iterator内部遍历的时候,x就是当前遍历的对象,可以通过x.进行操作。<s:property value="#x.toUpperCase()"/>
使用status参数
<li>使用status:<br />
<s:iterator value="{'aaa', 'bbb', 'ccc'}" status="status">
<s:property/> |
遍历过的元素总数:<s:property value="#status.count"/> |
遍历过的元素索引:<s:property value="#status.index"/> |
当前是偶数?:<s:property value="#status.even"/> |
当前是奇数?:<s:property value="#status.odd"/> |
是第一个元素吗?:<s:property value="#status.first"/> |
是最后一个元素吗?:<s:property value="#status.last"/>
<br />
</s:iterator>
status参数是迭代元素的索引,如果指定了status,每次的迭代数据都有IteratorStatus的实例,它有以下几个方法
int getCount()返回当前迭代了几个元素
int getIndex()返回当前元素索引
boolean isEven()当然的索引是否偶数
boolean isFirst()当前是否第一个元素
boolean isLast()
boolean isOdd()当前元素索引是否奇数
那么我们为status设定为status(名称),就可以用status.来调用他的方法
遍历map类型
用OGNL表达式创建一个map在{}前面加#就是map(不加#是list),{}里面的内容用键值对存储
然后用property标签的value=key或者value(map里的)来遍历map,同理也可以为iterator标签value创建map用var指定变量名称
<li>
<s:iterator value="#{1:'a', 2:'b', 3:'c'}" >
<s:property value="key"/> | <s:property value="value"/> <br />
</s:iterator>
</li>
<li>
<s:iterator value="#{1:'a', 2:'b', 3:'c'}" var="x">
<s:property value="#x.key"/> | <s:property value="#x.value"/> <br />
</s:iterator>
</li>
以上输出结果: