Struts2中使用Convention Plugin(CP)實現零配置。html
零配置並非沒有配置,而是經過約定來實現配置最小化,也就是人們常說的約定大於配置。java
使用CP能夠實現零配置。jsp
1,CP中,struts.convention.result.path配置能夠指定結果頁面文件存放的目錄,默認的目錄是/WEB-INF/content/,經過在struts.xml中配置:spa
<constant name="struts.convention.result.path" value="/WEB-INF/mytemplates/"/>
將頁面文件目錄指定成/WEB-INF/mytemplates/目錄 (struts.xml是struts的主配置文件,它將覆蓋其它依賴的配置文件中相同的配置項).net
固然,也能夠指定絕對路徑(從/WEB-INF/目錄開始的路徑),所以能夠不須要此配置。建議使用絕對路徑以更清晰的指定輸出的頁面文件路徑。設計
2,CP會自動掃描包名中存在struts、struts2、action或actions的(1),類名以Action結尾的(2),並實現了com.opensymphony.xwork2.Action類(3)的全部action類(這裏把(1)(2)(3)稱爲action的三要素)。這是CP掃描類的規則,這個規則也能夠經過配置更改,但不建議更改,通常來講使用默認的足夠了,應該儘可能使程序簡單化。code
3,如何訪問那些Actions?xml
在之前那種配置文件中,訪問action須要namespace和action的資源名稱兩項htm
就以類com.example.actions.admin.IndexAction爲例繼承
首先它符合action三要素:包名存在actions關鍵字,類名以Action結尾,而且實現了com.opensymphony.xwork2.Action(假設),因此這個類可以被CP掃描到。
這個類的的namespace是什麼?在CP中,namespace是在包名中以actions(或其它3個)開始以後的部分,如本例中的便是/admin
如何定位這個action的資源名稱?按CP規則,類去掉Action,而後將大寫字母轉成小寫,即獲得它的資源名稱,如例中的資源名稱是index。若是類名存在多個大寫字母,如MyIndexAction,則全部轉換成小寫後以’-’分割,即my-index。
至此,能夠定位這個action的資源位置爲:/admin/index.action(以action結尾是struts2的默認規則)
4,Action能夠返回html頁面,jsp頁面,或者FreeMarker、Velocity這樣的模板頁面。如何定義返回內容?經過註解!
5,CP中一樣也支持了大量的註解(Annotations),如@Action ,@Actions ,@Results,@Result ,@Namespace ,@ResultPath等,
建議不須要學那麼多,@Results,@Result 就足夠了,由於使用太多註解爲使程序複雜化,增長之後維護成本。簡單性是程序設計追求的第一原則。
在類級別定義返回結果內容,例如
@Results({ @Result(name="success", location="success.jsp"), @Result(name="error", location="error.ftl", type="freemarker") }) public class TestAction extends ActionSupport { public String execute() { return SUCCESS; } public String error() { return ERROR; } }
TestAction定義了兩個結果類型,一個是返回success的index.jsp,另外一個是返回error的error.ftl模板頁。
在方法級別也能夠定義返回結果,但不建議(使程序複雜化了)。
6,最後,當咱們使用CP時,若是要加入本身的攔截器或者進行異常處理,則須要定義一個本身package,並繼承convention-default package(這個package是導入CP後成爲主package,它繼承了struts-default),同時還要將struts.convention.default.parent.package配置將本身的package定義成主package。
建議你們儘可能使用CP的默認的配置,以最大程度實現零配置!
純我的經驗之談,歡迎交流~