Struts2的Convention插件與“約定”支持
Convention插件的主要特點是“約定優于配置”。
Action的搜索和映射約定
為了能夠使用Convention插件,必須在Struts 2 應用中安裝Convention插件,即將Struts2-convention-plugin.jar文件復制到Struts 2應用的WEB-INF/lib路徑下。
對于convention插件而言,他會對以下兩種java類的Action處理:
1、 所有實現了com.opensymphony.xwork2.Action的java類
2、 所有類名以Action結尾的java類
Struts 2的convention插件還允許設置如下三個常量
常量 |
說明 |
Struts.convention.exclude.packages |
指定不掃描那些包的java類,位于這些包結構下的java類將不會被自動映射成Action |
Struts.convention.package.locators |
Convention插件使用該常量指定的包作為搜索Action的根包。如:對于action.user.LoginAction類,按約定本應映射到/user/login; 如果將該常量設置為user,則該Action將會映射到/login |
Struts.convention.action.packages |
Convention插件以該常量指定包作為根包來搜索Action類。 |
當找到合適的Action類后,Convention插件將會按照約定部署這些Action。部署Action時,actions、action、struts、struts2包會映射成根命名空間,而這些包下的子包則會被映射成對應的命名空間。
如:
Com.app.action.books.GetBooks 映射到/books
Com.app.action.RegistAction 映射到/
Com.app.action.struts.manage.user.UserAction 映射到/manage/user
按約定映射name屬性
Action的name屬性(即該action所要處理的URL),根據該Action的類名映射,映射Action的name時,需要遵循如下兩個步驟:
1、 如果該Action類名包含Action后綴,就將該Action類名的Action后綴去掉。否則就不會做任何處理
2、 將Action類名的寫法(每個單詞首字母大寫、其他字幕小寫)轉成中劃線寫法(有字母小寫,單詞與單詞之間用中劃線隔開)。
如:
Com.app.action.LoginAction 映射到:/login.action
Com.app.action.user.loginAction 映射到:user/login.action
Com.app.action.user.loginRegistAction 映射到:user/login-regist.action
對于Action類的代碼依然不需要做任何的改變。
按約定映射result
Action處理用戶請求后會返回一個字符串作為邏輯視圖,該邏輯視圖必須映射到實際的物理視圖。Convention默認也作為邏輯視圖和物理視圖之間的映射提供了約定
默認情況下,convention總會到Web應用的WEB-INF\content路徑下定位物理資源。故定位資源約定為、:actionName+resultCode+suffix。當某個邏輯視圖找不到對應的視圖資源是,convention會自動試圖使用actionName+suffix作為物理視圖資源
如:假定所有的結果類型全部為:Dispatcher
Action的URL |
返回的邏輯視圖名 |
對應的物理視圖 |
/login |
success |
\WEB-INF\content\login-success.jsp |
/user/login |
success |
\WEB-INF\content\user\login-success.jsp |
/user/regist |
error |
\WEB-INF\content\user\regist-error.jsp |
Action鍵的約定
如果想一個Action處理結束后不是進入視圖頁面,而是進入另一個Action形成Action鏈。則只需要遵守下面三個約定:
1、第一個Action返回的邏輯視圖字符串沒有對應的視圖資源。
2、第二個Action與第一個Action處于同一個包下。
3、第三個Action映射的URL為:firstactionname+resultcode
下面是一個實例:
第一個Action處理用戶請求后、轉到第二個Action繼續處理。再由第二個Action轉到視圖頁面,并打印相應的信息
第一個Action:FirstActionjava
public class FirstAction extends ActionSupport{ private String tip1; public String getTip1() { return tip1; } public void setTip1(String tip1) { this.tip1 = tip1; } public String execute(){ setTip1("第一個action提示"); return "second"; } }
該Action處理用戶請求后返回“second”字符串,為了讓該Action處理結束后進入第二個Action。對于這個返回的字符串,第二個Action的映射的URL應為:first-second。
所以第二個Action的類名為:FirstSecondAction。
下面是第二個Action:FirstSecondAction.jsp
public class FirstSecondAction extends ActionSupport { private String tip2; public String getTip2() { return tip2; } public void setTip2(String tip2) { this.tip2 = tip2; } public String execute() throws Exception { setTip2("第二個action 提示...."); return SUCCESS; } }
當firstAction處理用戶請求之后,系統將會自動調用FirstSecondAction處理用戶請求。然后轉到視圖資源。
第一個jsp頁面:thefirst.jsp點擊按鈕后,轉到第一個action處理用戶請求 該Action=”first“
<form action="first"> <input type="submit" value="點擊鏈接第二個action"> </form>
第二個jsp頁面:第二個視圖資源。當第二個Action處理用戶請求完后,轉到該視圖資源。并打印相應的信息 。
由于第二個Actiond的result的映射是:first-second-success。所以該視圖資源的名字為:first-second-success.jsp
${tip1 }<Br /> ${tip2 }<br />
將會得到下面的顯示頁面:
讀李剛《輕量級java EE企業應用實戰(第三版)—struts 2+Spring 3+Hibernate整合開發》