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
1 public class FirstAction extends ActionSupport{ 2 private String tip1; 3 4 public String getTip1() { 5 return tip1; 6 } 7 8 public void setTip1(String tip1) { 9 this.tip1 = tip1;10 }11 12 public String execute(){13 setTip1("第一個action提示");14 return "second";15 }16 }
該Action處理使用者請求後返回“second”字串,為了讓該Action處理結束後進入第二個Action。對於這個返回的字串,第二個Action的映射的URL應為:first-second。
所以第二個Action的類名為:FirstSecondAction。
下面是第二個Action:FirstSecondAction.jsp
1 public class FirstSecondAction extends ActionSupport { 2 3 private String tip2; 4 5 public String getTip2() { 6 return tip2; 7 } 8 9 public void setTip2(String tip2) {10 this.tip2 = tip2;11 }12 13 public String execute() throws Exception {14 setTip2("第二個action 提示....");15 return SUCCESS;16 }17 18 }
當firstAction處理使用者請求之後,系統將會自動調用FirstSecondAction處理使用者請求。然後轉到視圖資源。
第一個jsp頁面:thefirst.jsp點擊按鈕後,轉到第一個action處理使用者請求 該Action=”first“
1 <form action="first"> 2 <input type="submit" value="點選連結第二個action">3 </form>
第二個jsp頁面:第二個視圖資源。當第二個Action處理使用者請求完後,轉到該視圖資源。並列印相應的資訊 。
由於第二個Actiond的result的映射是:first-second-success。所以該視圖資源的名字為:first-second-success.jsp
1 ${tip1 }<Br />2 ${tip2 }<br />
將會得到下面的顯示頁面:
讀李剛《輕量級java EE公司專屬應用程式實戰(第三版)—struts 2+Spring 3+Hibernate整合開發》