Struts2 零配置----詳解
從struts2.1開始,struts2再也不推薦使用Codebehind做爲零配置插件,而是改成使用Convention插件來支持零配置,和Codebehind相比,Convention插件更完全,該插件徹底拋棄配置信息,不只不須要是使用struts.xml文件進行配置,甚至不須要使用Annotation進行配置,而是由struts2根據約定自動配置。
如何使用Convention
1. 將struts-Convention-plugin-2.1.6.jar文件複製到WEB-INF/lib路徑下
2. 對於Convention插件而言,它會自動搜索位於action,actions,struts,struts2包下的全部java類,Convention插件會把以下兩種java類當成Action處理:
1) 全部實現了com.opensymphony.xwork2.Action的java類
2) 全部類名以Action結尾的java類
3. Convention插件還容許設置以下三個常量:
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.action.packages:Convention插件以該常量指定包做爲根包來搜索Action類。Convention插件除了掃描action,actions,struts,struts2四個包的類之外,還會掃描該常量指定的一個或多個包,Convention會試圖從中發現Action類。
注意: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類裏的方法,用於將該方法映射到多個URL.@Actions用於組織多個@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屬性的做用。
歡迎關注本站公眾號,獲取更多信息