Struts2 框架中的 Action 物件是一個控制器的角色,Struts2 框架通過 Action 物件處理 HTTP 請求,其請求地址的對映需要設定在 struts.xml 檔案中,它使用 <action> 元素進行設定。
語法1:
<action name="name" class="url"method="name">
<result>url</result>
</action>
組態檔中的 <action> 元素主要用於建立 Action 物件的對映,通過 <action> 元素可以指定 Action 請求地址及處理後的對映頁面,在 <action> 元素中主要包含如表所示的屬性資訊。
<bean>元素屬性及說明
屬性 |
說明 |
name |
用於設定Action物件被請求的URL對映 |
class |
指定Action物件的類名 |
method |
設定請求Action物件時,呼叫Action物件的哪一個方法 |
converter |
指定Action物件型別轉換器的類 |
注意:在 <action> 元素中,name 屬性是必須設定的,在建立 Action 物件的對映時,必須指定它的 URL 對映地址,否則請求找不到 Action 物件。
範例
在實際的專案開發中,對於每一個模組來說,其業務邏輯都比較複雜,一個 Action 物件包含多個業務邏輯請求的分支,如在使用者管理模組中,需要對使用者資訊進行新增、刪除、修改、查詢操作,其 Action 物件的程式碼如下:
import com.opensymphony.xwork2.ActionSupport;/**
*使用者資訊管理Action
*@author zs
*/
public class UserAction extends ActionSupport{
private static final long serialVersionUID=1L; //新增使用者資訊
public String save()throws Exception{
……
return SUCCESS;
} //修改使用者資訊
public String update()throws Exception{
……
return SUCCESS;
} //刪除使用者資訊
public String delete()throws Exception{
……
return SUCCESS;
} //查詢使用者資訊
public String find()throws Exception{
……
return SUCCESS;
}
}
呼叫一個 Action 物件,預設情況下,它執行的是 execute() 方法,在這種多個業務邏輯分支的 Action 物件中,如果需要請求指定的方法,就可以通過 <action> 元素的 method 屬性進行設定,將一個請求交給指定的業務邏輯方法進行處理,如:
<!--新增使用者-->
<action name="userAction" class="com.lyq.action.UserAction" method="save">
<result>success.jsp</result>
</action>
<!--修改使用者-->
<action name="userAction" class="com.lyq.action.UserAction" method="update">
<result>success.jsp</result>
</action>
<!--刪除使用者-->
<action name="userAction" class="com.lyq.action.UserAction" method="delete">
<result>success.jsp</result>
</action>
<!--查詢使用者-->
<action name="userAction" class="com.lyq.action.UserAction" method="find">
<result>success.jsp</result>
</action>
<action> 元素的 method 屬性主要用於對一個 action 請求分發一個指定業務邏輯方法,如將 <action> 元素的 method 屬性值設定為 "add",那麼這個請求會交給 Action 物件的 add() 方法進行處理,此種設定方法可以減少 Action 物件數目。
注意:在使用 <action> 元素的 method 屬性時,其屬性值需要與 Action 物件中的方法名一致,Struts2 框架是通過 method 屬性值查詢與之設定的方法。
語法2:
在多個 Action 的情況下,通過一定的命名約定,使用萬用字元設定 Action 物件來達到一種簡化設定的效果。
在 Struts2 框架的組態檔 struts.xml中,常用的萬用字元主要有兩個,分別為“*”與“”。
-
萬用字元“*”:匹配0或多個字元。
-
萬用字元“”:是一個跳脫字元,如需要匹配“/”,則使用“/”進行匹配。
在 Struts2 框架的組態檔 struts.xml 中應用萬用字元的方法如下:
<struts>
<!--定義action-->
<action name="XXX*" class=XXXq.action.{1}XXXAction">
</struts>
<action> 元素的 name 屬性的值為 "add*",它匹配的是以字元 "add" 開頭的字串,如 "addUser"、"addBook" 都可以匹配。對於萬用字元所匹配的字元,在 Struts2 框架的組態檔中是可以獲取的,它使用表示式 {1}、{2}、{3} 的方式進行獲取。
說明:表示式 {N} 是 1~9 之間的數位,它的下標從 1 開始。
範例
在圖書資訊處理 Action 中,分別編寫新增、刪除、更新、查詢圖書的方法,針對這 4 種操作,使用萬用字元設定此 Action,並將請求方法返回到相應的頁面。
建立名為 Struts2_12 的 Java Web 專案,將 Struts2 的相關類包新增到專案的 classpath,並在 web.xml 檔案中註冊 Struts2 提供的 StrutsPrepareAndExecuteFilter 過濾器,從而搭建 Struts2 的開發環境。
建立圖書資訊管理的 Action 物件,它的名稱為 BookAction,在此 Action 中分別編寫新增、刪除、更新、查詢圖書的方法,關鍵程式碼如下:
import com.opensymphony.xwork2.ActionSupport;/**
*圖書Action
*@authorZS
*/
public class BookAction extends ActionSupport{
private static final long serialVersionUID=1L; //新增圖書資訊請求
public String add()throws Exception{//返回SUCCESS
return SUCCESS;
} //更新圖書資訊請求
public String update()throws Exception{ //返回SUCCESS
return SUCCESS;
} //刪除圖書資訊請求
public String delete()throws Exception{ //返回SUCCESS
return SUCCESS;
}//查詢圖書資訊請求
public String select()throws Exception{ //返回SUCCESS
return SUCCESS;
} //預設請求執行方法
@Override
public String execute()throws Exception{ //返回SUCCESS
return SUCCESS;
}
}
在 BookAction 類中,新增圖書資訊的方法為 add() 方法,更新圖書資訊的方法為 update() 方法,刪除圖書資訊的方法為 delete() 方法,查詢圖書資訊的方法為 select() 方法,execute() 方法為預設請求處理方法。
說明:本範例主要演示通過萬用字元設定 Action,在 BookAction 類中並沒有對圖書資訊進行相關操作,只返回了 SUCCESS 值。
在 Web 專案的原始碼資料夾(MyEclipse 中預設為 src 目錄)中,建立名為 struts.xml 的組態檔,在此檔案中通過萬用字元設定 BookAction 物件,關鍵程式碼如下:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!--宣告常數-->
<constant name="struts.devMode" value="true"></constant>
<package name="myPackage" extends="struts-default" namespace="/">
<!--定義action(使用萬用字元進行設定)-->
<action name="*_*" class="com.lyq.action.BookAction" method="{1}">
<!--結果對映-->
<result name="success">{2}_{1}.jsp</result>
</action>
</package>
</struts>
<action> 元素的 name 屬性的值為“*_*”,它匹配使用下劃線分隔的兩個字串,method 屬性的值為“{1}”,表示式 {1} 匹配的是 name 屬性第一個字串的值,如請求 "/add_book" 時,將呼叫 BookAction 類的 add() 方法。
說明:<action> 元素的 method 屬性用於設定存取一個 Action 物件所呼叫的方法。
“*_*”請求的 Action 對映結果只有一個,它的值為 success。在這個返回結果中,本範例通過表示式動態生成返回值,範例將其返回值設定為 "{2}_{1}.jsp",它所生成的動態返回值是“*_*”請求第一個“*”與第二個“*”組合成的 JSP 頁面,如請求 "/update_book" 時,呼叫 BookAction 類的 update() 方法,其處理成功的返回頁面為 book_update.jsp,同理,當請求 "/delete_book" 時,其處理成功的返回頁面為 book_delete.jsp。
技巧:在多個 Action 物件的情況下,使用萬用字元設定 Action 物件可以減少大量的設定程式碼。
建立圖書資訊管理請求處理成功的返回頁面,包括 book_add.jsp 頁面、book_update.jsp 頁面、book_delete.jsp 頁面、book_select.jsp 頁面,並在這些頁面中輸出相應的提示資訊。
建立程式的首頁 index.jsp,在此頁面中編寫“新增圖書”、“修改圖書”、“刪除圖書”與“查詢圖書”的超級連結,關鍵程式碼如下:
<body>
<div align="center">
<h1>圖書資訊管理</h1>
<a href="add_book">新增圖書</a>
<a href="update_book">修改圖書</a>
<a href="delete_book">刪除圖書</a>
<a href="select_book">查詢圖書</a>
</div>
</body>
注意:index.jsp 頁面中的超級連結地址應按照 struts.xml 檔案中定義的萬用字元格式編寫,並且下劃線之前的字串是 BookAction 類中存在的方法。否則,將不能找到與之對應的返回結果頁面。
單擊 index.jsp 頁面中的超級連結,將進入相應的 JSP 頁面,如單擊“查詢圖書”超級連結,請求地址為 "/select_book",其返回結果為 book_select.jsp 頁面。