知识大全 实现自已的拦截器
Posted 知
篇首语:白米饭好吃,五谷田难种。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 实现自已的拦截器相关的知识,希望对你有一定的参考价值。
Struts2教程9:实现自已的拦截器 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
在上一篇中介绍了Struts 拦截器的原理 在这一篇中我们将学习一下如何编写自己的拦截器
拦截器的实现
实现一个拦截器非常简单 实际上 一个拦截器就是一个普通的类 只是这个类必须实现 opensymphony xwork interceptor Interceptor接口 Interceptor接口有如下三个方法
publicinterfaceInterceptorextendsSerializable voiddestroy(); voidinit(); Stringintercept(ActionInvocationinvocation)throwsException;
其中init和destroy方法只在拦截器加载和释放(都由Struts 自身处理)时执行一次 而intercept方法在每次访问动作时都会被调用 Struts 在调用拦截器时 每个拦截器类只有一个对象实例 而所有引用这个拦截器的动作都共享这一个拦截器类的对象实例 因此 在实现Interceptor接口的类中如果使用类变量 要注意同步问题
下面我们来实现一个简单的拦截器 这个拦截器通过请求参数action指定一个拦截器类中的方法 并调用这个方法(我们可以使用这个拦截器对某一特定的动作进行预处理) 如果方法不存在 或是action参数不存在 则继续执行下面的代码 如下面的URL
访问上面的url后 拦截器会就会调用拦截器中的test方法 如果这个方法不存在 则调用invocation invoke方法 invoke方法和Servlet过滤器中调用FilterChain doFilter方法类似 如果在当前拦截器后面还有其他的拦截器 则invoke方法就是调用后面拦截器的intercept方法 否则 invoke会调用Action类的execute方法(或其他的执行方法)
下面我们先来实现一个拦截器的父类ActionInterceptor 这个类主要实现了根据action参数值来调用方法的功能 代码如下
packageinterceptor;
import opensymphony xwork ActionInvocation; import opensymphony xwork interceptor Interceptor; importjavax servlet *; import apache struts *; publicclassActionInterceptorimplementsInterceptor protectedfinalStringINVOKE= ##invoke ; publicvoiddestroy() System out println( destroy ); publicvoidinit() System out println( init ); publicStringintercept(ActionInvocationinvocation)throwsException HttpServletRequestrequest=ServletActionContext getRequest(); Stringaction=request getParameter( action ); System out println(this hashCode()); if(action!=null) try java lang reflect Methodmethod=this getClass() getMethod(action); Stringresult=(String)method invoke(this); if(result!=null) if(!result equals(INVOKE)) returnresult; else returnnull; catch(Exceptione) returninvocation invoke();
从上面代码中的intercept方法可以看出 在调用action所指定的方法后 来判断返回值 可能发生的情况有三种
返回值为null 执行return null
返回值为INVOKE 执行return invockation invoke()
其他情况 执行return result result表示指定方法的返回值 如上面代码所示
在实现完上面的拦截器父类后 任何继承于ActionInterceptor类的拦截器都可以自动根据action的参数值调用自身的相应方法 下面我们来实现一个拥有两个动作方法test和print的拦截器类 代码如下
packageinterceptor;
importjavax servlet HttpServletResponse;import apache struts ServletActionContext;publicclassMultiMethodInterceptorextendsActionInterceptorpublicStringtest()throwsExceptionHttpServletResponseresponse=ServletActionContext getResponse();response getWriter() println( invoketest );returnthis INVOKE;publicStringprint()throwsExceptionHttpServletResponseresponse=ServletActionContext getResponse();response getWriter() println( invokeprint );returnnull;
est方法返回了INVOKE 因此 在执行完这个方法后 Struts 会接着调用其他拦截器的intercept方法或Action类的execute方法 而print方法在执行完后 只是返回了null 而不再调用其他的方法了 也就是访问如下的url时 动作的execute方法将不会执行
下面我们来实现一个Action类 代码如下
packageaction;
import apache struts *;import opensymphony xwork ActionSupport;publicclassInterceptorActionextendsActionSupportpublicStringabcd()throwsExceptionServletActionContext getResponse() getWriter() println( invokeabcd );returnnull;
在这个Action类中 只有一个abcd方法 实际上 这个方法相当于execute方法 在下面会设置动作的method属性为abcd 下面我们来在struts xml中定义拦截器类和动作 代码如下
<?xmlversion= encoding= UTF ?><!DOCTYPEstrutsPUBLIC //ApacheSofareFoundation//DTDStrutsConfiguration //EN dtd ><struts><packagename= demo extends= struts default namespace= /test ><interceptors><interceptorname= method class= interceptor MultiMethodInterceptor /><interceptor stackname= methodStack ><interceptor refname= method /><interceptor refname= defaultStack /></interceptor stack></interceptors><actionname= interceptor class= action InterceptorAction method= abcd ><interceptor refname= methodStack /></action></package></struts>
在配置上面的methodStack拦截器时要注意 最好在后面引用defaultStack 否则很多通过拦截器提供的功能将失去
现在访问如下的URL
在浏览器中将会出现如下的字符串
invoke test
invoke abcd
而如果访问 将会只出现如下的字符串
invoke print
大家可以看出 访问这个url时并没有调用abcd方法 如果随便指定的action值的话 则只调用abcd方法 如访问 就只会输出invoke abcd
拦截器的参数
我们在使用很多Struts 内置的拦截器时会发现有很多拦截器都带参数 当然 我们自己做的拦截器也可以加上同样的参数 有两个参数比较常用 这两个参数是includeMethods和excludeMethods 其中includeMethods指定了拦截器要调用的Action类的执行方法(默认是execute) 也就是说 只有在includeMethods中指定的方法才会被Struts 调用 而excludeMethods恰恰相反 在这个参数中指定的执行方法不会被Struts 调用 如果有多个方法 中间用逗号( )分隔 在Struts 中提供了一个抽象类来处理这两个参数 这个类如下
opensymphony xwork interceptor MethodFilterInterceptor
如有继承于这个类的拦截器类都会自动处理includeMethods和excludeMethods参数 如下面的拦截器类所示
packageinterceptor;
import opensymphony xwork ActionInvocation;import opensymphony xwork interceptor *;publicclassMyFilterInterceptorextendsMethodFilterInterceptorprivateStringname;publicStringgetName()returnname;publicvoidsetName(Stringname)this name=name;@OverrideprotectedStringdoIntercept(ActionInvocationinvocation)throwsExceptionSystem out println( doIntercept );System out println(name);returninvocation invoke();
MethodFilterInterceptor的子类需要实现doIntercept方法(相当于Interceptor的intercept方法) 如上面代码所示 在上面的代码中还有一个name属性 是为了读取拦截器的name属性而设置的 如下面的配置代码所示
<?xmlversion= encoding= UTF ?><!DOCTYPEstrutsPUBLIC //ApacheSofareFoundation//DTDStrutsConfiguration //EN dtd ><struts><packagename= demo extends= struts default namespace= /test ><interceptors><interceptorname= method class= interceptor MultiMethodInterceptor /><interceptorname= filter class= interceptor MyFilterInterceptor ><paramname= includeMethods >abcd</param><paramname= name >中国</param></interceptor><interceptor stackname= methodStack ><interceptor refname= method /><interceptor refname= filter /><interceptor refname= defaultStack /></interceptor stack></interceptors><actionname= interceptor class= action InterceptorAction method= abcd ><interceptor refname= methodStack /></action></package></struts> cha138/Article/program/Java/ky/201311/27899相关参考
Java实现的拦截器 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 拦截器在在流行的开源框架中很
Hibernate拦截器简单描述 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Hibernat
Structs2.0拦截器 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! <sproper
SpringmvcSession拦截器 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 未登录不允
10分钟学懂Struts2.0拦截器 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 简介 在S
JAVA拦截器原理及Struts2扩展 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最近发现很
过滤器是在javaweb中你传入的requestresponse提前过滤掉一些信息或者提前设置一些参数然后再传入servlet或者struts的action进行业务逻辑比如过滤掉非法url(不是log
知识大全 iphone5 6.1越狱版 手机卫士黑名单只能拦截电话,不能拦截短信~~~请问怎么解决啊
iphone56.1越狱版手机卫士黑名单只能拦截电话,不能拦截短信~~~请问怎么解决啊?谢谢!在360手机卫士里面==》骚扰拦截==》点右上角的设置==》在来电拦截设置里面的拦截模式里自己设置最下面也
百度手机卫士呗被拦截的短信在什么地方查看您好,您可在骚扰拦截——短信拦截中找到被拦截的短信。感谢您的支持!怎么查看金山手机卫士中被拦截的短信到通讯管理--拦截记录中查看即可百度手机卫士怎么防骚扰百度手
由于航天技术的发展,未来战争的领域将伸展到太空。随着太空武器的不断出现,各种反太空武器也应运而生,拦截卫星就是其中的一种。 拦截卫