Struts2—拦截器和转换器详解_第1页
Struts2—拦截器和转换器详解_第2页
Struts2—拦截器和转换器详解_第3页
Struts2—拦截器和转换器详解_第4页
Struts2—拦截器和转换器详解_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Struts2Struts2拦截器和转换器回顾qStruts2标签简介q非UI标签q 控制标签q 数据标签qUI标签q 表单标签q 非表单标签q主题和模板目标qStruts2拦截器q 拦截器简介q 自定义拦截器q 拦截器配置初步q Struts2内置拦截器q 拦截器实例qStruts2转换器q 内置转化器q 自定义转换器拦截器简介拦截器拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。Struts2的拦截器类似过滤器,它也默认有init();destroy(); 也有拦截

2、器链,也需要配置。实际上在Struts2框架中有很多拦截器的实现,如国际化、转换器,校验等。拦截器的工作原理工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。拦截器可以在Action执行之前做相似的操作也可以在Action执行之后做回收操作。 每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面。自定义拦截器自定义一个拦截器需要三步:1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。2 在strutx.xml中注册上一步中定义的拦截器。3 在需要使用的Action中引用上述定义的

3、拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。自定义拦截器Interceptor接口声明了三个方法:public interface Interceptor extends Serializable void destroy(); void init(); String intercept(ActionInvocation invocation) throws Exception; Init方法在拦截器类被创建之后,在对Action镜像拦截之前调用,相当于一个post-constructor方法,使用这个方法可以给拦截器类做必要

4、的初始话操作。Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。另外AbstractInterceptor提供了一个简单的Interceptor的实现,这个实现为:public abstract class AbstractInterceptor imp

5、lements Interceptor public void init() public void destroy() public abstract String intercept(ActionInvocation invocation) throws Exception;在不需要编写init和destroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。自定义拦截器我们尝试编写一个Session过滤用的拦截器,该拦截器查看用户Session中是否存在特定的属性(LOGIN属性)如果不存在,中止后续操作定位到LOGIN,否则执行原定操作

6、,代码为:public class CheckLoginInterceptor extends AbstractInterceptor public static final String LOGIN_KEY = LOGIN; public static final String LOGIN_PAGE = global.login; public String intercept(ActionInvocation actionInvocation) throws Exception System.out.println(begin check login interceptor!); / 对L

7、oginAction不做该项拦截 Object action = actionInvocation.getAction(); if (action instanceof LoginAction) System.out.println(exit check login, because this is login action.); return actionInvocation.invoke(); / 确认Session中是否存在LOGIN Map session = actionInvocation.getInvocationContext().getSession(); String lo

8、gin = (String) session.get(LOGIN_KEY); if (login != null & login.length() 0) / 存在的情况下进行后续操作。 System.out.println(already login!); return actionInvocation.invoke(); else / 否则终止后续操作,返回LOGIN System.out.println(no login, forward login page!); return LOGIN_PAGE; 自定义拦截器注册拦截器注册拦截器 将上述拦截器设定为默认拦截器:这样在后续同一

9、个package内部的所有Action执行之前都会被login拦截。注册并引用注册并引用Interceptor login.jsp /secure/home 自定义拦截器可以将多个拦截器合并在一起作为一个堆栈调用,当一个拦截器堆栈被附加到一个可以将多个拦截器合并在一起作为一个堆栈调用,当一个拦截器堆栈被附加到一个Action的时候,的时候,要想要想Action执行,必须执行拦截器堆栈中的每一个拦截器。执行,必须执行拦截器堆栈中的每一个拦截器。login.jsp/secure/home内置拦截器注册拦截器注册拦截器 将上述拦截器设定为默认拦截器:这样在后续同一个package内部的所有Actio

10、n执行之前都会被login拦截。内置拦截器上述说明的拦截器在默认的上述说明的拦截器在默认的Struts2应用中,根据惯例配置了若干个拦截器堆栈,详细情参看应用中,根据惯例配置了若干个拦截器堆栈,详细情参看struts-default.xml其中有一个拦截器堆栈比较特殊,他会应用在默认的每一个其中有一个拦截器堆栈比较特殊,他会应用在默认的每一个Action上。上。dojo.*input,back,cancel,browseinput,back,cancel,browse内置拦截器需要说明的几点:需要说明的几点:1拦截器执行的顺序按照定义的顺序执行,例如:拦截器执行的顺序按照定义的顺序执行,例如:

11、的执行顺序为:的执行顺序为:thisWillRunFirstInterceptorthisWillRunNextInterceptorfollowedByThisInterceptorthisWillRunLastInterceptorMyAction1MyAction2(chain)MyPreResultListenerMyResult(result)thisWillRunLastInterceptorfollowedByThisInterceptorthisWillRunNextInterceptorthisWillRunFirstInterceptor内置拦截器2使用默认拦截器配置每个使

12、用默认拦截器配置每个Action都需要的拦截器堆栈,例如:都需要的拦截器堆栈,例如:login.jsp/secure/home可以按照如下的方式定义:可以按照如下的方式定义:login.jsp/secure/home转换器一、概述一、概述在在B/S应用中,将字符串请求参数转换为相应的数据类型,是应用中,将字符串请求参数转换为相应的数据类型,是MVC框架提供的功能,框架提供的功能,而而Struts2是很好的是很好的MVC框架实现者,理所当然,提供了类型转换机制。框架实现者,理所当然,提供了类型转换机制。Struts2的类型转换是基于的类型转换是基于OGNL表达式的,只要我们把表达式的,只要我们把

13、HTML输入项(表单元素和输入项(表单元素和其他其他GET/POET的参数)命名为合法的的参数)命名为合法的OGNL表达式,就可以充分利用表达式,就可以充分利用Struts2的转换的转换机制。机制。除此之外,除此之外,Struts2提供了很好的扩展性,开发者可以非常简单的开发自己的类型转提供了很好的扩展性,开发者可以非常简单的开发自己的类型转换器,完成字符串和自定义复合类型之间的转换。总之,换器,完成字符串和自定义复合类型之间的转换。总之,Struts2的类型转换器提供了的类型转换器提供了非常强大的表现层数据处理机制,开发者可以利用非常强大的表现层数据处理机制,开发者可以利用Struts2的类

14、型转换机制来完成任意的类型转换机制来完成任意的类型转换。的类型转换。 转换器二、实现自定义类型转换器 实现TypeCoverter接口,或者继承DefaultTypeConverter实现类(该类实现了TypeCoverter接口),通过继承该实现类来实现自己的类型转换器。重写convertValue方法即可。 为了简化类型转换器的实现,Struts2提供了一个StrutsTypeConverter抽象类,这个抽象类是DefaultConverter的子类。实现了方法,并提供了2个不同转换方向的方法:Object convertToString(Map context,String value

15、s,Class toClass)和String convertFromString(Map context,Object o)。 转换器三、注册应用 实现了自定义类型转换器之后,将该类型转换器注册在Web应用中,Struts2框架才可以正常使用该类型转换器。 关于类型转换器的注册方式,主要有3种: A、注册局部类型转换器:仅仅对某个Action的属性起作用。 B、注册全局类型转换器:对所有Action的特定类型的属性都会生效。 C、使用JDK1.5的注释来注册类型转换器:通过注释方式来生成类型转换器。 1、局部类型转换器 提供如下格式的文件 文件名: ActionName-conversion

16、.properties 内容:多个propertyName(属性名)=类型转换器类(含包名),如 date=com.aumy.DateConverter 存放位置:和ActionName类相同路径。 2、全局类型转换器 提供如下格式的文件 文件名: perties 内容: 多个“复合类型对应类型转换器”项组成,如 java.Util.Date=com.aumy.DateConverter 存放位置:WEB-INF/classes/目录下。 转换器struts2内建类型转换器内建类型转换器如下类型可以相互转化:boolean和Boolean:完成字符串和布尔值之间的转换; char和Character:完成字符串和字符之间的转换; int和In

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论