Struts2框架學習之二 action詳解
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
前言
在struts 2中,action是其核心功能,使用struts 2框架,主要的開發都是圍繞action進行的,我們編寫的action通常需要實現com.opensymphony.xwork2.Action介面,需要實現的方法是execute方法,但是在實際的開發中,編寫的action也可以不必實現action介面,而是直接建立一個普通Java類,並新增execute方法就可以public String execute(){return "success";}
圍繞action,分為以下內容:
action屬性
動態方法呼叫
預設action配置
萬用字元對映
action屬性
action中有一個對映框架,主要是講url對映到對應的action類,action的配置主要在struts.xml檔案中編寫,所有action的屬性如下:
屬性 | 是否必需 | 說明 |
---|---|---|
name | 是 | action的名字,用於匹配請求的url |
class | 否 | Action實現類的完整類名 |
method | 否 | 呼叫Action實現類中指定的方法 |
converter | 否 | 應用於action型別轉換器的完整類名 |
需要注意的是,action的name屬性一般不允許出現.
或者/
或者-
的。但是下劃線是可以的。另外,如果在配置檔案中沒有為action配置class完整類名,那麼框架會呼叫ActionSupport類中execute方法,該方法的實現僅僅是返回一個SUCCESS
下面重點對method屬性進行說明
通常action的作用是完成一個功能點,但是例如CRUD這樣的操作使用四個action類顯然不划算,在struts 2中可以將這四個功能對映到一個action中進行處理,這裡就需要使用method屬性了。具體的做法是:在struts.xml配置檔案中為一個action使用method屬性和name屬性指定不同別名,就可以實現CRUD對映到同一個action了。
比如有一個使用者管理模組,需要對使用者進行增加、修改、刪除和查詢,我們首先建立UserAction類,如下:
package action;import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport{ private static final long serialVersionUID = 1L; //查詢所有使用者 public String list() throws Exception { return SUCCESS; } //修改使用者資訊 public String update(){ return SUCCESS; } //刪除使用者資訊 public String delete(){ return SUCCESS; } //新增使用者 public String add(){ return SUCCESS; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
要注意的是,在action中並非一定需要execute方法,也可以指定自己需要的方法,action編寫完畢後,就需要在struts.xml檔案中編寫配置檔案了,如下:
<package name="user" namespace="/user" extends="struts-default"> <action name="list" class="action.UserAction" method="list"> <result>/list.jsp</result> </action> <action name="add" class="action.UserAction" method="add"> <result>/add.jsp</result> </action> <action name="delete" class="action.UserAction" method="delete"> <result>/delete.jsp</result> </action> <action name="update" class="action.UserAction" method="update"> <result>/update.jsp</result> </action> </package>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
這裡,通過使用別名的方式把多個業務功能對映到一個action中的不同方法,這是方式雖然有點笨拙,但是邏輯清晰,一目瞭然,但是在框架中國還提供了不同編寫配置檔案也能對映到action中的不同方法,這就是下面要講的動態方法呼叫(Dynamic Method Invocation ,簡稱DMI)。
動態方法呼叫
所謂動態方法呼叫是指在action的名字中使用感嘆號!
標識需要呼叫的方法名,呼叫格式是actionName!actionMethod.action
,通過這種方式就可以實方法的動態呼叫了,下面對這一結論做一個測試,首先把配置檔案做一點小的修改:
<package name="user" namespace="/user" extends="struts-default"> <action name="userAction" class="action.UserAction"> <result name="success">/list.jsp</result> <result name="update">/update.jsp</result> <result name="add">/add.jsp</result> </action> <!-- <action name="add" class="action.UserAction" method="add"> <result>/add.jsp</result> </action> <action name="delete" class="action.UserAction" method="delete"> <result>/delete.jsp</result> </action> <action name="update" class="action.UserAction" method="update"> <result>/update.jsp</result> </action> --> </package>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
然後對UserAction修改如下:
//查詢所有使用者 public String list() throws Exception { return SUCCESS; } //修改使用者資訊 public String update(){ return "update"; } //刪除使用者資訊 public String delete(){ return null; } //新增使用者 public String add(){ return "add"; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
下面是測試結果:
需要注意的是,儘管DMI給開發帶來了諸多遍歷,但是存在安全隱患,由於可以通過url直接放完action中任意方法,所以很容易受到惡意攻擊。在這種情況下需要使用安全控制機制。
關於method屬性與DMI應該使用哪種方式的問題,可以簡要總結如下:如果一個action中的不同方法使用相同的配置(相同的result和攔截器配置),那麼可以使用DMI;否則使用method屬性在struts.xml檔案中進行配置。
預設的action
預設的action是在訪問一個不存在的action的時候訪問的action,配置預設action,只需要在package中新增如下配置:
<package name="default" namespace="/" extends="struts-default"> <default-action-ref name="hello"/> <!-- HelloWorld演示程式 --> <action name="hello" class="example.HelloWorld"> <result>/index.jsp</result> </action> </package>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
這裡的action配置在package下面,需要注意的是:每個package可以一個預設的action,但是每個namespace應該只有一個預設的action,因為使用多個的話,框架不知道訪問預設的action。
萬用字元對映
使用萬用字元對映的方式可以大大減少action的數量,所謂萬用字元就是使用*,用於匹配0個或多個字元。在action的配置中,可以為name屬性使用*來匹配任意的字元。比如下面的配置:
<action name="edit*" class="action.Edit{1}Action"> <result>/{1}.jsp</result> </action>
- 1
- 2
- 3
{1}會被name屬性中的*的內容填充,比如在瀏覽器中訪問/editUser,會對映到action.EditUserAction類,返回到User.jsp頁面中。其中的{1}實際上就是作為佔位符的,大括號的值可以是0-9,其中{0}代表整個請求URL。比如下面的配置:
<action name="*_*" class="action.{1}Action" method="{2}"> <result>/{1}_{2}.jsp</result> </action>
- 1
- 2
- 3
當訪問User_list的時候,會對映到UserAction類,訪問UserAction中的list方法,返回的結果頁面是User_list.jsp。