Struts2的Interceptor和Listener以及Plugin

来源:互联网 发布:手机版网络维护软件 编辑:程序博客网 时间:2024/05/17 07:45

Struts2的拦截器
struts-default.xml中定义了很多拦截器,这些拦截器就是用来完成许多强劲功能的保证
而且可以根据已定义的若干拦截器中的某几个拦截器构建成interceptor-stack拦截器栈
其实拦截器栈还可以由拦截器栈组成。即从Struts2高层的角度来看,二者没有什么区别
我们可以在<package/>中增加这样一行<default-interceptor-ref name="拦截器的名字"/>
即表示将该拦截器作为整个包的默认拦截器,它会自动附加到我们的每一个Action中
并且在一个<package/>中只能使用<default-interceptor-ref/>定义一个默认的拦截器
<action/>没有引用任何一个拦截器,那么默认的defaultStack会自动附加到<action/>
<action/>手工引用任何一个拦截器,那么默认的defaultStack就不会附加到<action/>
若还想使用默认拦截器,则只能再通过手工方式导入<interceptor-ref name="defaultStack"/>
如果没有引用Struts2的默认拦截器,那么就会影响到整体的输入校验即其它的一些功能
Struts2拦截器的配置和使用都很easy,这得益于其底层的良好架构以及它的AOP的思想
该拦截器即标准的AOP思想,代码不写死到Action里,而是根据配置灵活附加到Action
使用上,Struts2拦截器并不复杂。但实现上,是很复杂的,其底层用到了动态代理的机制


Struts2常用的内置拦截器
alias:实现不同请求中相似参数别名的转换
autowiring:自动装配。主要用于Struts2和Spring整合时,Struts2可以使用自动装配的方式访问Spring容器中的Bean
chain:构建一个Action链,使当前Action可以访问前一个Action的属性。一般与<result type="chain"….../>一起使用
conversionError:处理类型转换错误。负责将类型转换错误从ActionContext中取出,并转换成Action的FieldError错误
createSession:负责创建一个HttpSession对象,主要用于那些需要提供HttpSession对象才能正常工作的拦截器中
debugging:当使用Struts2的开发模式时,该拦截器会提供更多的调试信息
execAndWait:后台执行Action,负责将等待画面发送给用户
exception:负责处理异常。它会将异常映射为结果
fileUpload:用于文件上传。负责解析表单中文件域的内容
i18n:支持国际化。它负责把所选的语言和区域放入用户Session
logger:负责日志记录。主要是输出Action的名字
modelDriven:用于模型驱动。当Action实现了ModelDriven接口时,它负责把getModel()方法的结果推入ValueStack中
scopedModelDriven:若Action实现ScopedModelDriven接口,它负责从指定生存范围中找出指定Model,并通过setModel()将该Model传给Action实例
params:最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值
              主要用于在提交表单后,将表单中的参数自动赋值到Action的属性中
prepare:如果Action实现了Preparable接口,将会调用该拦截器的prepare()方法
staticParams:负责将XML中<action/>标签下<param/>标签中的参数传入Action
scope:范围转换拦截器,可以将Action状态信息保存到HttpSession范围或ServletContext范围内
servletConfig:如果某个Action需要直接访问Servlet API,就是通过该拦截器实现的
                        用于将HTTP请求中的HttpServletRequestHttpServletResponse对象传递给Action对象
roles:JAAS拦截器。Java授权和认证服务Java Authentication and Authorization Service
          只有当浏览者取得合适的授权后,才可以调用被该拦截器拦截的Action
timer:负责输出Action的执行时间。它在分析Action的性能瓶颈时比较有用
token:阻止表单重复提交。它检查传到Action中的token,从而防止多次提交
tokenSession:作用与token基本类似,只是它把token保存在HttpSession
validation:通过执行在XxxAction-validation.xml中定义的校验器,从而完成数据校验
workflow:负责调用Action类的validate()方法。如果校验失败,则返回input逻辑视图


使用timer拦截器可以测试Action执行的时间
我们可以用它来测试网站优化前后执行某Action所需的时间,再对比查看优化效果
这里使用timer拦截器测试LoginAction执行所需的时间,注意引用params拦截器接收表单参数

[xhtml] view plaincopyprint?
  1. <action name="login" class="com.jadyer.action.LoginAction">  
  2.     <interceptor-ref name="timer" />  
  3.     <interceptor-ref name="defaultStack" />  
  4. </action>  
登录正确用户名密码时,控制台就会输出类似Executed action [//loginvo!execute] took 16 ms.的信息
若不引用params而引用defaultStack拦截器栈,则LoginAction的执行时间会变得长一些
这是因为defaultStack包含了许多拦截器,它们都需一一执行,所以花费的时间要多些


Struts2的监听器
Struts2还有个的监听器,即com.opensymphony.xwork2.interceptor.PreResultListener接口
该接口中仅定义一个方法,即void beforeResult(ActionInvocation invocation, String resultCode)
观察该监听器的名字,就可以知道,Pre就是在...之前的意思,也就是在结果之前进行监听
它的监听点是:在执行完execute()或者自定义的方法之后
                    真正转到视图资源之前,会自动调用监听器的beforeResult()方法
Struts2的这个监听器,平时用到的不是很多
在上传文件时可能会用到,比如在返回到result之后 ,可以修改一下文件的后缀名,等等..


Struts2的插件
Struts2同样支持插件,但与Struts1支持插件的方式不太一样
它需要我们定义好自己的一些接口等等,然后封装到一个Jar包里面
再把这个JAR包丢到WEB-INFlib目录下,Web应用启动时,Jar包就被加载进来了
在JAR包中必须要有一个配置文件,它的标准命名方式必须是struts-plugin.xml
该XML文件中的具体的配置与struts.xml是一样的,它们的DTD都是相同的
我们可以在http://struts.apache.org/2.0.11/index.html页面查看Struts2的众多插件
点击网站的Plugin Registry大按钮后便可跳转到http://cwiki.apache.org/S2PLUGINS/home.html具体查看

原创粉丝点击