struts2註解總結[email protected]
阿新 • • 發佈:2019-02-03
寫在前面:
本文主要講的是註解方式的攔截器的使用,所以xml檔案的不會細講,文中的程式碼也比較簡單,沒有什麼許可權控制啊,攔截資訊之類的程式碼,重點還是說明註解方式的使用方法,瞭解了使用方法之後,內容可以自行擴充套件,這個根據自己的需要來,好了,就這樣。
上次寫了@Action和@Result兩種註解的使用方式,這次要講的是@Interceptor和@ParentPackage
介紹:
@InterceptorRef/@InterceptorRefs:
@InterceptorRef可以就是用來配置攔截器的,有如下屬性
- value:指定攔截器(棧)的名字,即在下面配置的name(一般只有value時,可以省略value)
- 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都是用註解配置的,那麼這時的攔截器就不需要寫在這了,具體配置有兩種方式,一種是配置在類上的,另外一種是配置在方法上的,下面是配置在方法上的(action例子還是上次文章的例子,具體->別點我,別點我!!不要啊~~)<action name="login" class="struts.action.xxx"> <!-- .... --> <interceptor-ref name="interceptorStack1"/> </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)
這就是作用在方法上的攔截器和定義在類上的區別
定義在方法上的攔截器會只攔截這個方法,而定義在類上的攔截器會攔截所有的方法