Struts2的核心功能是action,對於開發人員來講,使用Struts2主要就是編寫action,action類一般都要實現com.opensymphony.xwork2.Action接口,並實現該接口中的execute()方法。web
該方法以下:安全
public String execute() throws Exception框架
Struts2並非要求全部編寫的action類都要實現Action接口,也能夠直接編寫一個普通的Java類做爲action,只要實現一個返回類型爲String的無參的public方法便可:less
public String xxx()jsp
在實際開發中,action類不多直接實現Action接口,一般都是從com.opensymphony.xwork2.ActionSupport類繼承,ActionSupport實現了Action接口和其餘一些可選的接口,提供了輸入驗證,錯誤信息存取,以及國際化的支持,選擇從ActionSupport繼承,能夠簡化action的定義。ide
開發好action以後,好須要對action進行配置,以告訴Struts2框架,針對某個URL的請求應該交由哪一個action進行處理。spa
1. Action映射:
action映射是Struts2框架中的基本」 工做單元」,action映射就是將一個請求URL(即action的名字)映射到一個action類,當一個請求匹配某個action的名字時,框架就使用這個映射來肯定如何處理請求。
action元素的完整屬性表orm
屬性xml |
是否必須繼承 |
說明 |
name |
是 |
action的名字,用於匹配URL |
class |
否 |
Action實現類的完整類名 |
method |
否 |
執行Action類時調用的方法 |
convert |
否 |
應用於action的類型轉換的完整類名 |
例如:
<action name="user" class="org.lesson05.UserAction">
<result name="success">/user.jsp</result>
</action>
2. 使用method屬性
在配置action時,咱們能夠經過action元素的method屬性來指定action調用的
方法,所指定的方法,必須遵循與execute方法相同的格式。
在Struts2.xml文件中,咱們能夠爲同一個action類配置不一樣的別名,並使用
method屬性。
在Struts.xml文件中爲同一個Action類配置不一樣的別名
<!-- 使用method屬性 -->
<package name="methods" namespace="/"
extends="struts-default">
<!-- 對應着MethodAction裏面的execute方法 -->
<action name="list" class="org.lesson05.MethodAction">
<result name="success">/Methods/list.jsp</result>
</action>
<!-- 對應着MethodAction裏面的add方法 -->
<action name="add" class="org.lesson05.MethodAction"
method="add">
<result name="success">/Methods/add.jsp</result>
</action>
<!-- 對應着MethodAction裏面的edit方法 -->
<action name="edit" class="org.lesson05.MethodAction"
method="edit">
<result name="success">/Methods/edit.jsp</result>
</action>
<!-- 對應着MethodAction裏面的delete方法 -->
<action name="delete"
class="org.lesson05.MethodAction"
method="delete">
<result name="success">/Methods/delete.jsp</result>
</action>
</package>
對應的MethodAction類,代碼以下:
importcom.opensymphony.xwork2.ActionSupport;
public class MethodAction extends ActionSupport
{
@Override
public String execute() throws Exception
{
return SUCCESS;
}
public String add() throws Exception
{
return SUCCESS;
}
public String edit() throws Exception
{
return SUCCESS;
}
public String delete() throws Exception
{
return SUCCESS;
}
}
使用action的method屬性能夠任意指定處理請求的方法(只要該方法和execute
方法具備相同的格式),這樣就能夠在同一個類中完成相關的任務,而不須要去編寫不
同的Action類。
注意:Struts2在根據action元素的method屬性查找方法時有兩種途徑:
1.查找與method屬性值徹底一致的方法.
2.查找doMethod()形式的方法.
3.動態方法調用:
另一種無需配置就能夠直接調用Action中的非execute方法的方式,是使用
Struts2的動態方法調用。
動態方法調用是在action的名字中使用感嘆號(!)來標識要調用的方法名,其語法格
式爲 actionName!methodName.action
例如,咱們配置了以下的action
<action name="user" class="org.lesson05.UserAction">
<result name="success">/Methods/list.jsp</result>
</action>
當請求/user!delete.action時,就會自動調用UserAction中的delete()方
法
提示,這種調用方式會帶來安全隱患!
4.模擬Struts1中的ForwardAction
<action name="user">
<result>/index.jsp</result>
</action>
這樣寫就能夠了.
5.默認的action
若是請求一個不存在的action,結果將是HTTP404錯誤。在Struts2中,能夠指定一個默認的action,若是一個請求沒有其餘的action匹配,那麼默認的action將被執行。
默認的action使用default-action-ref元素來聲明,以下所示:
<!-- 默認action -->
<package name="defaultAction" namespace="/default"
extends="struts-default">
<default-action-ref name="error"></default-action-ref>
<action name="defaultaction"
class="org.lesson05.DefaultAction">
<result name="success">/defaultAction.jsp</result>
</action>
<action name="error">
<result>/error.jsp</result>
</action>
</package>
注意:根據struts-2.0.dtd中定義的package元素的內容模型,
default-acion-ref必須在action元素以前使用。
若是請求的是/default/defaultaction1.action,框架找不到映射到defaultaction1的action,那麼名爲error的action將被調用。
注意:每一個包中均可以有它本身默認的action,可是每個名稱空間應該只有一個默認action。若是具備相同名稱空間的多個包中都聲明瞭默認action,那麼哪個action纔是默認的將沒法保證。
注意:默認action只對action的訪問有效。若是你訪問一個非action的資源,例如/user.jsp,而該頁面不存在,這時仍會看到HTTP404錯誤。若是想爲整個Web應用程序指定默認頁面,須要在web.xml文件中對HTTP404錯誤指定相應的錯誤處理頁面。
6.通配符映射
隨着Web應用程序的增長,所需的Action也會更多,從而致使大量的action映射,使用通配符能夠減小action配置的數量,使一些具備相似行爲的Action或者Action方法可使用通用的樣式來配置。
通配符即星號(*),用於匹配0個或多個字符,在配置action時,能夠在action元素的name屬性中使用星號(*)來匹配任意的字符。
如下是在action映射中使用通配符:
<action name="news*"
class="org.struts2.lesson05.News{1}Action">
<result name="success">/WEB-INF/News/{1}.jsp</result>
</action>
咱們在action元素的name屬性中使用了通配符(*),容許這個映射匹配全部以/news開始的URL,例如/newsAdd,/newsEdit,/newsDelete,可是,若是請求的是/newsEdit/add,那麼這個映射就不會被匹配。
在上面,有一個特殊的記號{1},這是做爲佔位符使用的,它將被通配符所匹配的值替換,例如訪問/newsEdit,通配符(*)匹配的部分是Edit,那麼,這個值將替換{1},最終調用的類是org.struts2.lesson05.NewsEditAction,Action
執行成功後導向的結果頁面是/WEB-INF/News/Edit.jsp。
在action映射和action結果中,通配符匹配的值能夠用記號{N}來訪問,N是從1到9的數字,指出替換的是哪個通配符匹配的值。整個請求URL能夠用記號{0}來訪問。例如以下的action映射:
<action name="*_*" class="org.struts2.lesson05.{1}Action"
method="{2}">
<result>/WEB-INF/News/{0}.jsp</result>
</action>
當訪問/News_delete時,name屬性中的第一個」*」匹配News,第二個」*」匹配delete,class屬性中使用的記號是{1},因此被News所替換,method屬性中使用的記號是{2},因而被delete所替換。結果映射中使用的記號是{0},因而被整個URL替換,即News_delete所替換。整個替換後的結果是:當請求/News_delete時,框架調用NewsAction實例的delete方法對請求進行處理。執行成功後,請求被導向到/WEB-INF/News/News_delete.jsp頁面。
通配符方法設置的另外一種常見方式是使用後綴通配符,即將」*」放在action名字的後面,在」*」和名字前綴之間使用一個特殊字符做爲分隔,經常使用的特殊字符是下劃線(_),固然也可使用其餘字符。例如:
<action name="News_*"
class="org.struts2.lesson05.NewsAction" method="{1}">
<result>/WEB-INF/News/{0}.jsp</result>
</action>
當請求/News_delete時,調用的是NewsAction實例的delete方法,當請求/News_edit的時候,調用的是NewsAction實例的edit方法。