1. 程式人生 > >Struts2框架學習之二 action詳解

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";}

。還有一種方式是整合ActionSupport類,該類位於com.opensymphony.xwork2下,其實現了Action介面的execute方法。以上方式後面兩種方式是最常用的。

圍繞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

,相當於是轉發了,所以這點實際上與struts 1中的ActionForward的作用是一致的。所以我們可以這個特性,實現僅僅需要完成轉發功能的action,這點比使用ActionForward方便多了。

下面重點對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。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述