struts2註解

       struts2有註解功能,助教是jdk5.0後的新特性。

       註解必須用到的jar包:struts2-convention-plugin-2.x.x.x.jar

     Struts2是通過struts.xml配置的。隨着系統規模的加大我們需要配置的文件會比較大,雖然我們可以根據不同的系統功能將不同模塊的配置文件單獨書寫,然後通過<include>節點將不同的配置文件引入到最終的struts.xml文件中,但是畢竟還是要維護和管理這些文件,因此也會給維護工作帶來很大的困擾。爲了解決這個問題,可以考慮使用struts2的註解。實際上struts2中最主要的概念就是packageaction以及Interceptor等等概念,所以只要明白這些註解就可以了。

在以上所述的jar文件中定義了一系列的註解,其中比較主要的是:

  • @ParentPackage,這個註解對應了xml文件中的package節點,它只有一個屬性叫value,其實就是packagename屬性;
  • @Namespace,命名空間,也就是xml文件中<package>namespace屬性;
  • @Action,這個註解對應<action>節點。這個註解可以應用於action類上,也可以應用於方法上。這個註解中有幾個屬性:
    • value(),表示actionURL,也就是<action>節點中的name屬性;
    • results(),表示action的多個result;這個屬性是一個數組屬性,因此可以定義多個Result
    • interceptorRefs(),表示action的多個攔截器。這個屬性也是一個數組屬性,因此可以定義多個攔截器;
    • params(),這是一個String類型的數組,它按照name/value的形式組織,是傳給action的參數;
    • exceptionMappings(),這是異常屬性,它是一個ExceptionMapping的數組屬性,表示action的異常,在使用時必須引用相應的攔截器;
  • @Result,這個註解對應了<result>節點。這個註解只能應用於action類上。這個註解中也有幾個屬性:
    • name(),表示action方法的返回值,也就是<result>節點的name屬性,默認情況下是【success】;
    • location(),表示view層文件的位置,可以是相對路徑,也可以是絕對路徑;
    • type(),是action的類型,比如redirect
    • params(),是一個String數組。也是以name/value形式傳送給result的參數;

實際上,struts2中的主要註解就是這些,當然了,還有上面提到的@interceptorRef@exceptionMapping;基本上,掌握了這些註解就可以了。

但是如果想讓這些註解真正工作,必須在配置文件增加幾個常量的定義:

  • struts.convention.default.parent.package:這個常量表示缺省的包名是什麼,因爲在實際應用中,我們常常定義一個缺省的包,這個包中定義了一大堆的攔截器等等,然後其他的包繼承自這個包。這個常量可以配也可以不配;
  • struts.convention.package.locators:這個常量表示你的action類的java包的包名的後綴是啥:比如action。這個常量也可以不配;
  • struts.convention.package.locators.basePackage:這個常量表示你的action類的javapackage的名字是啥;這個常量也可以不配;
以上三個常量都是輔助作用的,爲了讓註解真正的工作,必須在配置文件中增加<package>節點的配置,至少是<package name="myPackage" extends="struts-default" />,這樣註解就可以使用了。 

   以下是簡單的一些代碼:package com.newer.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
import org.apache.struts2.convention.annotation.ExceptionMapping;
import org.apache.struts2.convention.annotation.ExceptionMappings;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;
import org.apache.struts2.convention.annotation.Results;

import com.opensymphony.xwork2.ActionSupport;
@ResultPath("/")//表示在服務器下,而不是在默認content位置
@ParentPackage("mypackage")//相當於struts.xml裏面的extends="xxxx"
@Namespace("/")//相當於struts.xml裏面的 namespace="/"
//@InterceptorRefs包含多個攔截器
// @InterceptorRef("xxx")相當於struts.xml的引用攔截器<interceptor-ref name="xxx"/>
@InterceptorRefs( { @InterceptorRef("log"),
        @InterceptorRef("defaultStack")})
//多個@Results返回結果
//<result name="sss">/xx.jsp</result>
@Results( {
        @Result(name = "error", type = "redirect", location = "/error.jsp"),
        @Result(name = "input", location = "/index.jsp") })
@ExceptionMappings( { @ExceptionMapping(exception = "java.lang.Exception", result = "error") })
public class UserAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    private String username;
    private String password;
    
    //<action name="xxxx">
    @Action(value = "user")
    public String execute() {
        System.out.println("execute......");
        if ("123".equals(username) && "123".equals(password)) {
            return SUCCESS;
        } else {
            return ERROR;
        }
    }

    @Actions( { @Action(value = "add"), @Action(value = "userAdd") })
    public String add() {
        System.out.println("add...");
        System.out.println("addUser...");
        return SUCCESS;
    }

    @Action(value = "show", results = { @Result(name = SUCCESS, location = "/result.jsp", type = "redirect") })
    public String show() {
        System.out.println("show");
        return SUCCESS;
    }

    

    @Action(value = "errorFun")
    public String errorFun() {
        System.out.println("error");
        return SUCCESS;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    
    
    @Action(value = "user")

    public String user() {
        System.out.println("execute......");
        if ("123".equals(username) && "123".equals(password)) {
            return SUCCESS;
        } else {
            return ERROR;
        }
    }

}


發佈了8 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章