您的位置:首页 > 编程语言 > Java开发

Struts2的Interceptor和Listener以及Plugin

2015-08-19 15:14 621 查看
Struts2的Interceptor和Listener以及Plugin

 

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请求中的HttpServletRequest和HttpServletResponse对象传递给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?

<action name="login" class="com.jadyer.action.LoginAction">  

    <interceptor-ref name="timer" />  

    <interceptor-ref name="defaultStack" />  

</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-INF的lib目录下,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具体查看

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: