天天看點

Struts2 學習筆記Struts2 學習筆記

Struts2 學習筆記

struts2控制标簽

控制标簽主要是提供操作集合和有條件的生成内容的功能,與Struts1.x中的邏輯标簽的功能相似,但使用要簡單友善得多。其中主要包括9個标簽。下面來介紹一下。

if 标簽

if标簽是Struts2架構提供的一個流程控制标簽,針對某一邏輯的多種條件進行處理,通常表現為“如果滿足某種條件,就進行某種處理,否則就進行另一種處理”,與Java語言相同,Struts2架構的标簽同樣支援if、else if、else的語句判斷,其标簽為如下:

<s:if>
           

是基本流程控制标簽,用于在滿足某個條件下的情況下,執行标簽體中的内容,标簽可以單獨使用。

<s:elseif>
           

此标簽需要與标簽配合使用,在不滿足标簽中條件的情況下,判斷是否滿足标簽中的條件,如果滿足此标簽中的條件,那麼将執行标簽體中的内容。

<s:else>
           

此标簽需要與标簽或标簽配合使用,當不滿足所有條件的情況下,可以使用标簽來執行此标簽中的内容。

注意事項:> 标簽可以單獨使用,用于在滿足某個條件下的情況下,執行标簽體中的内容,而标簽與标簽不可以單獨使用。

與Java語言相同,Struts2架構的流程控制标簽同樣支援if…else if…else的條件語句判斷,其使用方法如下:
<s:if test="表達式(布爾值)">
    輸出結果
    </s:if>
    <s:elseif test="表達式(布爾值)">
    輸出結果
    </s:elseif>
    可以使用多個<s:elseif>
    ....
    <s:else>
    輸出結果
    </s:else>
           

标簽與标簽都有一個名稱為test的屬性,此屬性用于設定标簽的判斷條件,它的值是一個布爾類型的條件表達式。在上述代碼中,可以包含多個标簽,針對不同的條件執行不同的内容。

标簽與标簽都用在滿足某種條件的情況下,執行指定的标簽體内的内容,是以,使用标簽與标簽需要為其指定一定的條件表達式,而标簽是在不滿足所有條件的情況下執行标簽體内的内容,是以,使用标簽不需要為其指定條件表達式。

terator标簽

iterator标簽是Struts2提供的一個疊代資料的标簽,它可以根據循環條件,周遊數組和集合類中的所有或部分資料。如通過iterator标簽疊代一個集合或者數組,可以疊代出集合或數組的所有資料,也可以指定疊代資料的起始位置、步長以及終止位置來疊代集合或數組中的部分資料。

表1  iterator标簽屬性及說明

名  稱
 是否必須
 類  型
 說  明

begin
 可選
 Integer
 指定疊代數組或集合的起始位置,它的預設值為0

end
 可選
 Integer
 指定疊代數組或集合的結束位置,它的預設值為集合或數組的長度

status
 可選
 String
 疊代過程中的狀态

step
 可選
 Integer
 設定疊代的步長,如果指定此值,那麼,每一次疊代後,索引值将在原索引值的基礎上增加step值,它的預設值為1

value
 可選
 String
 指定疊代的集合或數組對象

var
 可選
 String
 設定疊代元素的變量,如果指定此屬性,那麼所疊代的變量将放壓入到值棧之中
           

在iterator标簽的屬性中,status屬性用于擷取疊代過程中的狀态資訊。在Struts2架構的内部結構中,status屬性實質是擷取了Struts2封裝的一個疊代狀态的對象,此對象為org.apache.struts2.views.jsp.IteratorStatus,通過此對象可以擷取到疊代過程中的如下資訊。

Struts2 标簽庫
           

在使用Struts2标簽之前需要引入struts2标簽庫,,

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

1. 元素數
IteratorStatus對象提供了getCount()方法,來擷取疊代集合或數組的元素數,如果status屬性設定為“st”,那麼就可通過“st.count”擷取元素數。
2. 是否為第一個元素
IteratorStatus對象提供了isFirst()方法,來判斷目前元素是否為第一個元素,如果status屬性設定為“st”,那麼就可通過“st.first”判斷目前元素是否為第一個元素。
3. 是否為最後一個元素
IteratorStatus對象提供了isLast()方法,來判斷目前元素是否為最後一個元素,如果status屬性設定為“st”,那麼就可通過“st.last”判斷目前元素是否為最後一個元素。
4. 目前索引值
IteratorStatus對象提供了getIndex()方法,來擷取疊代集合或數組的目前索引值,如果status屬性設定為“st”,那麼就可通過“st.index”擷取目前索引值。
5. 索引值是否為偶數
IteratorStatus對象提供了isEven()方法,來判斷目前索引值是否為偶數,如果status屬性設定為“st”,那麼就可通過“st.even”判斷目前索引值是否為偶數。
6. 索引值是否為奇數
IteratorStatus對象提供了isOdd()方法,來判斷目前索引值是否為奇數,如果status屬性設定為“st”,那麼就可通過“st.odd”判斷目前索引值是否為奇數。
7. sort标簽
sort标簽用也用于操作集合對象,它的作用是對集合中資料進行排序,排序後它将集合中的資料壓入到值棧之中,在sort标簽内部可以直接通路到集合中的資料,sort标簽中的屬性及說明如表2所示。
           

表2 sort标簽屬性及說明

名  稱是否必須類  型說  明

comparator可選java.util.Comparator指定對集合中資料進行排序所用到的比較器

source可選String指定要排序的集合

var可選String指定排序後的疊代器的引用,它将被儲存到pageContext中
           

append标簽與merge标簽

append标簽與merge标簽都用于合并集合對象,将不同的疊代器組合在一起,它們的差別是其組合的順序不同。

append标簽組合集合的方式是以追加的方式進行組合,其組合方式效果圖如圖1所示,在圖1中,有兩個集合分别為集合1與集合2,append标簽的組合方式是将第2個集合直接追加到第1個集合之後。

Struts2 學習筆記Struts2 學習筆記

merge标簽組合集合的方式是分别将要組合的集合拆開,然後按一次的次序分别擷取到每一個集合中每一個元素,再進行進行組合,其合并集合的方式如圖2所示。

Struts2 學習筆記Struts2 學習筆記

append标簽與merge标簽都有一個名稱為var屬性,用于定義合并後的集合的引用變量,它儲存在OGNLContext之中。

表3   generator标簽屬性及說明
名  稱是否必須類  型說  明
converter可選Struts2的轉換器Converter對象指定轉換器Converter對象
count可選String指定疊代器中元素數量
separator必須String指定分隔符
val必須String指定需要解析的值
var可選String指定引用變量,此變量是一個Iterator對象,放置在pageContext之中
           

使用generator标簽構造的Iterator對象,會将疊代器壓入到值棧之中,這的用法比簡單,如将一個字元串通過逗号分隔符進行分隔,其用法如下:

上代碼的傳回值為“aaa,bbb,ccc,ddd,eee,”。

在generator标簽也可以使用count屬性來指定傳回的範圍,如将上述代碼修改成以下的形式:

那麼,傳回值則為“aaa,bbb,ccc,”。

如果操作比較繁瑣,可以通過指定generator标簽的converter屬性,來設定一個轉換器對象,進而進行自定義的格式處理。

### 資料标簽 ###

property标簽

property标簽是一個非常常用的标簽,它的作用是擷取資料值,并将資料值直接輸出到頁面之中。其屬性及說明如表1所示。

表1property标簽屬性及說明

名  稱
 是否必須
 類  型
 說  明

default
 可選
 String
 設定預設值,如果value屬性不存在或值為null,将使用此值

escape
 可選
 boolean
 是否将value值進行HTML轉義輸出,如“<”轉義成為“&lt;”,它的預設值為true

escapeJavaScript
 可選
 boolean
 是否将JavaScript腳本進行轉義輸出,如将“\”轉義成為“\\”,它的預設值為false

value
 可選
 String
 所輸出的值

property标簽的使用方法非常簡單,其使用方式如下:

<%

  request.setAttribute("info","<font color='red'>測試property</font>");

%>

<s:property default="沒有資料!"  value="#request.info" escape="false"/>

在上面的代碼中,輸出了request中的info屬性值,如果info屬性值不存在,将輸出預設值“沒有資料!”,同時,其輸出方式并沒使用HTML的轉義方式。

如果将escape的值設定為true,它将在網頁之中輸出如下代碼:

&lt;font color='red'&gt;&#27979;&#35797;property&lt;/font&gt;
           

set标簽

set标簽用于定義一個變量,通過此标簽可以所定義的變量指派,及設定變量的作用域(application、request、session),在預設情況下,通過set标簽所定義的變量被放置到值棧之中,set标簽中所包含屬性及說明如表2所示。

表2set标簽屬性及說明

名  稱
 是否必須
 類  型
 說  明

scope
 可選
 String
 設定變量的作用域,它的值可以是application、request、session、page或action,它的預設值為action

value
 可選
 String
 設定變量的值

var
 可選
 String
 定義變量的名稱


set标簽的使用方法非常簡單,其使用方式如下:

<s:set var="username" value="'測試set标簽'" scope="request"></s:set>

<s:property default="沒有資料!" value="#request.username"/>

上述代碼,通過set标簽定義了一個名稱為username的變量,它的值是一個字元串,username的作用域在request範圍之中。
           

3.a标簽

a标簽用于建構一個超連結,其最終的建構效果将形成一個HTML中的超連結,其常用屬性與說明如表3所示。
表3   a标簽屬性及說明
名  稱是否必須類  型說  明
action可選String将超連結的位址指向action
href可選String超連結位址
id可選String設定HTML中的屬性名稱
method可選String如果超連結的位址指向action,method同時可以為action聲明所調用的方法
namespace可選String如果超連結的位址指向action,namespace可以為action聲明名稱空間

如果定義一個簡單的超連結,a标簽的使用方法如下:
<s:a id="index" href="index.jsp" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >首頁</s:a>
上述代碼将在JSP頁面之中生成一個超連結,所生成的代碼如下:
<a id="index" href="index.jsp" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >首頁</a>
如果通過超連結通路Action對象,a标簽的使用方法如下:
<s:a action="userAction" namespace="admin/user" method="index">使用者管理</s:a>
上述代碼将在JSP頁面之中生成一個超連結,所生成的代碼如下:
<a href="admin/user/userAction!index" target="_blank" rel="external nofollow" >使用者管理</a>
技巧:
如果需要動态調用Action對象中的方法,可以使用a标簽中的method屬性進行設定,如上面代碼所生成的“userAction!index”。
           

4.param标簽

param标簽主要用于對參數指派,它可以當做其它标簽的子标簽。在param标簽中,隻有兩個屬性,其說明如表4所示。
表4param标簽屬性及說明
名  稱是否必須類  型說  明
name可選String設定參數名稱
value可選Object設定參數值

param标簽的使用方法如下:
<s:param name="name" value="username"></s:param>
上述代碼的作用是将OGNLContext中的參數username的值,指派給name參數。param标簽可以使用另一種表示方式,将參數值放置在param标簽的中間,例如:
<s:param name="name">username</s:param>
使用此種方式,param标簽将會把username看成是一個字元串數值,而通過value定義的參數值,param标簽将會把username看成是一個表達式。
注意:
param标簽的value屬性中的值是一個表達式,如果需要将其設定成一個字元串數值,需要使用“’字元串’”的方式進行設定。
           

5.action标簽

action标簽是一個非常常用的标簽,它用于執行一個Action請求,當在一個JSP頁面中通過action标簽執行Action請求時,可以将Action的傳回結果輸出到目前頁面之中,也可以不輸出,其常用屬性及說明如表5所示。

表5  action标簽屬性及說明

名  稱
 是否必須
 類  型
 說  明

executeResult
 可選
 String
 是否使Action傳回到執行結果,它的預設值為false

flush
 可選
 boolean
 輸出結果是否重新整理,它的預設值為true

ignoreContextParams
 可選
 boolean
 是否将頁面請求參數,傳入被調用的Action,它的預設值為false

name
 必須
 String
 Action對象所映射的名稱,也就是struts.xml中配置的名稱

namespace
 可選
 String
 指定名稱空間的名稱

var
 可選
 String
 引用此action的名稱
           

6.bean标簽

bean标簽也是一個十分常用的标簽,它與JSP中的<jsp:useBean>動作相類似,主要用于建立并執行個體化一個JavaBean對象,對于JavaBean中的屬性可以通過param标簽對其指派,它的常用屬性與說明如表6所示。

表6  Bean标簽屬性及說明

名  稱
 是否必須
 類  型
 說  明

name
 必須
 String
 聲明JavaBean對象的完整類名

var
 可選
 String
 引用此JavaBean的名稱


注意:

通過bean标簽操作的JavaBean對象,它必須要遵循JavaBean規範,JavaBean對象要提供預設的構造方法與通路器。

在Struts2架構之中,通過bean标簽執行個體化的JavaBean對象将被放入到OGNLContext之中,如果在bean标簽内部調用JavaBean對象,此時,JavaBean執行個體處于值棧的頂部,可以直接進行調用,但如果在bean标簽外部來調用JavaBean對象,那麼JavaBean執行個體就不處于值棧的頂部,需要通過“#”号調用。
           

7.push标簽

push标簽用于将對象或值壓入到值棧之中并放置到頂部,因為值棧中的對象是可以直接調用的,是以,push标簽主要作用是起到一種簡化操作的作用,它的屬性隻有一個,名稱為value,用于聲明壓入值棧中的對象,其使用方法如下。
<s:push value="#request.student"></s:push>
上述代碼的含義是将request作用域中的student對象壓入到值棧頂部。
           

8.date标簽

date标簽用于格式化日期時間,可以通過指定的格式化樣式對日期時間值進行格式化,date标簽中所包含的屬性及說明如表7所示。
表7 date标簽屬性及說明
名  稱是否必須類  型說  明
format可選String設定格式化日期的樣式
name必須String日期值
nice可選boolean是否輸出給定日期與目前日期之的間時差,它的預設值為false,不輸出時差
var可選String格式化時間的名稱變量,通過此變量可以對其進行引用

說明:
在date标簽中還包含id屬性,但此屬性已過時,它被var屬性所取代。
           

9.include标簽

Struts2架構中的include标簽的作用類似于JSP中的<include>動作标簽,也用于包含一個頁面,但Struts2架構中的include标簽的功能更加強大,它可以向目标頁面中通過param标簽傳遞請求參數。
include标簽隻有一個value屬性,此屬性是必選的屬性,用于包含一個JSP頁面或Servlet。
10.url标簽
在Struts2架構之中,一個Action對象的URL映射位址包含名稱空間、調用方法等多個參數,這樣的URL可以直接進行編寫,也可以使用Struts2架構提供的url标簽自動生成URL位址,url标簽中提供了多個屬性滿足不同格式的URL需求,它的常用屬性及說明如表8所示。
           
Struts2 學習筆記Struts2 學習筆記

表單UI 标簽

  1. 常用的表單标簽與通用屬性

    在Struts2架構之中,Struts2提供了一套表單标簽,這些标簽用于生成表單以及表單中的元素,如文本框、密碼框、選擇框等,由于這些标簽由Struts2提供,它們能夠與Struts2 API進行很好的互動,其常用的表單标簽及說明如表1所示。

Struts2 學習筆記Struts2 學習筆記

說明:

在Struts2架構中,與表單相關的标簽有很多,表1之中所列出的标簽是常用的表單标簽。

在HTML語言中,表單中的元素擁有一些通用的屬性,比如id屬性、name屬性以及JavaScript中的事件,這些元素在HTML表單元素中幾乎都會存在,與HTML中相同,Struts2提供的表單标簽也存在通用的屬性,而且這此屬性比較多,表單标簽常用的屬性及說明如表2所示。

Struts2 學習筆記Struts2 學習筆記

說明:

Struts2的表單标簽包含的通用屬性非常多,它包含了HTML中的元素之中的屬性,其中有一些屬性并不是很常用,表2所列出的屬性是一些常用的通用屬性。

送出按鈕的特殊設定

Struts2架構的設計非常巧妙,在它的配置檔案之中,一個請求傳回結果的類型可以設定為action、redirect、redirect-action,同時也可以通過動态的請求指定所應用的Action中的方法。而對于一個表單對象,它的應用實質就是将帶有參數的請求傳遞到指定的位址,由這個請求位址對請求做出處理,既然表單對象也用于發送請求,那麼,它也應該具有請求類型的設定。

在Struts2架構設計中,提供了對表單對象請求類型的設定,它通過submit标簽中的name屬性進行設定,它的屬性取值如下。

action類型

用于設定目前送出按鈕指向的Action,如果form表單已經設定了action屬性的值,那麼,單擊目前按鈕,按鈕中所設定的Action将覆寫掉form表單已經設定了action屬性,也就是說單擊此按鈕,請求将送出到此按鈕配置的Action。

将送出按鈕的請求類型設定為Action,通過name屬性進行設定,其設定方法如下:

name="action:editUserAction"
           

例如,在下面的表單代碼中,将“修改”按鈕的請求類型設定為editUserAction,那麼,“修改”按鈕的送出動作就會覆寫掉表單之中action。

<s:form action="saveUserAction" method="post">
      <s:textfield name="name" label="使用者名"></s:textfield>
      <s:password name="password" label="密碼" ></s:password>
      <s:radio name="sex" list="#{1 : '男', 0 : '女'}" label="性别" ></s:radio>
      <s:checkboxlist list="{'足球','羽毛球','乒乓球','藍球'}" name="hobby" label="愛好"></s:checkboxlist>
      <s:submit value="儲存"></s:submit>
      <s:submit value="修改" name="action:editUserAction"></s:submit>
    </s:form>
           

在上述的代碼中,如果單擊“儲存”按鈕,那麼,請求将交給saveUserAction進行處理,如果單擊“修改”按鈕,那麼,請求将交給editUserAction進行處理。

method處理

一個Action對象預設的請求處理方法,是使用execute()方法對請求進行處理,在submit标簽中配置method,則可以指定Action對象中的任意方法,此設定相當于使用了Struts2架構中的動态請求。

在submit标簽中配置method有兩種實作方法,這兩種實作方法如下:

配置submit标簽的method屬性
雖然在form标簽中已經提供了method屬性,但此屬性并不是指動态調用Action對象中的方法,而是HTTP請求的類型(GET、POST等),如果需要動态調用Action對象中的指定方法,則可以通過配置submit标簽的method屬性進行實作,method屬性的值對應Action對象中的方法名稱,例如:
           
<s:form action="userAction" method="post">
      <s:textfield name="name" label="使用者名"></s:textfield>
      <s:password name="password" label="密碼" ></s:password>
      <s:radio name="sex" list="#{1 : '男', 0 : '女'}" label="性别" ></s:radio>
      <s:checkboxlist list="{'足球','羽毛球','乒乓球','藍球'}" name="hobby" label="愛好"></s:checkboxlist>
      <s:submit value="儲存" method="save"></s:submit>
      <s:submit value="修改" method="update"></s:submit>
    </s:form>
           

在上述代碼中,如果單擊“儲存”按鈕,那麼,請求則由userAction的save()方法進行處理,它相當于将表單請求的位址設定為“userAction!save.action”。如果單擊“修改”按鈕,請求則由userAction的update()方法進行處理,它相當于将表單請求的位址設定為“userAction!update.action”。

配置submit标簽的name屬性

除了使用submit标簽的method屬性進行配置外,還可以使用submit标簽的name屬性進行配置,name屬性值以“method:”開頭,後面加上調用Action對象的方法的名稱,如,在下面的代碼使用submit标簽的name屬性進行配置:
           
<s:form action="userAction" method="post">
      <s:textfield name="name" label="使用者名"></s:textfield>
      <s:password name="password" label="密碼" ></s:password>
      <s:radio name="sex" list="#{1 : '男', 0 : '女'}" label="性别" ></s:radio>
      <s:checkboxlist list="{'足球','羽毛球','乒乓球','藍球'}" name="hobby" label="愛好"></s:checkboxlist>
      <s:submit value="儲存" name="method:save"></s:submit>
      <s:submit value="修改" name="method:update"></s:submit>
     </s:form>
           

在上述代碼中,如果單擊“儲存”按鈕,那麼,請求則由userAction的save()方法進行處理,它相當于将表單請求的位址設定為“userAction!save.action”。如果單擊“修改”按鈕,請求則由userAction的update()方法進行處理,它相當于将表單請求的位址設定為“userAction!update.action”。

redirect類型

redirect類型用于将請求類型設定為重定向,此操作通過submit标簽的name屬性進行配置,name屬性值以“redirect:”開頭,後面加上請求重定向到的URL位址,它的使用方法如下:
<s:submit value="搜尋" name="redirect:search.jsp"></s:submit>
在上述的代碼中,如果單擊“搜尋”按鈕,那麼,請求将重定向到search.jsp進行處理。
           

在表單之中,将送出按鈕的請求類型設定成為redirect類型,此種操作方式并不常用,因為請求重定向後,并不會傳遞表單中的參數。

redirect-action類型

用于設定目前送出按鈕指向的Action,如果form表單已經設定了action屬性的值,那麼,單擊目前按鈕,按鈕中所設定的Action将覆寫掉form表單已經設定了action屬性,也就是說單擊此按鈕,請求将送出到此按鈕配置的Action。

将送出按鈕的請求類型設定為Action,通過name屬性進行設定,其設定方法如下:

name="action:editUserAction"
           

如在下面的表單中,将“修改”按鈕的請求類型設定為editUserAction,那麼,“修改”按鈕的送出動作就會覆寫掉表單之中action。

<s:form action="saveUserAction" method="post">
      <s:textfield name="name" label="使用者名"></s:textfield>
      <s:password name="password" label="密碼" ></s:password>
      <s:radio name="sex" list="#{1 : '男', 0 : '女'}" label="性别" ></s:radio>
      <s:checkboxlist list="{'足球','羽毛球','乒乓球','藍球'}" name="hobby" label="愛好"></s:checkboxlist>
      <s:submit value="儲存"></s:submit>
      <s:submit value="修改" name="action:editUserAction"></s:submit>
    </s:form>
           

在上述的代碼中,如果單擊“儲存”按鈕,那麼,請求将交給saveUserAction進行處理,如果單擊“修改”按鈕,那麼,請求将交給editUserAction進行處理。