第八節:Struts2-標籤庫

一。標籤庫介紹

支持開發自定義標籤

標籤中支持:OGNL、JSTL、Groovy和Velcity表達式

標籤分類:


——》用戶界面標籤庫——》表單標籤庫

——》非表單標籤庫


Struts2標籤庫 ——》非用戶界面標籤庫——》控制標籤庫

——》數據訪問標籤庫


——》Ajax支持標籤庫


二。標籤庫使用

Servlet2.3及之前版本

1.在web.xml文件中增加標籤庫的定義。

	<taglib>
		<tablib-url>/struts-tags</tablib-url>
		<taglib-location>/WEB-INF/lib/struts2-core-2.0.6.jar</taglib-location>
	</taglib>

2.現在JSP中使用taglib編譯指令導入標籤庫,然後纔可使用標籤。

<%@ taglib prefix="s" uri="/struts-tags" %>

Servlet2.4及以後版本

1.在JSP中使用taglib編譯指令導入標籤庫,然後纔可以使用標籤。

<%@ taglib prefix="s" uri="/struts-tags" %>


三。標籤庫的GONL

傳統的OGNL只有一個“根”,但Struts2的OGNL包含多個"根"。

OGNL獲取值方式

指定目標的模糊搜索方式:根對象.屬性.屬性;如果未查找到則會繼續向下搜索。

OGNL PropertyAccessor(屬性訪問器)(不指定目標的模糊搜索方式):提供一個屬性名稱,OGNL從根開始一個一個查找,直到找到爲止。

Struts2的OGNL面對的是一個MAP類型的對象,所有值均從MAP對象中獲取。

GONL對應的MAP中有一個根對象:ValueStack。 所以要訪問ValueStack對象裏的屬性則:${ValueStack中的屬性名}

注意:當系統創建了Action實例後,該Action實例已被保存到ValueStack中,故無需書寫#即可訪問Action屬性。

除了MAP對象之外,Struts2還提供了一些命名對象,這些命名對象與根對象無關,他們只存在與Stack Context(其他存儲空間)中,所以訪問這些對象時需要使用#前綴來指明。

1.parameters對象:用於訪問HTTP請求參數。例如#parameters['屬性名']或者#parameters.屬性名,用於返回調用HttpServletRequest的getParameter("屬性名")方法的返回值。

2.request對象:用於訪問HttpServletRequest的屬性。例如#request[屬性名']或#request.屬性名,用於返回調用HttpServletRequest的getAttribute("屬性名")方法的返回值。

3.session對象:用於訪問HttpSession的屬性。例如#session['屬性名']或session.屬性名,用於返回調用HttpSession的getAttribute("屬性名")方法的返回值。

4.application對象:用於訪問ServletContext的屬性。例如#application['屬性名']或#application.屬性名,用於返回調用ServletContext的getAttribute("屬性名")方法的返回值。

5.attr對象:如果可以訪問到,則訪問pageContext,富哦則將依次搜索如下對象:HttpServletRequest、HttpSession、ServletContext中的屬性。


OGNL中的集合操作

直接生成List類型集合的語法爲:

{e1,e2,e3,...}

直接生成MAP類型集合的語法爲:

#{key1:value1,key2:value2,...}

對於集合OGNL提供了兩個元素符:in和not in,其中in判斷某個元素是否在指定集合中;not in 則用於判斷某個元素是否不在指定集合中。

		<s:if test="'foo' in {'foo','bar'}">
  			包含
  		</s:if>
  		<s:else>
  			不包含
  		</s:else>

		<s:if test="'foo' not in {'foo','ber'}">
	 		不包含
	 	</s:if>
	 	<s:else>
	 		包含
	 	</s:else>

注意:以上標籤需要通過action流程後才能在JSP頁面中展現。但form表單標籤卻不需要。

原始:

在login.jsp頁面中編寫<s:if>標籤功能,通過瀏覽器xxxxx.login.jsp地址訪問,會報異常。

改爲:

在login.jsp頁面中編寫<s:if>標籤功能,通過瀏覽器xxxx.showLogin.action地址訪問,由action跳轉到login.jsp頁面後。顯示正常。


OGNL爲集合提供的三個操作符

?:取出所有符合選擇邏輯的元素。

^:取出符合選擇邏輯的第一個元素。

$:取出符合選擇邏輯的最後一個元素。

實例:

person.relatives.{? #this.gender == 'male'}

在上面代碼中,直接在集合後緊跟.{}運算符表明用於取出該集合(relatives)的子集,在{}內使用?表明取出所有符合選擇邏輯的元素,而#this代表集合裏的元素。因此上面代碼的含義是:取出person對象的relatives屬性集合內gender屬性等於male的對象集合。



四。OGNL支持Lambda(λ)表達式

OGNL支持基本的Lambda表達式語法,通過這種Lambda表達式語法,可以讓我們在OGNL表達式中使用一些簡單的函數。

假設有如下斐波那契數列

函數定義

if n==0 

return 0;

elseif n==1 

return 1;

else

return fib(n-2)+fib(n-1);

函數運行結果

fid(0)=0

fid(1)=1

fid(11)=89


我們可以使用如下的OGNL表達式來求該數列中第11個元素的值:

<s:property value="#fid=:[#this==0?0 : #this==1?1:#fid(#this-2)+#fid(#this-1)],#fid(11)"/>

在上面代碼中,#fid=:[#this==0?0 : #this==1?1:#fid(#this-2)+#fid(#this-1)],#fid(11) 表示定義了一個簡單函數,value等於是#fid(11)的值。

注意:以上代碼未測試過,知是否可行。


五。Struts2控制標籤類

用於完成流程控制,以及對ValueStack的控制。包含如下9個:

if:用於控制選擇輸出的標籤。

elseIf/elseif:與if標籤結合使用,用於控制選擇輸出的標籤。

else:與if標籤結合使用,用於控制選擇輸出的標籤。

append:用於將多個集合拼接成一個新的集合。

generator:它是一個字符串解析器,用於將一個字符串解析成一個集合。

iterator:這是一個迭代器,用於將集合迭代輸出。

merge:用於將多個集合拼接成一個新的集合。但與append的拼接方式有所不同。

sort:這個標籤用於對集合進行排序。

subset:這個標籤用於截取集合的部分元素,形成新的集合。


各標籤說明:

1.if/elseif/else標籤:

與java的功能相同

實例

  		<!-- 定義了一個名爲age的屬性,其屬性值爲29 -->
		<s:set name="age" value="29"></s:set>
		<!-- 使用if/elseif/else 標籤組合來控制輸出 -->
		<s:if test="age > 60">
			老年人
		</s:if>
		<s:elseif test="age > 35">
			成年
		</s:elseif>
		<s:else>
			少年
		</s:else>

2.iterator標籤

對集合List、Set和數組,也可以對Map類型的對象進行迭代輸出。

屬性說明

value:這是一個可選的屬性,value屬性指定的就是被迭代的集合,被迭代的集合通常都使用OGNL表達式指定。如果沒有指定value屬性,則使用ValueStack棧頂的集合。

id:這是一個可選的屬性,該屬性指定了集合裏元素的ID。在迭代過程中通過該ID訪問集合內元素。

status:這是一個可選的屬性,該屬性指定迭代時的IteratorStatus實例。通過該實例即可判斷當前迭代元素的屬性例如是否重是最後一個,以及當前迭代元素的索引等。


IteratorStatus實例方法說明

int getCount():返回當前迭代了幾個元素。

int getIndex():返回當前迭代元素的索引。

boolean isEven();返回當前被迭代元素的索引是否是偶數。

boolean isFirst();返回當前被迭代元素是否是第一個元素。

boolean isLast():返回當前被迭代元素是否是最後一個元素。

boolean isOdd();返回當前被迭代元素的索引是否是奇數。

實例:迭代List、Set、數組

		<s:iterator value="{'1','2','3'}" id="index2">
			<s:property value="#index2"/>
		</s:iterator>
實例:迭代MAP

		<s:iterator value="#{'no1':'1','no2':'2','no3':'3'}" id="index2">
			<s:property value="#index2.value"/>
			<s:property value="#index2.key"/>
			or	
			<s:property value="value"/>
			<s:property value="key"/>
		</s:iterator>

3.append標籤

append標籤用於將多個集合對象拼接起來,組成一個新的集合。通過這種拼接,從而允許通過一個<s:iterator.../>標籤就完成對多個集合的迭代.

使用<s:append .../>標籤時需要指定一個id屬性,該屬性確定拼接生成的新集合的名稱。除此之外,<s:append.../>標籤可以接受多個<s:param.../>子標籤,每個子標籤指定一個集合。<s:append.../>標籤負責將<s:param.../>標籤指定的多個集合拼接成一個集合。

實例:List、set、數組類型集合拼接及輸出

		<s:append id="myList">
			<s:param value="{'a','b'}"></s:param>
			<s:param value="{'c','d'}"></s:param>
		</s:append>
		<hr/>
		<s:iterator value="#myList" id="index2">
			<s:property value="this.value"/>
			<s:property value="#index2"/>
		</s:iterator>

實例:List與Map拼接

		<s:append id="myList">
			<s:param value="#{'a':'a','b':'b'}"></s:param>
			<s:param value="#{'c','d'}"></s:param>
		</s:append>
		<hr/>
		<s:iterator value="#myList" id="index2">
			<s:property value="this.value"/>
			<s:property value="#index2"/>
		</s:iterator>
輸出結果

a=ab=bc=nulld=null

將List集合轉成MAP集合,key是List的值,value是null


3.generator標籤

使用generator標籤可以將指定字符串按指定分隔符分割成多個子串,臨時生成的多個子串可以使用iterator標籤來迭代輸出。在該標籤體內,整個臨時生成的集合將位於ValueStack的頂端,但一旦該標籤結束,該集合將被移除ValueStack。

屬性說明:

count:該屬性是一個可選的屬性,該屬性指定生成集合中元素的總數。

separator:這是一個必填的屬性,該屬性指定用於解析字符串的分隔符。

val:這是一個必填的屬性,該屬性指定被解析的字符串。

converter:這是一個可選的屬性,該屬性指定一個轉換器,該轉換器負責將集合中的每個字符串轉換成對象。

id:這是一個可選的屬性,如果指定了該屬性,則將生成的集合放在pageContext屬性中。取時使用pageContext.getAttribute(id名稱)取不到值,需要使用request.getAttribute(id名稱)方式取值。

實例;

	<body>
  		<!-- 在generator標籤內,該集合位於ValueStack的棧頂,故此處迭代就是臨時生成的集合 -->
  		<s:generator id="myList" separator="," val="'Spring2.0寶典,輕量級J2EE企業應用實戰,基於J2EE的Ajax寶典'" >
			<s:iterator status="st">
				<s:property/><br/>
			</s:iterator>  			
  		</s:generator>		
	  	<hr/>
	  	<hr/>
	  	<br/>方式一輸出:<br/>
	  	<s:generator count="2" var="myList" separator="," val="'Spring2.0寶典,輕量級J2EE企業應用實戰,基於J2EE的Ajax寶典'" >
	  	<%
			org.apache.struts2.util.IteratorGenerator iterator = (org.apache.struts2.util.IteratorGenerator)request.getAttribute("myList");
			%>
			<%=iterator.getClass().getName() %><br/>
			<%
			while(iterator.hasNext()){
				%>
				<%=iterator.next()%><br/>
				<%
			}
			 %>	 
		</s:generator>
		<br/>方式二輸出:<br/>
			<hr/>
		<%
			org.apache.struts2.util.IteratorGenerator iterator2 = (org.apache.struts2.util.IteratorGenerator)request.getAttribute("myList");
			iterator2.setCount(6);
		 %>
		 <%=iterator2.hasNext() %><br/>
		 <%
		while(iterator2.hasNext()){
			%>
			<%=iterator2.next()%><br/>
			<%
		}
		%>	 	 
  </body>
輸出結果:(<hr/>標籤無法在此頁面顯示)

Spring2.0寶典
輕量級J2EE企業應用實戰
基於J2EE的Ajax寶典

方式一輸出:
org.apache.struts2.util.IteratorGenerator
Spring2.0寶典
輕量級J2EE企業應用實戰

方式二輸出:
true
基於J2EE的Ajax寶典
Spring2.0寶典
輕量級J2EE企業應用實戰
基於J2EE的Ajax寶典
注意:當通過generator標籤創建了一個集合,實際是創建了一個IteratorGenerator類的對象,該類繼承Iterator是個迭代器。迭代器通過next進行迭代且只能迭代一次。如果要多次迭代同一個集合則需要指定count屬性。

假如一個集合有10個元素,指定count屬性爲20,則在迭代過程中會迭代20次,內容是相同的。

第一次迭代時不指定count,第二次執行時指定count=20,則從11開始迭代到20。實現了同一個迭代器多次循環。


4.merge標籤

merge標籤與apend標籤相同,都是將多個集合合併到一起,只是合併的方式不同導致結果集合順序不同。

區別如下

假設有三個集合且每個集合包含三個元素。

使用append標籤合併結果:

第一個集合第一個元素

第一個集合第二個元素

第一個集合第三個元素

第二個集合第一個元素

第二個集合第二個元素

第二個集合第三個元素

第三個集合第一個元素

第三個集合第二個元素

第三個集合第三個元素

使用merge標籤合併結果如下

第一個集合第一個元素

第二個集合第一個元素

第三個集合第一個元素

第一個集合第二個元素

第二個集合第二個元素

第三個集合第二個元素

第一個集合第三個元素

第二集合第三個元素

第三集合第三個元素


5.subset標籤

subset標籤用於取得集合的子集,該標籤的底層通過org.apache.Struts2.util.SubsetIteratorFilter類提供實現。

在subset標籤內時,subset標籤生成的子集放在ValueStack的棧頂,如果該標籤結束後,該標籤生成的子集將被移出ValueStack棧。

屬性說明:

count:這是一個可選屬性,該屬性指定子集中元素的個數。如果不指定該屬性,默認取得源集合的全部元素。

source:這是一個可選屬性,該屬性指定源集合。如果不指定該屬性,默認取得ValueStack棧頂的集合。

start:這是一個可選屬性,該屬性指定子集從源集合的第幾個元素開始截取。默認從第一個元素(即start的默認值爲0)開始截取。

decider:這是一個可選屬性,該屬性指定由開發者自己決定是否選中該元素。

實例:普通使用。

	<table border="1" width="200">
  			<!-- 使用subset標籤截取目標集合的三個元素,從第一個元素開始截取  -->
  			<s:subset source="{'Java培訓基礎','Spring2.0寶典','輕量級J2EE企業應用實戰','基於J2EE的Ajax寶典','WebWork實戰'}"
  			start="1" count="3">
  				<!-- 使用iterator標籤來迭代目標集合,因爲沒有指定value屬性值,故迭代ValueStack棧頂的元素 -->
  				<s:iterator status="st">
  					<s:property/><br/>
  				</s:iterator>
  			</s:subset>
  		</table> 
實例:decider實例

java代碼創建decider類

package decider;
import org.apache.struts2.util.SubsetIteratorFilter.Decider;
public class MyDecider implements Decider {
	public boolean decide(Object element) throws Exception {
		String ment = (String)element;
		System.out.println("ment = " + ment + ":" + (ment.indexOf("Java") > 0) );
		return ment.indexOf("Java") > 0 ;
	}
}
JSP代碼使用decider類

<!-- 定義一個Decider實例 -->
  		<s:bean id="myDecider"  name="decider.MyDecider"/>
  		<table border="1" width="200">
			<!-- 使用自定義的Decider實例來截取目標集合,生成子集 -->
			<s:subset source="{'1Java培訓基礎','Spring2.0寶典','輕量級J2EE企業應用實戰','基於J2EE的Ajax寶典','WebWork實戰'}"
			decider="#myDecider">
				<s:iterator status="st">
					<s:property/><br/>
				</s:iterator>
			</s:subset>  		
  		</table>	


6.sort標籤

sort標籤用於對指定的集合元素進行排序,進行排序時,必須提供自己的排序規則,即使實現自己的Comparator,自己的Comparator需要實現java.util.Comparator接口。

屬性說明

comparator:這是一個必填的屬性,該屬性指定進行排序的Comparator實例。

source:這是一個可選的屬性,該屬性指定被排序的集合。如果不指定該屬性,則對ValueStack棧頂的集合進行排序。

在sort標籤內時,sort標籤生成的子集放在ValueStack的棧頂,如果該標籤結束後,該標籤生成的子集將被移出ValueStack棧。

實例:

java代碼創建Comparator類

package Comparator;

import java.util.Comparator;

public class MyComparator implements Comparator{
	public int compare(Object o1, Object o2) {
		System.out.println("o1:"+ o1.toString().length() + ":::" + "o2:" + o2.toString().length());
		return ((String)o1).length() - ((String)o2).length();
	}
JSP代碼

<body>
  		<!-- 定義一個Comparator實例 -->
  		<s:bean id="myComparator" name="Comparator.MyComparator"/>
  		<table border="1" width="200">
  			<!-- 使用自定義的排序規則對目標集合進行排序 -->
  			<s:sort source="{'輕量級J2EE企業應用實戰','基於J2EE的Ajax寶典','Spring2.0寶典'}"
  			comparator="#myComparator">
  				<!-- 迭代輸出ValueStack棧頂的集合 -->
  				<s:iterator>
  					<s:property/><br/>
  				</s:iterator>
  			</s:sort>
  		</table> 
  </body>


數據標籤

數據標籤主要用於提供各種數據訪問相關的功能,包含顯示一個Action裏的屬性,以及生成國際化輸出等功能。

數據標籤主要包含如下幾個:

action:該標籤用於在JSP頁面直接調用一個Action,通過指定executeResult參數,還可將該Action的處理結果包含到本頁面中來。

bean;該標籤用於創建一個JavaBean實例。如果指定了id屬性,則可以將創建的JavaBean實例放入StackContext中。

date:用於格式化輸出一個日期。

debug:用於在頁面上生成一個調試連接,當單擊該連接時,可以看到當前ValueStack和Stack Context中的內容。

i18n:用於指定國際化資源文件的baseName。

include:用於在JSP頁面中包含其他的JSP或Servlet資源。

param:用於設置一個參數,通常是用做bean標籤、url標籤的自標籤。

push:用於將某個值放入ValueStack的棧頂。

set:用於設置一個新變量,並可以將新變量放入指定的範圍內。

text:用於輸出國際化信息。

url:用於生成一個URL地址。

property:用於生成輸出某個值,包括輸出ValueStack、Stack Context 和 Action Context中的值。

1.action標籤

使用action標籤可以允許在JSP頁面中直接調用Action,因爲需要調用Action,故可以指定需要被調用Action的name及namespace。如果指定了executeResult參數的屬性值爲true,該標籤還會把Action的處理結果(視圖資源)包含到本頁面中來。

屬性說明:

id:這是一個可選屬性,該屬性將會作爲該Action的引用ID。

name;這是一個必填屬性,通過該屬性指定該標籤調用那個Action。

namespace:這是一個可選屬性,該屬性指定該標籤調用的Action所在的namespace。

executeResult:這是一個可選屬性,該屬性指定是否要將Action的處理結果頁面包含到本頁面。該屬性值默認值是false,即不包含。

ignoreContextParams:這是一個可選參數,它指定該頁面中的請求參數是否需要傳入調用的Action。該參數的默認值是false,即將本頁面的請求參數傳入被調用的Action。


實例:循環嵌套:A頁面使用action標籤發送請求,請求結果是跳轉到A頁面。形成了一個循環,通過實際使用效果連續嵌套53次之後停止嵌套。後臺打印錯誤信息。但不知是從那次開始打印的。


2.bean標籤

bean標籤用於創建一個JavaBean的實例。創造JavaBean實例時,可以在該標籤體內使用<param.../>標籤爲該JavaBean實例傳入屬性(必須爲該類提供set方法)(如果想要獲取該bean的某個屬性值,則必須實現get方法)。

屬性說明:name:該屬性是一個必填屬性,該屬性指定要實例化的JavaBean的實現類。

id:該屬性是一個可選屬性。如果指定了該屬性,則該JavaBean實例會被放入StackContext中(並不是ValueStack),從而允許直接通過給id屬性來訪問該JavaBean實例。

注意:在bean標籤的標籤體內時,bean標籤創建的JavaBean實例位於ValueStack的頂端;但一但該bean標籤結束了,則bean標籤創建的JavaBean實例被移除ValueStack,除非指定了id屬性。

在bean標籤中,使用<s:param name="屬性名" value="值" />標籤設置JavaBean對象的屬性值,其中value的值爲OGNL表達式,字符串應使用單引號

<body>
		<s:bean name="actionBean.Person" id="person">
			<s:param name="name" value="'張三'"></s:param>
			<s:param name="age" value="20"></s:param>
		</s:bean>		
		
		name:<s:property value="#person.name"/>
		age:<s:property value="#person.age"/>
	</body>

3.date標籤

date標籤用於格式化輸出一個日期。除了可以直接格式化輸出一個日期外,date標籤還可以計算孩子定日期和當前時刻之間的時差。

屬性說明:

format:這是一個可選屬性,如果指定了該屬性,將根據該屬性指定的格式來格式化日期。

nice:這是一個可選屬性,該屬性只能爲true,或者false,他用於指定是否輸出指定日期和當前時刻之間的時差。該屬性默認值false。

name:這是一個必填屬性,該屬性指定要格式化的日期值。

id:這是一個可選屬性,該屬性指定引用該元素的id值。

注意:如果同時指定了nice和format屬性,則nice屬性生效,format屬性失效。

如果既未指定nice和format屬性,則系統會到國際化資源文件中查找KEY爲struts.date.format的信息,如果查找不到則採用DateFormat.MEDIUM格式輸出。

<s:bean name="java.util.Date" id="myDate">
		</s:bean>
		
		<s:date format="yyyy-mm" name="#myDate" id="myDateFormat"/>
		<s:property value="#myDateFormat"/>
		
		
		<hr/>
		<s:date nice="true" name="#myDate"/>

4.debug標籤

debug標籤主要用於輔助調試,它在頁面上生成一個超級連接,通過該連接可以查看到ValueStack和Stack Context中所有的之信息。


5.include標籤

include標籤用於將一個JSP頁面,或者一個Servlet包含到本頁面中。

屬性說明:

value:這是一個必填屬性,該屬性指定需要被包含的JSP頁面,或者Servlet。

id:這是一個可選屬性,該屬性指定該標籤的ID引用。

除此之外,還可以爲<s:include...、>標籤指定多個<param.../>自標籤,用於將多個參數值傳入被包含的JSP頁面或者Servlet。


6.param標籤

param標籤主要用於爲其他標籤提供參數。例如爲include標籤和bean標籤提供參數。

屬性說明:

name:這是一個可選屬性,指定需要設置參數的參數名。

value:這是一個可選屬性,指定需要設置參數的參數值。


7.push標籤

push標籤用於將某個值放到ValueStack的棧頂,從而可以更簡單的訪問該值。

屬性說明:

value:這是一個必填屬性,該屬性指定需要放到ValueStack棧頂的值。

id:這是一個可選屬性,該屬性指定引用該標籤的ID。


8.set標籤

set標籤用於將某個值放入指定範圍內,例如application範圍、session範圍等。

屬性說明:

name:這是一個必填屬性,重新生成的新變量的名字。

scope:這是一個可選屬性,指定新變量被放置的範圍,該屬性可以接受application、session、request、page或action5個值。

如果沒有指定屬性,則默認放置在StackContext中。

value:這是一個可選屬性,指定將賦給變量的值。如果沒有指定該屬性,則將ValueStack棧頂的值賦給新變量。

id:這是一個可選屬性,該屬性指定該元素的引用ID。


9.url標籤

url標籤用於生成一個URL地址,可以通過爲url標籤指定param子元素,從而向指定URL發送請求參數。

屬性說明:

includeParams:這是一個可選屬性,該屬性指定是否包含請求參數,該屬性的屬性值只能爲none、get

或者all。

scheme:這是一個可選屬性,用於設置scheme屬性。

value:這是一個可選屬性,指定生成URL的地址值,如果value不提供就用action屬性指定的Action作爲URL

地址。

action:這是一個可選屬性,指定生成URL的地址爲那個Action,如果Action不提供,就使用value作爲URL的地址值。

nameespace:這是一個可選屬性,指定使用Action的方法。

encode:這是一個可選屬性,指定是否需要encode請求參數。

includeContext:這是一個可選屬性,指定是否需要將當前上下文包含在URL地址中。

anchor:這是一個可選屬性,指定URL的錨點。

id:這是一個可選屬性,指定該URL元素的引用ID。

注意:上面的action屬性和value屬性的作用大致相同,只是action指定的是一個action,因此係統會自動在action指定的屬性後添加.action的後綴。只要指定action和value兩個屬性其中之一即可,如果兩個屬性都沒有指定,就以當前頁面作爲URL的地址值。


10.property標籤

property標籤的作用就是輸出指定值。property標籤輸出value屬性指定的值,如果沒有指定value屬性,則默認輸出ValueStack棧頂的值。

屬性說明:

default:這是一個可選屬性,如果需要輸出的屬性值爲null,則顯示的default屬性指定的值。

escape:這是一個可選屬性,指定是否escapeHTML代碼。

value:這是一個可選屬性,指定需要輸出的屬性值,如果沒有指定該屬性,則默認輸出ValueStack棧頂的值。

id:這是一個可選屬性,指定該元素的標識。


表單標籤

struts的表單標籤分爲兩種:form標籤本身和單個表單元素標籤。

其中單個表單元素標籤之間存在很多通用屬性。

通用屬性:

模板相關的通用屬性:

templateDir:指定該表單所用的模板文件目錄。

theme:指定該表單所用的主題。

template:指定該表單所用的模板。

Javascript相關的通用屬性

onclick:指定鼠標在該標籤生成的表單元素上單擊時觸發的javascrip函數。

ondbclick:指定鼠標在該標籤生成的表單元素上雙擊時觸發的Javascript函數。

onmousedown:指定鼠標在該標籤生成的表單元素上按下時觸發的Javascript函數。

onmouseup:指定鼠標在該標籤生成的表單元素上鬆開時觸發的Javascript函數。

onmouseover:指定鼠標在該標籤生成的表單元素上懸停時觸發的Javascript函數。

onmouseout:指定鼠標移除該標籤生成的表單元素時觸發的Javascript函數。

onfocus:指定該標籤生成的表單元素得到焦點時觸發的函數。

onblur:指定該標籤生成的表單元素失去焦點時觸發的函數。

onkeypress:指定單擊鍵盤上某個鍵時觸發的函數。

onkeyup:指定鬆開鍵盤上某個鍵時觸發的函數。

onkeydown:指定按下鍵盤上某個鍵時觸發的函數。

onselect:對下拉列表項等可以選擇表單元素,指定選中該元素時觸發的函數。

onchange:對於文本框等可以接受輸入的表單元素,指定當值改變時觸發的函數。

因爲HTML元素本身的限制,並不是每個HTML元素都可以觸發以上的所有函數。因此,上面的屬性並不是對struts2的每個標籤都有效。


Struts2還允許爲表單元素設置提示,當鼠標在這些元素上懸停時,系統將出現提示,Struts2將這種特性稱爲Tooltip。與Tooltip相關的屬性如下:

tooltip:設置此組件的Tooltip。

tooltipIcon:設置Tooltip圖標的URL路徑。

tooltipAboveMousePointer:是否在光標位置上顯示Tooltip。也可通過設置tooltipOffseY屬性,設置Tooltip與光標位置的垂直位移。

tooltipBgColor:設置Tooltip的背景色。

tooltipBgImg:設置Tooltip的背景圖片。

tooltipBorderWidth:設置Tooltip邊框的寬度。

tooltipBorderColor:設置Tooltip邊框的顏色。

tooltipFixCoordinateX:設置固定Tooltip在指定X座標上,與tooltipSticky屬性結合時很有用。

tooltipFixCoordinateY:設置固定Tooltip在指定Y座標上,與tooltipSticky屬性結合時很有用。

tooltipFontColor:設置Tooltip的字體顏色。

tooltipFontFace:設置Tooltip的字體。

tooltipFontSize:設置Tooltip的字體大小。

tooltipFontWeight:設置Tooltip的字體是否使用粗體。可以接受normal和bold(粗體)兩個值。

tooltipLeftOfMousePointer:設置是否在光標左側顯示Tooltip,默認是在右邊顯示。

tooltipOffsetX:設置Tooltip相對光標位置的水平位移。

tooltipOffsetY:設置Tooltip相對光標位置的垂直位移。

tooltipOpacity:設置Tooltip的透明度,設置值可以是0(完全透明)和100(不透明)之間的數字。Opera瀏覽器不支持該屬性。

tooltipPadding:指定Tooltip的內部間隔。

tooltipShadowColor:使用指定的顏色爲Tooltip創建陰影。

tooltipShadowWidth:使用指定的寬度爲Tooltip創建陰影。

tooltipStatic:設置Tooltip是否隨着光標的移動而移動。

tooltipSticky:設置Tooltip是否停留在它初始的位置,知道另一個Tooltip被激活,或者瀏覽器點擊了HTML頁面。

tooltipStayAppearTime:指定一個Tooltip消失的時間間隔(毫秒),即使鼠標還在相關的HTML元素上不動。設置值《=0,就和沒有定義一樣。

tooltipTextAlign:設置Tooltip的標題和內容的對齊方式,可以是right(右對齊)、left(左對齊)或justify(居中對其)。

tooltipTitle:設置Tooltip的標題文字。

tooltipTitleColor:設置Tooltip的標題文字的顏色。

tooltipWidth:設置Tooltip的寬度。

CSS相關的屬性:

cssClass:設置該表單元素的class屬性。

cssStyle:設置該表單元素的style屬性,使用內聯的CSS樣式。

title:設置表單元素title屬性。

disabled:設置表單元素的disabled屬性。

label:設置表單元素的lable屬性。

labelPosition:設置表單元素label所在位置,可接受的值爲top(上面)和left(左邊),默認是在左邊。

requiredposition:定義必填標記(默認以*作爲必填標記)位於label元素的位置,可以接受的值爲left(左邊)和right(右邊),默認是右邊。

name:定義表單元素的name屬性,該屬性值用於與Action的屬性形成對應。

required:定義是否在表單元素的label上增加必填標記(默認以*作爲必填標記),設置爲true時增加必填標記,否則不增加。

tabIndex:設置表單元素的tabindex屬性。

value:設置表單元素的value屬性。

Struts2中特殊標籤如下:

checkboxlist標籤

checkboxlist標籤可以一次創建多個複選框,用於一次生成多個HTML標籤中的<input type="checkbox".../>,它根據list屬性指定的集合來生成多個複選框。

屬性說明:

list:指定的集合來生成多個複選框。

listKey:該屬性指定集合元素中的某個屬性作爲複選框的value。如果集合是MAP,則可以使用key和value值分別代表MAP對象的key和value作爲複選框的value。

listValue:該屬性指定集合元素中的某個屬性作爲複選框的標籤。如果集合是MAP,則可以使用key和value值分別代表MAP對象的key和value作爲複選框的標籤。

combobox標籤

combobox標籤生成一個單行文本框和下拉列表框的組合,但兩個表單元素只對應一個請求參數,只有單行文本框裏的值才包含請求參數,而下拉列表框則只是用於輔助輸入,並沒有name屬性,也就不會產生請求參數。

屬性說明:

list:指定一個list屬性,該list屬性指定的集合將用於生成列表項。

datetimepicker標籤

datetimepicker標籤生成一個日期、時間下拉選項框,當我們使用該日期、時間選擇框選擇某個日期、時間時,系統會自動將選中的日期、時間輸入指定文本框。

屬性說明:

displayFormat:該屬性指定日期的顯示格式,例如,可以使用dd/MM/yyyy作爲日期格式。

datetimepicker支持如下幾個格式符:

#dd:以兩位數字來顯示當前日期的日。

#d:以一位數字來顯示當前日期的日。

#MM:以兩位數字來顯示當前日期的月。

#M:以一位數字來顯示當前日期的月。

#yyyy:以4位數字來顯示當前日期的年。

#y;以一位數字來顯示當前日期的年的最後一位。

displayWeeks:該屬性指定該日曆能顯示星期數。

endDate:指定日期集的最後可用日期。例如2941-10-12,一旦指定了該日期,則後面的日期不可用。

formatLength:指定日期顯示的格式,這些格式值就是DateFormat中的格式,該屬性支持的值有long、short、medium和full 4個值。

language:指定日期顯示的Locale,例如炫耀指定簡體中文,則指定zh_CN。

startDate:指定日期集的最後可用日期。例如1941-10-18,一旦指定該日期,則前面的日期不可用。

toggleDuration:指定日期選擇框出現、隱藏的切換時間。

toggleType:指定日期選擇框出現、隱藏的方式,可以選擇plain、wipe、exploded和fade4個值。

type:指定日期選擇框的類型,支持的值有date和time,分別代表日期選擇框、時間選擇框。

value:指定當前日期、時間。可以使用today來代表今天。

weekStartsOn:指定日期選擇框中那一天才是一週的第一天。週日是0,週六是6.

doubleselect標籤

doubleselect標籤會成成一個級聯列表框(會成成兩個下拉列表框),當選擇第一個下拉列表框時,第二個下拉列表框的內容會隨之改變。

屬性說明:

list:指定用於輸出第一個下拉列表框中選項的集合。

listKey:該屬性指定集合元素中的某個屬性(例如集合元素爲Person實例,指定Person實例的name屬性)作爲第一個下拉列表框的value。如果集合是MAP,則可以使用key和value值分別代表MAP對象的key和value作爲複選框的value。

listValue:該屬性指定集合元素中的某個屬性作爲複選框的標籤。

doubleList:指定用於輸出第一個下拉列表框中選項的集合。

doubleListKey:該屬性指定集合元素中的某個屬性作爲第一個下拉列表框的value。

doubleListValue:該屬性指定集合元素中的某個屬性作爲第一個下拉列表框的標籤。

doubleName:指定第二個下拉列表框的name屬性。

注意:使用doubleselect標籤時,必須放在<s:form.../>標籤中使用,且必須爲該<s:form.../>標籤指定action屬性。

head標籤

head標籤主要用於生成HTML主要頁面的head部分。因爲有些主題需要包含特定的CSS和JAVASCRIPT代碼,而該標籤則用於生成對這些CSS和JAVASCRIPT代碼的引用。


optiontransferselect標籤

optiontransferselect標籤會創建兩個選項用來轉移下拉列表項,該標籤會生成兩個<select.../>標籤,並且會生成系列的按鈕,這系列的按鈕可以控制選項在兩個下拉列表之間移動、升降。當提交該表單時,兩個<select.../>標籤的請求參數都會被提交。

屬性說明:

addAllToLeftLabel;設置全部移動到左邊按鈕上的文本。

addAllToRightLabel:設置全部移動到右邊按鈕上的文本。

addToLeftLabel:設置向左移動按鈕上的文本。

addToRightLabel:設置向右移動按鈕上的文本。

allowAddAllToLeft:設置是否出現全部移動到左邊的按鈕。

allowAddAlltoRight:設置是否出現全部移動到右邊的按鈕。

allowAddToLeft:設置是否出現移動到左邊的按鈕。

allowAddToRight:設置是否出現移動到右邊的按鈕。

leftTitle:設置左邊列表框的標題。

rigthTitle:設置右邊列表框的標題。

allowSelectAll:設置是否出現全部選擇按鈕。

selectallLabel:設置全部選擇按鈕上的文本。

doubleList:設置用於創建第二個下拉選擇框的集合。

doubleListKey:設置創建第二個下拉選擇框的選項value的屬性。

doubleListValue:設置創建第二個下拉選擇框的選項label的屬性。

doubleName:設置第二個下拉選擇框的name屬性。

doubleValue:設置第二個下拉選擇框的value屬性。

doubleMultiple:設置第二個下拉選擇框是否允許多選。

list:設置用於創建第一個下拉選擇框的集合。

listKey:設置用於創建第一個下拉選擇框的選項value的屬性。

listValue:設置創建第一個下拉選擇框的選項label的屬性。

name:設置第一個下拉選擇框的name屬性。

value;設置第一個下拉選擇框的value屬性。

multiple:設置第一個下拉選擇框是否允許多選。

select標籤

該標籤用於生成一個下拉列表框,通過爲該元素指定list屬性,系統會使用list屬性指定的集合來生成下拉列表框的選項。

屬性說明:

listKey:該屬性指定集合元素中的某個屬性作爲複選框的value。

listValue:該屬性指定集合元素中的某個屬性作爲複選框的標籤。

multiple:設置該列表框是否允許多選。

radio標籤

該標籤的用法與checkboxlist的用法幾乎相同。區別在於該標籤生成的是單選。

optgroup標籤

該標籤用於生成一個下拉列表框的選擇租。因此,該標籤必須放在<s:select.../>標籤中使用。

token標籤

這是一個用於防止多次提交表單的標籤,token標籤能解決阻止多次提交表單的問題,如果需要該標籤起作用,則應該在Struts2的配置文件中啓用TokenInterceptor攔截器或TokenSessionStoreInterceptor攔截器。

實現原理:

實現原理是在表單中增加一個隱藏域,每次加載該頁面時,該隱藏域的值都不同。而TokenInterceptor攔截器則攔截所有用於請求,如果兩次請求時該token對應隱藏域的值相同,則阻止表單提交。

注意:在默認情況下,token標籤生成的隱藏域的name爲struts.token。因此不要在表單中另外再定義一個名爲struts.token的表單域。

updownselect標籤

updownselect標籤的用法非常類似於select標籤的用法,區別是該標籤生成的列表框可以支持選項的上下移動。

屬性說明:

擁有與select標籤相同的屬性。

allowMoveUp:是否顯示“上移”按鈕,默認是true。

allowMoveDown:是否顯示“下移”按鈕,默認是true。

moveUpLabel:設置“上移”按鈕上的文本,默認是 ^符號。

moveDownLabel;設置“下移”按鈕上的文本,默認是 v 符號。

selectAllLabel:設置“全選”按鈕上的文本,默認是*符號。

表單標籤

a:生成一個超級連接

actionerror:如果Action實例的getActionErrors()方法返回不爲null,則該標籤負責輸出該方法返回的系列錯誤。

actionmessage:如果Action實例的getActionMessages()方法返回不爲null,則該標籤負責輸出該方法返回的系列消息。

component:使用此標籤可以生成一個自定義組件。

div:此標籤負責生成一個div片段。

fielderror:如果Action實例存在表單域的類型轉換錯誤、校驗錯誤、該標籤則負責輸出這些錯誤提示。

tabbedPanel:生成HTML頁面的Tab頁。

tree:生成一個樹形結構。

teeenode:生成樹形結構的節點。













多個根的順序

ValueStack

Action的上下文

等等




































































發佈了44 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章