Struts2經常使用的幾個註解

開始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」頁面。

相關文章
相關標籤/搜索