竟然以JDK的動態代理作爲主軸,勉強可以用面向接口編程來解釋,不過侷限性差到讓人落淚,設計的人腦袋壞了不成;
攔截器本身也算是struts2的亮點之一,不過與spring的AOP相比,的確是相形見拙;
1.現在說說攔截器,連接器本身需要繼承接口或者抽象類,抽象類:AbstractInterceptor
他是在第二層的應用:
第一層:轉換數據類型;
第二層:攔截器;
第三層:Action
也就是說,struts2表單傳值時需要通過攔截器進行封裝的,這就需要struts2的默認攔截器,<interceptor-ref name="defaultStack" />
注意:默認攔截器是在不設置任何攔截器的時候,給予默認設置的,當時只要設置任何一個連接器他否會覆蓋掉默認攔截器,
故此,我們需要手動設置,如下:
- <struts>
- <package name="struts" extends="struts-default" >
- <interceptors>
- <interceptor name="work" class="interceptor.Work_Interceptor"></interceptor>
- //設置攔截器!
- </interceptors>
- <action name="login" class="com.struts.action.UserAction" method="add">
- <interceptor-ref name="work"></interceptor-ref>
- //在此Action上應用此連接器;
- <interceptor-ref name="defaultStack" />
- //設置默認連接器;
- <result name="sueecc">/sueecc.jsp</result>
- </action>
- </package>
- </struts>
是根據配置文件的順序;
如果有三個攔截器分別是攔截器一,攔截器二,攔截器三;
執行順序:攔截器一->攔截器二->攔截器三->action->攔截器三->攔截器二->攔截器一
3.攔截器可以依賴注入:
寫入值分爲兩種Ioc與非Ioc;
非Ioc存值:
action中:
ActionContext.getContext();
Ioc注入:
Ioc擁有兩種注入方式:初始注入,動態注入
- 初始注入:
- <interceptors>
- <interceptor name="work" class="interceptor.Work_Interceptor">
- <param name="wang">1234</param>
- //初始注入
- </interceptor>
- </interceptors>
- 動態注入:
- <action name="login" class="POJO.User" >
- <interceptor-ref name="work">
- <param name="wang">1234</param>
- //動態注入
- </interceptor-ref>
- <result name="succee">/succee.jsp</result>
- <result name="input">/index.jsp</result>
- </action>
- <default-interceptor-ref name=""></default-interceptor-ref>
- //默認攔截器,他可以讓所有的action都默認使用你定義的這個攔截器;
- struts.xml:
- <interceptor name="myInterceptor3" class="com.test.interceptor.MyInterceptor3">
- <param name="includeMethods">攔截的方法名</param>
- </interceptor>
- 攔截器:
- public class MyInterceptor3 extends MethodFilterInterceptor {
- protected String doIntercept(ActionInvocation invocation) throws Exception {
- System.out.println("my interceptor3");
- String result = invocation.invoke();
- return result;
- }
- }
- User u = (User) invocation.getAction();
- //返回action的對象,賦值後的對象;
監聽器的初始點是攔截器或者是自定義方法;
7.攔截器與過濾器的區別:
1.攔截器是基於反射機制,過濾器是基於函數回調的;
2.過濾器是依賴servlet,攔截器是不依賴於servlet容器;
3.攔截器只能對action的請求起作用,而過濾器是對任何請求起作用;
4.攔截器可以訪問actionContext,值棧裏的對象.而過濾器不能;
5.action的生命週期中,一個攔截器可以被調用多次,而過濾器只能調用一次;
8.標識的攔截器,這個話說偶然間看了看,自己還沒敲例子,等以後有時間在來說說這個吧