1. 程式人生 > >struts2註解總結[email protected]

struts2註解總結[email protected]

寫在前面:

本文主要講的是註解方式的攔截器的使用,所以xml檔案的不會細講,文中的程式碼也比較簡單,沒有什麼許可權控制啊,攔截資訊之類的程式碼,重點還是說明註解方式的使用方法,瞭解了使用方法之後,內容可以自行擴充套件,這個根據自己的需要來,好了,就這樣。

上次寫了@Action和@Result兩種註解的使用方式,這次要講的是@Interceptor和@ParentPackage

介紹:

@InterceptorRef/@InterceptorRefs:

@InterceptorRef可以就是用來配置攔截器的,有如下屬性

  1. value:指定攔截器(棧)的名字,即在下面配置的name(一般只有value時,可以省略value)
  2. params:是一個字串陣列,用來傳遞引數

雖然是使用註解的方式,但是,還是需要在xml檔案中預先配置好攔截器的資訊

<interceptor name="interceptor1" class="struts2.interceptor.TestInterceptor1"></interceptor>
<interceptor-stack name="interceptorStack1">
	<interceptor-ref name="defaultStack"/>
	<interceptor-ref name="interceptor1"/>
</interceptor-stack>

具體的攔截器類如下

public class TestInterceptor1 extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
		System.out.println("--------TestInterceptor1--------");
		return arg0.invoke();
	}
}

好了,這樣就定義好了攔截器,如果使用xml配置的方式,那麼我們需要使用下面的方式來使用攔截器
<action name="login" class="struts.action.xxx">
        <!--  
           ....
        -->
        <interceptor-ref name="interceptorStack1"/>
</action>
既然Action都是用註解配置的,那麼這時的攔截器就不需要寫在這了,具體配置有兩種方式,一種是配置在類上的,另外一種是配置在方法上的,下面是配置在方法上的(action例子還是上次文章的例子,具體->
別點我,別點我!!不要啊~~)
@Namespace("/")
@ParentPackage("default")
public class TestAction1 extends ActionSupport {

	@Action(value = "add", 
		results = { @Result(name = "add", location = "/add.jsp")},
		interceptorRefs={
			@InterceptorRef("interceptorStack1")
	})
	public String add() throws Exception {
		return "add";
	}
}

interceptorRefs可以放多個@InterceptorRef,和results類似

當訪問/add的時候,控制檯會打印出 ---> --------TestInterceptor1--------

接下來是在類上使用註解

@Namespace("/")
@ParentPackage("default")
@InterceptorRefs({
	@InterceptorRef("interceptorStack1")
})
public class TestAction1 extends ActionSupport {

	@Action(value = "add", 
		results = { @Result(name = "add", location = "/add.jsp")}
	)
	public String add() throws Exception {
		return "add";
	}
}
這樣的效果和上面的是一樣的,訪問響應的action會打出 ---> --------TestInterceptor1--------
@InterceptorRefs可以配置多個攔截器,和在@Action中指定interceptorRefs= {}類似,當然,也可以只用@InterceptorRef指定一個攔截器

好了,這就是兩種使用的方式,從上面的例子看來,好像沒有什麼區別,其實,區別還是有的,接下來先看下面的action

@Namespace("/")
@ParentPackage("default")
@InterceptorRef("interceptorStack1")
public class TestAction1 extends ActionSupport {

	@Action(value = "add", results = { @Result(name = "add", location = "/add.jsp") })
	public String add() throws Exception {
		return "add";
	}

	@Action(value = "delete", results = { @Result(name = "delete", location = "/delete.jsp") })
	public String delete() throws Exception {
		return "delete";
	}
}
這樣當訪問/delete和/add時都會打印出 ---> --------TestInterceptor1--------
即配置在類上的攔截器是作用在所有方法上的

再看下下面混合使用兩種方式

@Namespace("/")
@ParentPackage("default")
@InterceptorRef("interceptorStack1")
public class TestAction1 extends ActionSupport {

	@Action(value = "add", 
		results = { @Result(name = "add", location = "/add.jsp")},
		interceptorRefs = {
			@InterceptorRef("interceptorStack2")
	<span style="white-space:pre">	</span>}
	)
	public String add() throws Exception {
		return "add";
	}
	
	@Action(value = "delete", results = { @Result(name = "delete", location = "/delete.jsp") })
	public String delete() throws Exception {
		return "delete";
	}
}

當訪問/delete時會打印出 ---> --------TestInterceptor1--------

這是當然的,delete方法並沒有什麼改變,和上面作用在類上的攔截器的例子一樣,攔截器1會攔截器該方法

而訪問/add的時候會發生什麼?這時會打印出

 ---> --------TestInterceptor1-------- 和 

---> --------TestInterceptor2--------

(攔截器2和1的定義和1一樣,只是將1改成2)

這就是作用在方法上的攔截器和定義在類上的區別

定義在方法上的攔截器會只攔截這個方法,而定義在類上的攔截器會攔截所有的方法