開始Struts2最常用的幾個註解的學習吧。
@Action
使用@Action註解改變Convention plug約定的action與url之間的映射關係。
廢話少說代碼說事兒。
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等頁面)。
在@Action("/v1/url")註解的情況下,除了上述的訪問方式外,我們還可以在瀏覽器中輸入:http://應用服務器ip:端口/應用
/v1/url,也可訪問到com.ponpon.actions.myaction,但最終顯示http://應用服務器ip:端口/應用/v1/url.jsp頁面。
使用@Action註解解決一個ACTION中的一個方法,響應多個不同的URL.
實際項目開發過程中有很大的機率碰到Action的處理相同,但是最終跳轉的頁面不同的情況。將@Actions和@Action組合起來用即可解決這樣的需求。
還是先上代碼
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”頁面。