Struts2配置詳解_配置Action


Struts2配置詳解_配置Action

分類: ssh

Struts2的核心功能是action,對於開發人員來說,使用Struts2主要就是編寫action,action類通常都要實現com.opensymphony.xwork2.Action接口,並實現該接口中的execute()方法。

該方法如下:

public String execute() throws Exception

Struts2並不是要求所有編寫的action類都要實現Action接口,也可以直接編寫一個普通的Java類作為action,只要實現一個返回類型為String的無參的public方法即可:

public String xxx()

在實際開發中,action類很少直接實現Action接口,通常都是從com.opensymphony.xwork2.ActionSupport類繼承,ActionSupport實現了Action接口和其他一些可選的接口,提供了輸入驗證,錯誤信息存取,以及國際化的支持,選擇從ActionSupport繼承,可以簡化action的定義。

開發好action之后,好需要對action進行配置,以告訴Struts2框架,針對某個URL的請求應該交由哪個action進行處理。

 

 

1. Action映射:
action映射是Struts2框架中的基本” 工作單元”,action映射就是將一個請求URL(即action的名字)映射到一個action類,當一個請求匹配某個action的名字時,框架就使用這個映射來確定如何處理請求。
action元素的完整屬性表

屬性

是否必須

說明

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方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM