Struts2 零配置 詳解(struts-Convention-plugin)
轉載請註明原出處(不是本文,是記錄在文最下方的原出處)
從struts2.1開始,struts2不再推薦使用Codebehind作為零配置外掛,而是改為使用Convention外掛來支援零配置,和Codebehind相比,Convention外掛更徹底,該外掛完全拋棄配置資訊,不僅不需要是使用struts.xml檔案進行配置,甚至不需要使用Annotation進行配置,而是由struts2根據約定自動配置。
如何使用Convention
1. 將struts-Convention-plugin-2.1.6.jar
2. 對於Convention外掛而言,它會自動搜尋位於action,actions,struts,struts2包下的所有java類,Convention外掛會把如下兩種java類當成Action處理:
1) 所有實現了com.opensymphony.xwork2.Action的java類
2) 所有類名以Action結尾的java類
3.
1) struts.Convention.exclude.packges:指定不掃描哪些包下的java類,位於這些包結構下的java類將不會自動對映成Action;
2) struts.convention.package.locators:Convention外掛使用該常量指定的包作為搜尋Action的根包。對於actions.fore.LoginAction類,按約定原本應對映到/fore/login;如果將該常量設為fore,則該Action將會對映到/login
3)
注意:struts.convention.package.locators和struts.convention.action.packages兩個常量的作用比較微妙,開發者在利用這兩個常量時務必小心。
如:下面Action所在包被對映的名稱空間如下:
com.fun.actions.LoginAction 對映到 /
com.fun.actions.myoffice.CarInfoAction 對映到 /myoffice
com.fun.struts.myoffice.EntINfoAction 對映到 /myofiice
4. 對映Action的name時,遵循如下兩步規則:
1) 如果該Action類名包含Action字尾,將該Action類名的Action字尾去掉。否則不做任何處理。
2) 將Action類名的駝峰寫法(每個單詞首字母大寫、其他字母小寫的寫法)轉成中畫線寫法(所有字母小寫,單詞與單詞之間以中畫線隔開)
如:LoginAction對映的Acion的name屬性為login,GetBooks對映的Action的name的屬性為get-books,AddEmployeeAction對映的Action的name屬性為add-employee
5. 預設情況下。Convention總會到WEB應用的WEB-INF/content路徑下定位物理資源,定位資源的約定是:actionRUL+resultCODE+suffix。當某個邏輯檢視找不到對應的試圖資源時,Convention會自動檢視使用ActionURL+suffix作為物理檢視資源。
如:actions.fore.LoginAction 返回success字串時,Convention優先考慮使用WEB-INF/content/fore目錄下的login-success.jsp作為檢視資源。如果找不到該檔案,login.jsp也可作為對應的試圖資源。如果返回input字串,Convention會將WEB-INF/content/fore裡面查詢login-input.jsp
6. 為了看到struts2應用裡的Action等各種資源的影射情況,struts2提供了Config Browser外掛。使用方法,將struts2-config-browser-plugin-2.1.6.jar檔案複製到struts2應用的WEB-INF/lib目錄中。
開啟首頁地址:http://localhost:8080/應用名字/config-browser/actionNames.action這裡可以看到Config Browser外掛的首頁。
注意:這裡不管開發者是否使用struts.xml檔案進行配置,一樣可以看到struts的配置資訊。
7.Action鏈的約定
如果希望一個Action處理結束後不是進入一個試圖頁面,而是進行另一個Action形成的Action鏈。通過Convention外掛則只需遵守如下三個約定即可。
1) 第一個Action返回的邏輯檢視字串沒有對應的檢視資源
2) 第二個Action與第一個Action處在同一個包下
3) 第二個Action影射的URL為:firstActionURL+resultCODE
如,第一個Action為OneAction,裡面有個方法返回為“two”,那麼就得保證,WEB-INF/content/下沒有one.jsp或one-two.jsp 對於第二個action 它的名字應該是OneTwoAction,而對應的url應該是:“one-two.action”
注意:由於Convention外掛根據Action和jsp頁面來動態生成對映的,因此不管是Acion的改變,還是JSP頁面的改變都需要Convention外掛重新載入對映。那麼只要我們為struts2應用配置如下兩個常量就可以了。
<!--配置struts2應用於開發模式--!>
<constant name=”struts.devMode” value=”true”/>
<!—配置Convention外掛自動重載入對映--!>
<constant name=”struts.convention.classes.reload” value=”true”/>
幾個重要的常量
struts.convention.action.disableJarScanning---是否從包中搜索Action
struts.convention.action.package--------Convention外掛以該常量指定包作為根包
struts.convention.result.path ---設定Convention外掛定位檢視資源的根路徑。預設值為/WEB-INF/content
struts.convention.result.flatLayout—如果是為false則可以將試圖放置Action對應的目錄下,無需放入WEB-INF/content
7. Convention的Annotation
1) 與Action相關的兩個Annotation是@Action 和@Actions
2) @Action中可指定一個value屬性。類似於指定<action name=””/>屬性值
3) @Action中還可以指定一個params屬性,該屬性是一個字串陣列,用於該Acion指定的引數名和引數值。params屬性應遵守如下格式:{“name1”,”value1”,”name2”,”value2”}
4) @Actions 也用於修飾Action類裡的方法,用於將該方法對映到多個[email protected]用於組織多個@Action.因此它可將一個方法對映成多個邏輯Action。
如:
package com.fun.actions;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
import com.fun.service.LoginService;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String str;
@Actions({
@Action(value="login1",params={"str","這是已經注入的了!"}),
@Action(value="login2")
})
public String login(){
return "str";
}
@Action(value="ggg")
public String abc(){
return "abc";
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
我們可以通過/login1.action訪問,而在訪問時,str這個屬性已經有值,為str=”這是已經注入的!” 返回的檢視是login1-str.jsp
當我們用/login2.action訪問時,str的值為null。返回的檢視為 login2-str.jsp
而我們通過/ggg.action呼叫的是abc()方法,返回的檢視為/ggg-abc.jsp
8. 與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有以下兩種用法
1 Action級的Result對映:以@Actions組合多個@Action後修飾的Action類。這種Result對映對該Action裡的所有方法都有效。
2方法級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目錄下尋找物理檢視資源。
9 與包和名稱空間相關的Annotation:
@Namespace:修飾Action類或其所在的包。該Annotation中指定一個value屬性值,用於指定被修飾的Action所在的名稱空間
@Namespaces:修飾Action類或其所在的包,用於組合多個@Namespace
@ParentPackage: 用於指定被修飾的Action所在包的夫包。
10 異常處理相關的Annotation
@ExceptionMappings 用於組織多個@ExceptionMapping,因此它只需指定一個value屬性值,該value屬性值為多個@ExceptionMapping。
@ExceptionMapping 用於定義異常類和物理檢視之間的對應關係,也相當於struts.xml檔案裡<exception-mapping../>元素的作用 使用時,必須注意以下兩個屬性:
exception: 用於指定異常類
result : 用於指定邏輯檢視
@ExceptionMpping有如下兩種用法
Action級的異常定義:以@ExceptionMappings組合多個@ExceptionMapping後修飾的Action類。這種異常定義對Action中的所有方法有效
方法級的異常定義: 將多個@ExceptionMapping組成陣列後作為@Action的exceptionMappings屬性值,這種異常定義僅對被修飾的方法有效。
11.攔截器配置相關的Annotation
與攔截器配置的Annotation有@InterceptorRef、@InterceptorRefs和@DefaultInterceptorRef
@InterceptorRefs用於組織多個@InterceptorRef,因此它只需要指定一個value屬性值,該value屬性值為多個@InterceptorRef
@InterceptorRef用於為指定Action引用lanjieq或者是攔截器棧。也就相當於strut.xml中位於<action../>元素內部的<interceptor-ref../>子元素的作用。使用@InterceptorRefAnnotation時,必須制定一個value屬性,用於指定所引用的攔截器或攔截器棧的名字。相當於<interceptor-ref../>子元素裡name屬性的作用。
原出處:(大概搜了一下,此處最早。如有更早的出處,請及時留言,我會盡快更正。謝謝)