struts框架内部请求-响应过程:
aop 面向切面编程 aop特点: 可以动态的增减功能,不需要改变其他功能 源代码。
aop相关对象:
起始对象: 动作发起者,类比浏览器
目标对象: 动作的完成者(业务程序,action/service/dao)
切面对象: 在目标之前或之后完成一些功能
分类:
- 前置切面。 目标之前执行
- 后置切面。 目标之后执行
- 环绕切面。 基于责任链模式的切面。
- 代理对象: 负责调用切面和目标。 n个起始对象只需要调用代理接口。
- 链对象 : 体现责任链模式。 允许一个切面对象一部分代码在目标前执行,一部分代码在目标之后执行
代理负责调用链,链中包含了所需要执行的切面和目标
struts中的拦截器就是切面,还是环绕切面。
在Struts中Action对象就是目标对象
ActionMapping
对象,记录 <action>配置匹配对应的Action类对象,有mapping
对象,可就表示有请求映射。
-
ActionProxy
对象为代理对象 (代理action目标) 包含(链对象) -
ActionInvocation
对象为链对象。包含 (interceptor,result-type,action)
Struts拦截器内部执行流程: - struts根据请求与<action>配置匹配,创建
ActionMapping
对象,然后根据ActionMapping
创建Actionproxy
代理对象,在创建代理对象Actionproxy
的内部,创建了ActionInvocation
链对象
在创建链对象ActionInvocation
时,将默认19拦截器对象,目标action
对象,result-type
对象装入链对象,执行proxy (目的是为了执行目标)
- 首先会按照默认拦截器栈的配置顺序先执行每一个切面,再执行目标action
- 获得action处理方法返回值
- 根据返回值找到对应的
reuslt-type
对象完成响应
自定义拦截器
1. 拦截器定义与应用:
- 自定义拦截器类 implements Interceptor接口 或 extends AbstractInterceptor父类
- 重写intercept(ActionInvocation)
- struts处理请求时会调用该方法开始拦截器功能
- ActionInvocation链对象,包含了其他的拦截器和目标action对象,如果需要可以使用
- actionInvocation.invoke(); //调用下一个拦截器或目标对象
public class MyInterceptor1 extends AbstractInterceptor {
private int a ;
public void setA(int a) {
this.a = a;
}
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
System.out.println("hello bye");
String r = actionInvocation.invoke(); //调用下一个拦截器或目标对象
System.out.println("----------->>"+a);
return r ;
}
}
2. 在struts.xml文件的<package>中声明拦截器(IOC 控制反转)
- 告诉struts框架,除了你默认的那小40个拦截器,现在多了n个
<interceptors>
<interceptor name="m1" class="com.util.MyInterceptor1" />
</interceptors>
- 在指定的<action>映射中,使用子标签<interceptor-ref>表示此次请求处理执行该拦截器
<action name="test1" class="com.action.TestAction1" method="t1">
<interceptor-ref name="m1" />
</action>
注意:一旦引用了自定义拦截器。默认拦截器将不再自动执行。可以手动引入
拦截器栈配置
- 在struts.xml文件的<package>中声明拦截器栈
<interceptors>
<interceptor name="m1" class="com.util.MyInterceptor1" />
<interceptor-stack name="myStack" >
<interceptor-ref name="m1" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
- 在action的配置中引用拦截器栈
<action name="test3" class="com.action.TestAction1" method="t3">
<interceptor-ref name="myStack" />
</action>
- 默认拦截器引用
- 不需要在<action>中引用拦截器,每次请求都会自动执行
- 在struts.xml文件的<package>中声明默认拦截器引用
<default-interceptor-ref name="myStack" />
- 拦截器初始化参数
- 在拦截器声明时或拦截器引用时,使用<param>子标签指定初始化参数
<interceptor name="m1" class="com.util.MyInterceptor1" >
<param name="a">100</param>
</interceptor>
- 在拦截器类中定义与参数同名的属性,并实现set方法。
- 方法拦截器
-
通过传递初始化参数,可以指定那些方法拦截,哪些方法不拦截
-
首先拦截器会根据引用配置
-
在某次action请求时被调用
-
方法拦截器在匹配action的同时,还需要匹配方法。
-
自定义拦截器类 extends
MethodFilterInterceptor
父类 -
在重写的方法中只需要写拦截的处理操作即可,不用考虑不拦截问题。
-
在声明拦截器时,为其(父类)传参,指定可以处理的方法或不可以处理的方法。
<interceptor name="m2" class="com.util.MyInterceptor2" >
<param name="excludeMethods">t2,t4,t5</param>
</interceptor>
<?xml version="1.0"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.action.extension" value="action,,do" />
<constant name="struts.configuration.xml.reload" value="true" />
<package name="dmc" extends="json-default" namespace="/">
<interceptors>
<interceptor name="m1" class="com.util.MyInterceptor1" >
<param name="a">100</param>
</interceptor>
<interceptor name="m2" class="com.util.MyInterceptor2" >
<param name="excludeMethods">t2,t4,t5</param>
</interceptor>
<interceptor-stack name="myStack" >
<interceptor-ref name="defaultStack" />
<interceptor-ref name="m1" >
<param name="b">200</param>
</interceptor-ref>
<interceptor-ref name="m2" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack" />
<action name="test1" class="com.action.TestAction1" method="t1">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="m1" />
</action>
<action name="test2" class="com.action.TestAction1" method="t2"></action>
<action name="test3" class="com.action.TestAction1" method="t3">
<interceptor-ref name="myStack" />
</action>
</package>
</struts>
网友评论