Struts2学习(八)----------标签

在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>

以上输出结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值