Struts2 <action>元素:建立Action物件的對映

2020-07-16 10:04:56
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 頁面。