2012/6/26 星期二 天气阴有雨
今天详细讲解一下Struts中的拦截器的作用和用法。
拦截器是Struts2的一个重要的概念,Struts中有80%的功能都通过拦截器实现。
意义:完成更高层次的解耦,无须侵入框架本身即可添加新的功能。拦截器是AOP的一个实现,底层通过动态代理模式完成。
拦截器是Action的拦截器,可以将一些重用功能放到拦截器中,降低Action的复杂性,提高代码的重用性。
常用功能:封装请求参数,文件上传,异常处理等。这些都是默认的拦截器defaultStack为我们完成的工作,一旦为Action指定了相应的拦截器,则默认的拦截器不再起作用,如果需要它再起作用,则必须显示制定默认拦截器。
拦截器继承AbstractInterceptor抽象类或者实现Interceptor接口类,重写方法。
主要方法:String interccept(ActionInvocation invocation);执行拦截动作和处理事件。
参数invocation包含了Action的引用,invocation.invoke()方法将控制权转给下一个拦截器或者调用的Action方法。返回值是逻辑视图。
拦截器配置及使用:
<interceptors>
<interceptor name="timer" class=".."/>
<interceptor name="logger" class=".."/>
</interceptors>
为了方便使用,我们可以配置拦截器栈,相当于多个拦截器的集合。
<interceptor-stack name="myStack">
<interceptor-ref name="timer"/>
<interceptor-ref name="logger"/>
</interceptor-stack>
然后在Action中使用:
action name="login" class="tutuorial.Login">
<interceptor-ref name="myStack"/>
<result name="input">login.jsp</result>
<result name="success"
type="redirect-action">/secure/home</result>
</action>