數據標簽
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標簽都可以連用,
它不會單獨都使用,都是作為其他標簽的子標簽,用於傳遞參數。