開始Struts2最經常使用的幾個註解的學習吧。
html
@Actionjava
使用@Action註解改變Convention plug約定的action與url之間的映射關係。apache
廢話少說代碼說事兒。瀏覽器
package com.ponpon.actions; import org.apache.struts2.convention.annotation.Action; import com.opensymphony.xwork2.ActionSupport; public class myAction extends ActionSupport { @Action("/v1/url") public String execute() { return SUCCESS; } }
本例***贇tring execute()方法上使用了@Action("/v1/url"),它改變了Action 與Action URL之間的映射關係,而這種改變並非「OverWrite」而是在原來約定的基礎上增長了另一種調用方式。
服務器
本來在沒有@Action("/v1/url")註解的狀況下,咱們能夠在瀏覽器中輸入:http://應用服務器ip:端口/應用/myaction,便可訪問到com.ponpon.actions.myAction,並最終顯示http://應用服務器ip:端口/應用/myaction.jsp頁面。(固然這裏也多是html等頁面)。jsp
在@Action("/v1/url")註解的狀況下,除了上述的訪問方式外,咱們還能夠在瀏覽器中輸入:http://應用服務器ip:端口/應用ide
/v1/url,也可訪問到com.ponpon.actions.myaction,但最終顯示http://應用服務器ip:端口/應用/v1/url.jsp頁面。學習
使用@Action註解解決一個ACTION中的一個方法,響應多個不一樣的URL.字體
實際項目開發過程當中有很大的概率碰到Action的處理相同,可是最終跳轉的頁面不一樣的狀況。將@Actions和@Action組合起來用便可解決這樣的需求。
url
仍是先上代碼
package com.ponpon.actions; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Actions; import com.opensymphony.xwork2.ActionSupport; public class myaction1 extends ActionSupport { private String message; public String getMessage() { return message; } @Actions( { @Action("/one/url"), @Action("/another/url") }) public String execute() { message = "myaction1 execute()"; return SUCCESS; } }
本例***贇tring execute()方法上使用了@Actions和@Action註解。其中@Actions註解包含@Action("/one/url")和@Action("/another/url")註解。這樣的註解除了能夠經過http://應用服務器ip:端口/應用/myaction1訪問com.ponpon.actions.myaction1,並最終顯示http://應用服務器ip:端口/應用/myaction.jsp以外,還有兩種訪問方式:
即:
經過http://應用服務器ip:端口/應用/one/url,訪問com.ponpon.actions.myaction1,並最終顯示http://應用服務器ip:端口/應用/one/url.jsp。
經過http://應用服務器ip:端口/應用/another/url,訪問com.ponpon.actions.myaction1,並最終顯示http://應用服務器ip:端口/應用/another/url.jsp。
這樣就達到了一個ACTION中的一個方法,響應多個不一樣的URL的效果。
使用@Action註解解決一個ACTION中的多個方法,其中每一個方法響應不一樣的URL.
這是實際項目開發過程當中最經常使用的。
再上一個代碼示例:
package com.ponpon.actions; import org.apache.struts2.convention.annotation.Action; import com.opensymphony.xwork2.ActionSupport; public class myaction2 extends ActionSupport { private String message; public String getMessage() { return message; } @Action("/v1/url") public String execute() { message = "myaction2 execute()!"; return SUCCESS; } @Action("url") public String doSomething() { message = "myaction2 doSomething()!"; return SUCCESS; } }
本例***贇tring execute()方法上使用了@Action("v1/url")註解。在StringdoSomething()方法中使用了@Action("url")。前者能夠經過http://應用服務器ip:端口/應用/v1/url訪問com.ponpon.actions.mycation2中的execute()方法,並最終顯示http://應用服務器ip:端口/應用/v1/url.jsp。後者是經過http://應用服務器ip:端口/應用/url來訪問com.ponpon.actions.myaction2中的doSomething()方法,並最終顯示http://應用服務器ip:端口/應用/url.jsp。
這個例子裏面須要注意的是@Action("/v1/url")和@Action("url")的不一樣,在「url」前並無「/」這意味着"url"是基於myaction2的命名空間的。假設myaction2所在的包是com.ponpon.actions.aaa,那麼,只有經過http://應用服務器ip:端口/應用/aaa/url才能夠訪問到com.ponpon.actions.aaa.myaction2,並最終顯示http://應用服務器ip:端口/應用/aaa/url.jsp。而「/v1/url」是基於「/」命名空間的。
在上文中,對於結果頁面採用Convention Plugin的約定,可是這一節須要利用@Results和@Result改變一下這種約定。以及@Results和@Result對類和方法進行註解後所產生的效果。
仍是先看一段代碼:
package com.ponpon.actions; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; import com.opensymphony.xwork2.ActionSupport; @Results( { @Result(name = "global", location = "/global.jsp") }) public class myaction3 extends ActionSupport { @Action(value = "/v1/url", results = { @Result(name = SUCCESS, location = "/v1/success.jsp"), @Result(name = "failure", location = "/v1/fail.jsp") }) public String execute() { if (System.currentTimeMillis() % 3 == 0) { return "failure"; } else if (System.currentTimeMillis() % 3 == 1) { return SUCCESS; } else { return "global"; } } @Action("globalTest") public String global() { return "global"; } @Action(value = "globalOverWrite", results = { @Result(name = "global", location = "/v1/globalOverWrite.jsp") }) public String globalOverWrite() { return "global"; } }
使用@Result註解改變Convention Plugin的約定跳轉頁面。
在代碼的String execute()方法上進行了 @Action(value = "/v1/url", results = { @Result(name = SUCCESS, location = "/H5/success.jsp"),
@Result(name = "failure", location = "/H5/fail.jsp") })註解。若是@Action(...)沒有results = { @Result(name = SUCCESS, location = "/v1/success.jsp"),
@Result(name = "failure", location = "/H5/fail.jsp") },那麼依據Convention Plugin的約定,結果頁面會是/v1/url.jsp。加上紅色字體的部分後,execute()方法執行後,會根據紅色字體的配置,將結果跳轉到對應的頁面。
對Action類添加@Result註解,@Result將被Action類中的全部方法所共享。
仔細觀察上述代碼,在HelloWorld5上進行了@Results( { @Result(name = "global", location = "/global.jsp") })註解。這意味着該類及其子類的全部方法均可以返回一個名字爲「global」的結果頁面。而這個頁面是"/global.jsp"。這就使得不用在每一個須要跳轉到"/global.jsp"的方法都進行@Result(name = "global", location = "/global.jsp")註解。這在實際工做中也是很是常見的一種狀況。能夠仔細觀察的execute()方法和global()方法。他們均可能跳轉到名字爲「global」的結果頁面(即location屬***定義的「/global.jsp」頁面)。
對Action類中的方法添加@Result註解,@Result將只做用於被添加的方法。Action類方法上添加的@Result優先級高於Action類上添加的@Result。(前者覆蓋後者)
再仔細觀察上述代碼的globalOverWrite()方法,該方法也跳轉到名字爲「global」的頁面。可是在該方法上使用了@Action(value = "globalOverWrite", results = { @Result(name = "global", location = "/v1/globalOverWrite.jsp") })註解。而且其中@Result(...)註解中也有一個名字爲「global」的結果頁面定義。此時,該方法的結果頁面就會跳轉到/H5/globalOverWrite.jsp頁面而不是在類上進行註解時候的「/global.jsp」頁面。