数据标签
1 property标签
property标签的主要属性:
value:用来获取值的OGNL表达式,如果value属性值没有指定,那么将会被设定为top,也就是返回位于值栈最顶端的对象。
default:如果按照value属性指定的OGNL求值后返回的是空值,但是你仍然希望输出某些内容,那么就可以使用default属性来指定这些内容
escape:是否转义HTML,默认为true
escapeJavaScript:是否转义JavaScript,默认为false
eg:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
request.setAttribute("request","请求的属性值");
%>
输出value值: <s:property value="#request['request']"/>
<br>
输出缺省值: <s:property value="#request['request2']" default="缺省值"/>
<br>
输出栈顶的对象: <s:property/>
eg:
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:property value="'<hr>'"/>
<s:property value="'<hr>'" escape="false"/>
注意
1 <s:property value="'<hr>'"/>中的value里面的值为'<hr>',这对单引号的意思是,
单引号里面的东西不按照OGNL表达式来解析,可以直接看成一个字符串。
2 你会发现,转义的那个输出变成了“<hr>”,不转义的那个是直接输出成“<hr>”,
其实转义,就是把HTML中的一些特殊字符用已经定义好的实体进行替换的过程,常见的HTML转移字符如下列表:
2 set标签
1:功能:
对设置的表达式进行求值,并将结果赋给特定作用域中的某个变量。
简单点说,set标签类似于定义一个变量,并赋值。
set标签有很多应用的地方,比如一个对象在OGNL上的访问层次较深,就可以使用set标签给它定义成一个变量,这样就可以保证在多次引用它的时候更方便。
2:属性
set标签的主要属性:
id:已过时,请用var代替。
name:已过时,请用var代替。
var:变量名,可以在OGNL表达式中使用这个名称来引用存放到值栈的这个对象。
scope:变量的生存周期,可以选择application、session、request、page或action,默认为action。
value:设置给变量的值,可以是常量,也可以是OGNL表达式
eg1
属性var和value的使用
假如现在Session中有一个叫user的属性,要访问它的name属性和age属性,不用set标签的话,写法如下:
<s:property value="#session.user.name"/>
<s:property value="#session.user.age"/>
如果使用了set标签,可以给Session中的user属性定义一个变量,名称为tempUser,这样在以后直接访问这个tempUser就可以了,
<s:set var="tempUser" value="#session.user"/>
<s:property value="#tempUser.name"/>
<s:property value="#tempUser.age"/>
请注意,使用tempUser这个变量名的时候,需要在前面加上#号
eg2
比如要在页面定义一个int型的变量,然后用标签来实现类似于i++的功能,该怎么实现呢?
%@ taglib prefix="s" uri="/struts-tags" %>
<s:set var="i" value="1"/>
输出i值:<s:property value="#i"/>
<br>
<s:set var="i" value="#i+1"/>
输出i++后的值:<s:property value="#i"/>
eg3
属性scope的使用
set标签的scope属性有如下选择:
application:表示这个变量的生存周期是Servlet中的Application范围,也就是ServletContext范围
session:表示这个变量的生存周期是会话范围
request:表示这个变量的生存周期是请求范围
page:表示这个变量的生存周期是当前页面范围
action:表示这个变量的生存周期是当前的ActionContext范围
简单的示范一下,在第一个页面中定义变量,当然要设置scope,示例如下:
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:set var="v1" scope="application" value="'aplication范围的值'"/>
<s:set var="v2" scope="session" value="'session范围的值'"/>
<s:set var="v3" scope="request" value="'request范围的值'"/>
<s:set var="v4" scope="page" value="'page范围的值'"/>
<s:set var="v5" scope="action" value="'action范围的值'"/>
运行后跳转到的结果页面,示例如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
输出aplication值:<s:property value="#application['v1']"/>
<br>
输出session值:<s:property value="#session['v2']"/>
<br>
输出request值:<s:property value="#request['v3']"/>
<br>
输出page值:<s:property value="#attr['v4']"/>
<br>
输出action值:<s:property value="#v5"/>
上述写法中,尤其要注意输出page的值,用的是“#attr”,而不是“#page”。
你会发现request、page、action三个范围内都没有值,为什么呢?
原因很简单,上面的示例是在上一个页面展示的时候设置的request值,当提交跳转到结果页面的时候,
这是另外一个request了,因此request里面没有值是正常的。
而page里面没有值就更好理解了,已经是不同的页面了,当然没有值了。
action范围里面没有值,是因为,Struts2会为每次请求创建不同的Action实例,请求不同,那么Action实例也就不同,自然action范围也就没有值了。
---------------------
push标签
1:功能:
用来将对象的引用压入值栈中。
这也是很有用的,比如:如果一个对象访问层次过深的时候,
可以用push标签来做访问的简化。其做法和set标签不同,push标签是把指定的对象放到值栈的栈顶,这样在访问这个对象的时候,就可以直接访问它了。
2:属性:
push标签的主要属性:
value:用来指定放到值栈栈顶的对象。
eg1
沿用前面的示例,假如Session中有一个叫user的属性,需要访问它的name属性和age属性。如果使用push标签的话,写法示例如下:
<s:push value="#session.user">
<s:property value="name"/>
<s:property value="age"/>
</s:push>
请和set标签的写法对比一下,这两个标签都常用在简化OGNL访问的时候,但是有区别的:
push标签的作用域是在自己标签范围内,两个<s:property/>都是它的子元素,而set标签的作用域是ActionContext,所以两个<s:property/>只要在它后面即可。
push标签内的<s:property/>直接引用这个对象的属性即可,而set标签后的<s:property/>还要属性名前加上set标签为对象取的变量名称。
很明显,当在需要设置多个数据的时候,push标签会更简单。
-----------------------------------------
bean与param标签
1:bean标签的功能:
用来创建JavaBean实例,并将其压入值栈中,可以添加param标签。
param标签的功能:
用来为其它标签添加参数化设置的功能,比如为bean标签初始化JavaBean的属性的值。
但是请注意一点:param标签主要用来配合其它标签来指定参数,并不是只能与bean标签连用。
2:属性:
bean标签的主要属性:
name:指定了要创建的JavaBean的全类名,必须要设置
var:引用这个JavaBean实例的名称,在bean标签创建JavaBean实例之后,将这个实例压入值栈中,其key值就是这个var指定的值。
param标签的主要属性:
name:参数的名称
value:参数的值
eg1
来示例一下,使用bean标签创建JavaBean,并使用param标签来为它的属性设置初始值。示例代码如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:bean name="cn.javass.user.UserModel" var="user">
<s:param name="age" value="100"/>
</s:bean>
<s:property value="#user.age"/>
以上的代码建立了一个叫user的JavaBean,并调用了setAge方法,赋值为100,然后把这个JavaBean实例压入到值栈中。
在后面的引用中的“#user.age”,引用的就是刚刚创建的user对象,并调用它的getAge方法。
-----------------------------------------------------
url与a标签
1:url标签的功能:
url标签用来生成一个url,但是它不显示在页面上,需要其他的标签引用它,
比如a标签。url标签可以包含param标签,通过param标签来设置url要传递的参数。
a标签的功能:
用来生成HTML的<a>标签,可以通过url标签来设置它的url,也可以使用param标签来设置a标签的url所需要的参数。
2:属性:
url标签的属性很多,主要的属性有:
namespace:要访问的Action所在的包的命名空间。
action:要访问的Action的名字。
method:访问execute方法以外的其他方法。
id:被放入值栈的名字,其他标签可以通过这个值来访问这个url标签所生成的url。如果指定这个属性,则url标签不会在页面上生成字符串。
includeContext:生成的URL中是否包含当前上下文。
a标签的属性也非常多,主要是与HTML对应,主要的属性有:
href:超链接的URL
a标签与url及其类似,a标签拥有url标签的所有属性,它们之间的不同在于a标签用来直接生成一个链接,而url标签是用来生成一个字符串。
a标签比url标签还多出来一些属性,比如onchange,这些属性都是用来生成对应的HTML的事件的。
eg1
分多种方式来使用url和a标签,来体会它们的使用。
(1)不设置id属性,示例如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:url action="ognlAction" namespace="/helloworld">
<s:param name="uuid" value="'01'"/>
</s:url>
这样做并不会在页面上生成一个链接,而是仅仅生成一个字符串并显示在界面上,
结果为: /helloworld/helloworld/ognlAction.action?uuid=01
其中的参数uuid=01正是url标签的子元素, param标签生成的。
(2)设置id属性,示例如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:url action="ognlAction" namespace="/helloworld" id="test">
<s:param name="uuid" value="'01'"/>
</s:url>
这样运行,再访问页面,发现是一片空白。因为设置了id属性,url标签把生成的url字符串放入值栈等待其他的标签引用。
(3)使用a标签来引用刚刚由url标签生成的url字符串,示例如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:url action="ognlAction" namespace="/helloworld" id="test">
<s:param name="uuid" value="'01'"/>
</s:url>
<s:a href="%{test}">超链接</s:a>
注意:a标签的href属性,是通过%{test}来引用值栈中的test的,这样才能正确的生成一个链接。
(4)单独使用a标签
把上边的url标签和a标签连用的示例,改成单独使用a标签,示例如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:a action="ognlAction" namespace="/helloworld">
<s:param name="uuid" value="'01'"/>
超链接
</s:a>
--------------------------------------
再强调一下
param标签,通过这一节的讲述可以发现,它和bean标签、url标签、a标签和include标签都可以连用,
1 property标签
property标签的主要属性:
value:用来获取值的OGNL表达式,如果value属性值没有指定,那么将会被设定为top,也就是返回位于值栈最顶端的对象。
default:如果按照value属性指定的OGNL求值后返回的是空值,但是你仍然希望输出某些内容,那么就可以使用default属性来指定这些内容
escape:是否转义HTML,默认为true
escapeJavaScript:是否转义JavaScript,默认为false
eg:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
request.setAttribute("request","请求的属性值");
%>
输出value值: <s:property value="#request['request']"/>
<br>
输出缺省值: <s:property value="#request['request2']" default="缺省值"/>
<br>
输出栈顶的对象: <s:property/>
eg:
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:property value="'<hr>'"/>
<s:property value="'<hr>'" escape="false"/>
注意
1 <s:property value="'<hr>'"/>中的value里面的值为'<hr>',这对单引号的意思是,
单引号里面的东西不按照OGNL表达式来解析,可以直接看成一个字符串。
2 你会发现,转义的那个输出变成了“<hr>”,不转义的那个是直接输出成“<hr>”,
其实转义,就是把HTML中的一些特殊字符用已经定义好的实体进行替换的过程,常见的HTML转移字符如下列表:
2 set标签
1:功能:
对设置的表达式进行求值,并将结果赋给特定作用域中的某个变量。
简单点说,set标签类似于定义一个变量,并赋值。
set标签有很多应用的地方,比如一个对象在OGNL上的访问层次较深,就可以使用set标签给它定义成一个变量,这样就可以保证在多次引用它的时候更方便。
2:属性
set标签的主要属性:
id:已过时,请用var代替。
name:已过时,请用var代替。
var:变量名,可以在OGNL表达式中使用这个名称来引用存放到值栈的这个对象。
scope:变量的生存周期,可以选择application、session、request、page或action,默认为action。
value:设置给变量的值,可以是常量,也可以是OGNL表达式
eg1
属性var和value的使用
假如现在Session中有一个叫user的属性,要访问它的name属性和age属性,不用set标签的话,写法如下:
<s:property value="#session.user.name"/>
<s:property value="#session.user.age"/>
如果使用了set标签,可以给Session中的user属性定义一个变量,名称为tempUser,这样在以后直接访问这个tempUser就可以了,
<s:set var="tempUser" value="#session.user"/>
<s:property value="#tempUser.name"/>
<s:property value="#tempUser.age"/>
请注意,使用tempUser这个变量名的时候,需要在前面加上#号
eg2
比如要在页面定义一个int型的变量,然后用标签来实现类似于i++的功能,该怎么实现呢?
%@ taglib prefix="s" uri="/struts-tags" %>
<s:set var="i" value="1"/>
输出i值:<s:property value="#i"/>
<br>
<s:set var="i" value="#i+1"/>
输出i++后的值:<s:property value="#i"/>
eg3
属性scope的使用
set标签的scope属性有如下选择:
application:表示这个变量的生存周期是Servlet中的Application范围,也就是ServletContext范围
session:表示这个变量的生存周期是会话范围
request:表示这个变量的生存周期是请求范围
page:表示这个变量的生存周期是当前页面范围
action:表示这个变量的生存周期是当前的ActionContext范围
简单的示范一下,在第一个页面中定义变量,当然要设置scope,示例如下:
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:set var="v1" scope="application" value="'aplication范围的值'"/>
<s:set var="v2" scope="session" value="'session范围的值'"/>
<s:set var="v3" scope="request" value="'request范围的值'"/>
<s:set var="v4" scope="page" value="'page范围的值'"/>
<s:set var="v5" scope="action" value="'action范围的值'"/>
运行后跳转到的结果页面,示例如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
输出aplication值:<s:property value="#application['v1']"/>
<br>
输出session值:<s:property value="#session['v2']"/>
<br>
输出request值:<s:property value="#request['v3']"/>
<br>
输出page值:<s:property value="#attr['v4']"/>
<br>
输出action值:<s:property value="#v5"/>
上述写法中,尤其要注意输出page的值,用的是“#attr”,而不是“#page”。
你会发现request、page、action三个范围内都没有值,为什么呢?
原因很简单,上面的示例是在上一个页面展示的时候设置的request值,当提交跳转到结果页面的时候,
这是另外一个request了,因此request里面没有值是正常的。
而page里面没有值就更好理解了,已经是不同的页面了,当然没有值了。
action范围里面没有值,是因为,Struts2会为每次请求创建不同的Action实例,请求不同,那么Action实例也就不同,自然action范围也就没有值了。
---------------------
push标签
1:功能:
用来将对象的引用压入值栈中。
这也是很有用的,比如:如果一个对象访问层次过深的时候,
可以用push标签来做访问的简化。其做法和set标签不同,push标签是把指定的对象放到值栈的栈顶,这样在访问这个对象的时候,就可以直接访问它了。
2:属性:
push标签的主要属性:
value:用来指定放到值栈栈顶的对象。
eg1
沿用前面的示例,假如Session中有一个叫user的属性,需要访问它的name属性和age属性。如果使用push标签的话,写法示例如下:
<s:push value="#session.user">
<s:property value="name"/>
<s:property value="age"/>
</s:push>
请和set标签的写法对比一下,这两个标签都常用在简化OGNL访问的时候,但是有区别的:
push标签的作用域是在自己标签范围内,两个<s:property/>都是它的子元素,而set标签的作用域是ActionContext,所以两个<s:property/>只要在它后面即可。
push标签内的<s:property/>直接引用这个对象的属性即可,而set标签后的<s:property/>还要属性名前加上set标签为对象取的变量名称。
很明显,当在需要设置多个数据的时候,push标签会更简单。
-----------------------------------------
bean与param标签
1:bean标签的功能:
用来创建JavaBean实例,并将其压入值栈中,可以添加param标签。
param标签的功能:
用来为其它标签添加参数化设置的功能,比如为bean标签初始化JavaBean的属性的值。
但是请注意一点:param标签主要用来配合其它标签来指定参数,并不是只能与bean标签连用。
2:属性:
bean标签的主要属性:
name:指定了要创建的JavaBean的全类名,必须要设置
var:引用这个JavaBean实例的名称,在bean标签创建JavaBean实例之后,将这个实例压入值栈中,其key值就是这个var指定的值。
param标签的主要属性:
name:参数的名称
value:参数的值
eg1
来示例一下,使用bean标签创建JavaBean,并使用param标签来为它的属性设置初始值。示例代码如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:bean name="cn.javass.user.UserModel" var="user">
<s:param name="age" value="100"/>
</s:bean>
<s:property value="#user.age"/>
以上的代码建立了一个叫user的JavaBean,并调用了setAge方法,赋值为100,然后把这个JavaBean实例压入到值栈中。
在后面的引用中的“#user.age”,引用的就是刚刚创建的user对象,并调用它的getAge方法。
-----------------------------------------------------
url与a标签
1:url标签的功能:
url标签用来生成一个url,但是它不显示在页面上,需要其他的标签引用它,
比如a标签。url标签可以包含param标签,通过param标签来设置url要传递的参数。
a标签的功能:
用来生成HTML的<a>标签,可以通过url标签来设置它的url,也可以使用param标签来设置a标签的url所需要的参数。
2:属性:
url标签的属性很多,主要的属性有:
namespace:要访问的Action所在的包的命名空间。
action:要访问的Action的名字。
method:访问execute方法以外的其他方法。
id:被放入值栈的名字,其他标签可以通过这个值来访问这个url标签所生成的url。如果指定这个属性,则url标签不会在页面上生成字符串。
includeContext:生成的URL中是否包含当前上下文。
a标签的属性也非常多,主要是与HTML对应,主要的属性有:
href:超链接的URL
a标签与url及其类似,a标签拥有url标签的所有属性,它们之间的不同在于a标签用来直接生成一个链接,而url标签是用来生成一个字符串。
a标签比url标签还多出来一些属性,比如onchange,这些属性都是用来生成对应的HTML的事件的。
eg1
分多种方式来使用url和a标签,来体会它们的使用。
(1)不设置id属性,示例如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:url action="ognlAction" namespace="/helloworld">
<s:param name="uuid" value="'01'"/>
</s:url>
这样做并不会在页面上生成一个链接,而是仅仅生成一个字符串并显示在界面上,
结果为: /helloworld/helloworld/ognlAction.action?uuid=01
其中的参数uuid=01正是url标签的子元素, param标签生成的。
(2)设置id属性,示例如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:url action="ognlAction" namespace="/helloworld" id="test">
<s:param name="uuid" value="'01'"/>
</s:url>
这样运行,再访问页面,发现是一片空白。因为设置了id属性,url标签把生成的url字符串放入值栈等待其他的标签引用。
(3)使用a标签来引用刚刚由url标签生成的url字符串,示例如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:url action="ognlAction" namespace="/helloworld" id="test">
<s:param name="uuid" value="'01'"/>
</s:url>
<s:a href="%{test}">超链接</s:a>
注意:a标签的href属性,是通过%{test}来引用值栈中的test的,这样才能正确的生成一个链接。
(4)单独使用a标签
把上边的url标签和a标签连用的示例,改成单独使用a标签,示例如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:a action="ognlAction" namespace="/helloworld">
<s:param name="uuid" value="'01'"/>
超链接
</s:a>
--------------------------------------
再强调一下
param标签,通过这一节的讲述可以发现,它和bean标签、url标签、a标签和include标签都可以连用,
它不会单独都使用,都是作为其他标签的子标签,用于传递参数。