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具体查看 |