struts2拦截器详解.docx
- 文档编号:2422617
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:17
- 大小:22.62KB
struts2拦截器详解.docx
《struts2拦截器详解.docx》由会员分享,可在线阅读,更多相关《struts2拦截器详解.docx(17页珍藏版)》请在冰豆网上搜索。
struts2拦截器详解
Struts2拦截器
1.Struts中拦截器就是一个类,实现了Interceptor接口的一个类。
2.Struts中拦截器和Servlet中的Filter有类似的功能,从字面意思来看,Struts拦截器就是在目标对应执行之前或之后做一些事情,其实Struts中的拦截器的实现也是一样,在具体Action的被调用之前或之后可以做一些操作,采用配置化的方法进行管理,使用起来比较简单。
但是我们在学习过程中最好去了解拦截底层实现原理,以便在使用过程中能够控制自己的程序。
从了解拦截器的实现原理入手会是我们学习拦截器的最好途径。
3.拦截器采用的动态代理模式实现的在目标执行之前或之后插入必要的辅助业务。
其实采用的是一种AOP的思想,来降低系统耦合。
下面我们介绍一个动态代理:
Java中提供一种动态代理的实现模式,我们用一个例子实现动态代理的演示:
涉及到代理就肯定要有:
目标对象代理对象拦截器
三者之间的关系:
代理对象代理目标对象在目标对象执行之前或之后加入拦截器的功能
首先我们创建一个目标对象:
3.1定义一个接口
?
1
2
3
4
5
packagecom.snt.struts2.interceptor;
publicinterfaceITargetInterface{
publicvoiddoSomething();
}
3.2定义一个目标对象实现目标对象接口[目标对象一定要实现一个接口]
?
1
2
3
4
5
6
7
8
9
packagecom.snt.struts2.interceptor;
publicclassTargetimplementsITargetInterface{
//拦截的目标对象
publicvoiddoSomething(){
System.out.println("dosomething...");
}
}
3.3定义一个拦截器(这里我们的拦截器比较简单,就是一个普通在类,定义了一在目标对象调用之前工之后要执行的操作)[定义的两个方法,代表在目标对象调用之前和之后要执行的操作]
?
1
2
3
4
5
6
7
8
9
10
11
12
packagecom.snt.struts2.interceptor;
publicclassInterceptor{
publicvoidbefor(){
System.out.println("before");
}
publicvoidafter(){
System.out.println("after");
}
}
3.4下面来实现代理,如何为目标对象产生一个代理对象呢?
java为我们提供了一定代理机制!
Java在java.lang.reflect包下面提供了一个Proxy类,这个类可以为一个目标类产生代理类。
使用以下更简单的方法:
?
1
ITargetInterfaceiTargetInterface=(ITargetInterface)Proxy.newProxyInstance(Foo.class.getClassLoader(),newClass[]{ITargetInterface.class},handler);
第一个参数:
目标类的加载器第二个参数:
目标实现的接口集合第三个参数:
代理类的调用处理程序对象.
动态代理类(以下简称为代理类)是一个实现在创建类时在运行时指定的接口列表的类,该类具有下面描述的行为。
代理接口是代理类实现的一个接口。
代理实例是代理类的一个实例。
每个代理实例都有一个关联的调用处理程序对象,它可以实现接口InvocationHandler。
通过其中一个代理接口的代理实例上的方法调用将被指派到实例的调用处理程序的Invoke方法,并传递代理实例、识别调用方法的java.lang.reflect.Method对象以及包含参数的Object类型的数组。
调用处理程序以适当的方式处理编码的方法调用,并且它返回的结果将作为代理实例上方法调用的结果返回。
对于我们这个例子:
也要先创建一个代理类的调用处理程序,如下:
3.5创建一个MyHandler类,实现InvocationHandler接口,实现其中的invoke()方法,代码如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
packagecom.snt.struts2.interceptor;
importjava.lang.reflect.InvocationHandler;
importjava.lang.reflect.Method;
publicclassMyHandlerimplementsInvocationHandler{
privateObjectobj;//目标对象
//拦截器对象
privateInterceptorinterceptor=newInterceptor();
//注入目标对象
publicvoidsetObject(Objectobj){
this.obj=obj;
}
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
Objectresult=null;
//调用目标方法前执行的操作
interceptor.befor();
result=method.invoke(obj,args);
//调用目标方法后执行的操作
interceptor.after();
returnresult;
}
}
3.6创建一个产生代理的工厂类,创建一个MyProxy类,代码如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
packagecom.snt.struts2.interceptor;
importjava.lang.reflect.Proxy;
/**
*产生一个代理
*@authorWang
*
*/
publicclassMyProxy{
//根据一个目标类产生一个代理对象
publicObjectgetProxy(Objectobject){
MyHandlermh=newMyHandler();
mh.setObject(object);
returnProxy.newProxyInstance(Target.class.getClassLoader(),object
.getClass().getInterfaces(),mh);
}
}
创建一个测试类,为目标对象产生代理,调用其方法,查看执行效果:
?
1
2
3
4
5
6
7
8
9
10
11
packagecom.snt.struts2.interceptor;
publicclassClient{
publicstaticvoidmain(String[]args){
ITargetInterfacetarget=newTarget();
MyProxymp=newMyProxy();
ITargetInterfaceproxy=(ITargetInterface)mp.getProxy(target);
proxy.doSomething();
}
}
运行结果:
在调用目标类方法doSomethin()之前和之后插入拦截的功能。
4.OK,上面讲的一个采用我们自定义拦截器的方式实现在目标拦截的功能,下面的我们看一下Struts2中如何使用拦截器。
Struts2中拦截器是一个实现了Interceptor接口的类,下面我们来定义一具体的拦截器,实现Action的拦截。
定义一个MyInterceptor类,代码如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
packagecom.snt.struts2.interceptors;
importcom.opensymphony.xwork2.ActionInvocation;
importcom.opensymphony.xwork2.interceptor.Interceptor;
publicclassMyInterceptorimplementsInterceptor{
privateStringhello;
publicStringgetHello(){
returnhello;
}
publicvoidsetHello(Stringhello){
this.hello=hello;
}
publicvoiddestroy(){
System.out.println("destory()");
}
publicvoidinit(){
System.out.println("init()");
System.out.println(hello);
}
/**
*
*拦截Action
*/
publicStringintercept(ActionInvocationinvocation)throwsException{
System.out.println("interceptor");
Stringresult=invocation.invoke();
System.out.println("finshed");
returnresult;
}
}
拦截器中主要实现interceptor()方法,在interceptor中调用目标对象前后加入你定义的业务操作。
OK,拦截器配置好之后,如何让其生效呢?
需要在struts.xml文件中配置。
在struts.xml配置文件中,Struts2会为每个Action加上一具默认在拦截器配置,那就是struts-default.xml中的
对于上面的拦截器,我们需要在struts.xml文件中如下配置
方式1:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsP
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- struts2 拦截 详解