Struts2自定义拦截器文档格式.docx
- 文档编号:5743004
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:5
- 大小:16.98KB
Struts2自定义拦截器文档格式.docx
《Struts2自定义拦截器文档格式.docx》由会员分享,可在线阅读,更多相关《Struts2自定义拦截器文档格式.docx(5页珍藏版)》请在冰点文库上搜索。
对于intercept方法,再说明几点:
(1)在intercept方法中写“invocation.invoke();
”,这句话的意思是继续运行拦截器后续的处理,如果这个拦截器后面还有拦截器,那么会继续运行,一直到运行Action,然后执行Result。
如果intercept方法中没有写“invocation.invoke();
”这句话,那就意味着对请求的运行处理到此为止,不再继续向后运行了,换句话说,后续的拦截器和Action就不再执行了。
而是在这里返回Result字符串,直接去进行Result处理了。
(2)在“invocation.invoke();
”这句话之前写的功能,会在Action运行之前执行(3)在“invocation.invoke();
”这句话之后写的功能,会在Result运行之后执行(4)intercept方法的返回值就是最终要返回的Result字符串,这个只是在前面没有执行Result的时候才有效,也就是前面没有“invocation.invoke();
”这句话的时候,这个返回值就相当于是最终要返回的Result字符串,然后才执行相应的Result处理。
说了这么多,还是来示例一下,看看如何实现自定义的拦截器吧。
1:
先来个最简单的,就是在Action运行之前,和Result运行之后输出一点信息,当然,有实际功能需求的时候,就写成实际功能的处理代码了,示例代码如下:
查看复制到剪贴板打印packagecn.javass.action.action;
importcom.opensymphony.xwork2.ActionInvocation;
importcom.opensymphony.xwork2.interceptor.Interceptor;
publicclassMyInterceptorimplementsInterceptor{publicvoiddestroy(){System.out.println("
MyInterceptor销毁"
);
}publicvoidinit(){System.out.println("
MyInterceptor初始化"
}publicStringintercept(ActionInvocationinvocation)throwsException{System.out.println("
在acton执行之前"
Stringresult=invocation.invoke();
System.out.println("
在Result运行之后"
returnresult;
}}可以看到,这个Interceptor的init方法和destroy方法只是输出了一句信息,它的intercept方法用来执行响应,在“invocation.invoke();
”这句话之前和之后分别输出了一句信息。
最后返回的result,就是invocation.invoke()的返回值。
2:
HelloWorldAction这个类不用修改3:
需要到struts.xml里面配置拦截器的声明和引用,示例如下:
查看复制到剪贴板打印&
lt;
packagename="
helloworld"
extends="
struts-default"
&
gt;
&
interceptors&
interceptorname=“myInterceptor”class="
cn.javass.action.action.MyInterceptor"
/&
/interceptors&
actionname="
helloworldAction"
class="
cn.javass.action.action.HelloWorldAction"
resultname="
toWelcome"
/s2impl/welcome.jsp&
/result&
interceptor-refname=“myInterceptor”/&
interceptor-refname="
defaultStack"
/action&
/package&
在这个&
package&
元素中,首先声明了一个自定义的拦截器:
然后在&
action&
中引用了这个拦截器。
4:
运行测试一下,后台输出:
查看复制到剪贴板打印在acton执行之前用户输入的参数为===account=test,password=test,submitFlag=login在Result运行之后可以看到加粗部分就是在拦截器里输出的信息,它分别运行于Action运行之前和Result运行之后。
可能有朋友会说,从这里只看到了Action的运行,并没有看到Result的运行啊,你怎么知道是在Result运行之后呢?
很简单,前面增经做过一个自定义的Result,这里来使用它,这样就可以在里面输出信息,从而看出拦截器、Action和Result运行的顺序了。
5:
上一章自定义Result的类MyResult不需要改动6:
修改struts.xml,在里面添加上Result的定义,配置如下:
result-types&
result-typename="
MyResult"
cn.javass.action.action.MyResult"
default="
false"
/result-types&
type="
7:
再次访问登录页面,重新运行测试,后台的输出为:
查看复制到剪贴板打印在acton执行之前用户输入的参数为===account=test,password=test,submitFlag=login要处理的Result字符串是=toWelcome在Result运行之后加粗的那句话,就是自定义的Result运行时输出的,你会发现,确实是Result运行完成过后,才运行的自定义拦截器中“invocation.invoke();
”这句话后面的输出语句的。
另外一点,你要是细心的话,你会发现,在启动服务器的时候,就会输出如下一句:
查看复制到剪贴板打印MyInterceptor初始化这表明,拦截器在启动服务器的时候,就已经初始化好了。
8:
要注意,如果自定义拦截器中没有调用“invocation.invoke();
”这句话的话,那么就相当于后续的拦截器和Action都不会运行了,而是直接根据拦截器的intercept方法所直接返回的Result字符串,来匹配和运行Result。
首先,要修改拦截器类,去掉“invocation.invoke();
”这句话,直接返回一个Result字符串,示例代码如下:
查看复制到剪贴板打印publicclassMyInterceptorimplementsInterceptor{publicvoiddestroy(){System.out.println("
return"
;
}}然后再次运行测试,后台的输出为:
查看复制到剪贴板打印在acton执行之前在Result运行之后要处理的Result字符串是=toWelcome也就是说,是先把拦截器的intercept方法执行完成,然后才运行的Result。
6.3.3向拦截器传入参数为什么要传入参数呢?
因为有些时候,同一个拦截器为不同的Action服务的时候,需要根据传入的参数进行处理上的变化。
比如说,一个记录日志的拦截器,可以根据配置来决定到底把日志记录在数据库还是文件里面。
可以把这种配置数据作为一个参数,在配置的时候设置值,会自动传入拦截器中。
具体做法还是看个示例比较清楚。
首先看看在struts.xml中,如何为拦截器设置参数。
interceptor-refname=“myInterceptor”&
paramname="
dbOrFile"
db&
/param&
/interceptor-ref&
在这里,通过&
param&
子元素来为拦截器注入参数,名称是自定义的,当然要与拦截器里面的属性匹配上。
拦截器类要想接到这个参数,就必须定义一个对应的属性,并提供setter方法,示例代码如下:
查看复制到剪贴板打印publicclassMyInterceptorimplementsInterceptor{privateStringdbOrFile;
publicvoidsetDbOrFile(StringdbOrFile){this.dbOrFile=dbOrFile;
}publicvoiddestroy(){}publicvoidinit(){}publicStringintercept(ActionInvocationinvocation)throwsException{System.out.println("
接到dbOrFile的参数=="
+this.dbOrFile);
if("
db"
.equalsIgnoreCase(this.dbOrFile)){System.out.println("
记录日志到数据库"
}else{System.out.println("
记录日志到文件"
}Stringresult=invocation.invoke();
}}注意加粗的部分,名称为dbOrFile的属性以及对应的setter方法。
这样,在初始化这个拦截器的时候,Struts2就会反射的调用对应的setter,把在&
元素中配置的值设置到dbOrFile属性上去。
测试运行,后台输出为:
查看复制到剪贴板打印接到dbOrFile的参数==db记录日志到数据库用户输入的参数为===account=test,password=test,submitFlag=login要处理的Result字符串是=toWelcome3:
上面是在引用拦截器的时候设置参数,还有另一种方式指定参数。
就是在拦截器声明的时候就设置参数,示例配置如下:
/interceptor&
去运行测试一下,这种配置方式得到的运行效果和前一种方式是一样的。
在&
interceptor-ref&
元素上注册的参数会覆盖在&
interceptor&
元素上注册的同名参数。
示例配置如下:
file&
再次运行测试,后台输出为:
查看复制到剪贴板打印接到dbOrFile的参数==file记录日志到文件用户输入的参数为===account=test,password=test,submitFlag=login要处理的Result字符串是=toWelcome后台输出的是file而不是db,这说明,在声明拦截器的时候定义的参数,被引用拦截器的时候配置的参数覆盖了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Struts2 自定义 拦截