從struts2.1開始,struts2引入了Convention插件來支持零配置,從而使struts2根據約定來自動配置,不再使用struts.xml進行配置。
使用Convention插件的前提條件:將struts2-convention-plugin-2.2.1.jar文件復制到應用的WEB-INF/lib目錄下。
Convention插件,它會自動搜索位於action、actions、struts、struts2包下的所有Java類,它會把如下兩種Java類當成Action處理:
1.所有實現了com.opensymphony.xwork2.Action的Java類。
2.所有類名以Action結尾的Java類。
Convention插件允許設置的3個常量:
1.struts.convention.exclude.packages:指定不掃描那些包下的Java類,這些包下的Java類將不會自動映射成Action。
2.struts.convention.package.locators: Convention插件使用該常量指定的包作為搜索Action的根包。即用這個屬性修改Convention插件默認的搜索包action、actions、struts、struts2。 例如:對於action.lee.Loginn類,按約定映射到/lee/login;如果將該常量設為lee.則該Action類將映射到/login.
3.struts.convention.action.packages:指定除插件本身默認的搜索action、actions、struts、struts2包以外的其它包。
(注意struts.convention.package.locators和struts.convention.action.packages的區別)
映射Action的name時,遵循如下兩步規則:
1.果該Action類名包含Action后綴,將該Action類名的Action后綴去掉。否則不做任何處理。
2.Action類名的駝峰寫法(每個單詞首字母大寫、其他字母小寫的寫法)轉成中畫線寫法(所有字母小寫,單詞與單詞之間以中畫線隔開)例如: LoginAction映射的Acion的name屬性為login,GetBooks映射的Action的name的屬性為get-books,AddEmployeeAction映射的Action的name屬性為add-employee
按約定映射Result
Action處理用戶用戶請求之后都會返回一個字符串作為邏輯視圖,該邏輯視圖必須映射到實際的物理視圖。Convention插件默認也為作為邏輯視圖和物理視圖之間的映射提供了約定。
默認情況下,Convention插件總會到WEB-INF/content路徑下定位物理資源,定位資源的約定是:actionName+result+suffix.當某個邏輯后視圖找不到對應的物理視圖時,Convention插件會自動試圖使用actionName+suffix作為物理資源。 例如:zj.qiao.actions.user.LoginAction類,返回success字符串時,Convention將優先考慮使用WEB-INF/content/user/login-success.jsp作為視圖資源,如果找不到,WEB-INF/content/user/login.jsp也可作為對應的視圖資源。
Convention的Annotation
1.Action相關的兩個Annotation是@Action 和@Actions
2.Action中可指定一個value屬性。類似於指定<action name=””/>屬性值
3.Action中還可以指定一個params屬性,該屬性是一個字符串數組,用於該Acion指定的參數名和參數值。params屬性應遵守如下格式:{“name1”,”value1”,”name2”,”value2”}
4.Actions 也用於修飾Action類里的方法,用於將該方法映射到多個URL.@Actions用於組織多個@Action.因此它可將一個方法映射成多個邏輯Action。
例如如下代碼:
1 package com.fun.actions; 2 3 4 5 6 7 8 import org.apache.struts2.convention.annotation.Action; 9 import org.apache.struts2.convention.annotation.Actions; 10 11 12 import com.fun.service.LoginService; 13 import com.opensymphony.xwork2.ActionSupport; 14 15 16 public class LoginAction extends ActionSupport { 17 private String str; 18 @Actions({ 19 @Action(value="login1",params={"str","注入的值"}), 20 @Action(value="login2") 21 22 }) 23 public String login(){ 24 return "str"; 25 } 26 @Action(value="ggg") 27 public String abc(){ 28 return "abc"; 29 } 30 public String getStr() { 31 return str; 32 } 33 public void setStr(String str) { 34 this.str = str; 35 } 36 37 }
我們可以通過/login1.action訪問,而在訪問時,str這個屬性已經有值,為str=”注入的值 返回的視圖是login1-str.jsp
當我們用/login2.action訪問時,str的值為null。返回的視圖為 login2-str.jsp
而我們通過/ggg.action調用的是abc()方法,返回的視圖為/ggg-abc.jsp
與Result配置相關的Annotation
1.ResultPath @Result 和Results
2.Results用於組織多個@Result因此它只需指定一個value屬性值,該value屬性值為多個@Result
3.Result相當於struts.xml文件中的<result/>元素的做喲歐諾個。使用@Result必須指定一個name屬性,相當於<result name=””/>另外,它還有幾個可選的屬性。
type 相當於<result type=””/>指定返回視圖資源的類型
location 相當於<result>…..</result>中間部分,用於指定實際視圖位置
params:該屬性相當於<result/>元素里多個<param../>子元素的作用,用於為該Result指定參數值。該屬性應滿足{“name1”,”value1”,”name2”,”value2”}格式
4.Result有以下兩種用法
Action級的Result映射:以@Actions組合多個@Action后修飾的Action類。這種Result映射對該Action里的所有方法都有效。
方法級Result映射:將多個@Result組成數組后作為@Action的results屬性值。這種Result映射僅對被修飾的方法有效。
5.ResultPath則用於修飾包和Action類,用於改變被修飾Action所對應的物理視圖資源的根路徑。舉例說:默認情況下,Convention都會到WEB-INF/content路徑下找物理視圖資源,一旦我們使用@ResultPath(“/abc”)修飾該Action,系統將回到abc目錄下尋找物理視圖資源。舉例:在默認情況下,Convention都會到WEB-INF/content路徑下需找物理視圖資源,一旦我們使用@ResultPath(“/abc”)修飾該Action,系統會到abc目錄下尋找物理視圖資源。
