Struts2常用的幾個註解

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



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