簡述STRUTS2 Convention零配置

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插件而言,它會自動搜索位於actionactionsstrutsstruts2包下的所有java類,Convention插件會把如下兩種java類當成Action處理:

1)  所有實現了com.opensymphony.xwork2.Actionjava

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.locatorsstruts.convention.action.packages兩個常量的作用比較微妙,開發者在利用這兩個常量時務必小心。

如:下面Action所在包被映射的命名空間如下:

com.fun.actions.LoginAction 映射到   /

com.fun.actions.myoffice.CarInfoAction 映射到 /myoffice

com.fun.struts.myoffice.EntINfoAction 映射到 /myofiice

4.       映射Actionname時,遵循如下兩步規則

1)  如果該Action類名包含Action後綴,將該Action類名的Action後綴去掉。否則不做任何處理。

2)  Action類名的駝峯寫法(每個單詞首字母大寫、其他字母小寫的寫法)轉成中畫線寫法(所有字母小寫,單詞與單詞之間以中畫線隔開)

如:LoginAction映射的Acionname屬性爲loginGetBooks映射的Actionname的屬性爲get-booksAddEmployeeAction映射的Actionname屬性爲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

如,第一個ActionOneAction,裏面有個方法返回爲“two,那麼就得保證,WEB-INF/content/下沒有one.jspone-two.jsp 對於第二個action 它的名字應該是OneTwoAction,而對應的url應該是:“one-two.action

注意:由於Convention插件根據Actionjsp頁面來動態生成映射的,因此不管是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.       ConventionAnnotation

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組成數組後作爲@Actionresults屬性值。這種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組成數組後作爲@ActionexceptionMappings屬性值,這種異常定義僅對被修飾的方法有效。

 

11.攔截器配置相關的Annotation

 與攔截器配置的Annotation@InterceptorRef@InterceptorRefs@DefaultInterceptorRef

@InterceptorRefs用於組織多個@InterceptorRef,因此它只需要指定一個value屬性值,該value屬性值爲多個@InterceptorRef

@InterceptorRef用於爲指定Action引用lanjieq或者是攔截器棧。也就相當於strut.xml中位於<action../>元素內部的<interceptor-ref../>子元素的作用。使用@InterceptorRefAnnotation時,必須制定一個value屬性,用於指定所引用的攔截器或攔截器棧的名字。相當於<interceptor-ref../>子元素裏name屬性的作用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章