`
chenssy
  • 浏览: 61753 次
  • 性别: Icon_minigender_1
  • 来自: 岳阳
社区版块
存档分类
最新评论

Struts 2读书笔记-----Struts 2的自定义类型转换器

 
阅读更多

大部分时候,我们使用Struts2内建的类型转换器就可以满足大部分类型转换需求了。但是在有些特殊的情况下,如:需要把一个字符串转换成一个复合对象时,这个时候就需要使用自定义类型转换器了。

实现自定义类型转换器一般需要实现以下两步:

1、编写自己的类型转换器

2、注册类型转换器

1、自定义类型转换器

编写自定义类型转换器一般都要实现一个类:DefaultTypeConverter。实现自定义转换器需要重写该类的convertValue方法。

convertValue方法负责完成类型的转换。但是这种转换是双向的,即如当需要把字符串转换成User实例时,是通过该方法实现的;当需要把User实例转换成字符串是,也是通过该方法实现的。

为了让该方法实现双向转换,是通过判断toType的类型即可判断转换的方向。toType类型是需要转换的目标类型,当toType类型是User类型时,表面需要将字符串转换成User实例;当toType类型是String类型时,表明需要把User实例转换为字符串类型。

2、注册类型转换器

注册类型转换器,就是讲类型转换器注册在Web应用中,告诉Struts2如何使用这些类型转换器。

Struts2提供了三种类型转换器:

注册局部类型转换器:该转换器仅仅对某个Action的属性起作用

注册全局类型转换器:该转换器对所有的Action的特定类型的属性都会生效。

使用JDK的注释来注册类型转换器:通过注释方式来注册类型转换器。

1)、局部类型转换器

注册局部类型转换器使用局部类型转换文件指定。只要在该转换文件中增加一行即可:

<propName>=<converterClass>

<propName>替换成需要进行转换的属性。将<converterClass>替换成类型转换器的实现类即可。

    一般来说,局部类型转换器具有很大的局限性。所以一般都会将类型转换器注册成全局类型转换器。

2)、全局类型转换器

全局类型转换器不是对指定的Action的指定属性起作用,而是对指定的类型起作用。

注册全局类型转换器应该提供一个xwork-conversion.properties文件,该文件时全局类型转换文件。

注册全局类型转换器只需在全局类型转换文件中添加一行即可:

<propType>=<ConvertClass>

<propType>替换成需要进行类型转换的类型,将<ConvertClass>替换成类型转换器的实现类即可。

例题:

类型转换器:

public class UserConverter extends DefaultTypeConverter{

	//重写convertvalue方法,该方法需要完成双向转换
	public Object convertValue(Map context, Object value,Class toType) {
		//当需要将字符串向User类型转换时
		if(toType == UserBean.class){
			//系统的请求参数是一个字符串数组
			String[] params = (String[]) value;
			for (int i = 0; i < params.length; i++) {
				System.out.println(params[i]);
			}
			//创建一个User实例
			UserBean user = new UserBean();
			//只处理请求参数数组第一个数组元素,并将该字符串以英文逗号分割成两个字符串
			String[] userValue = params[0].split(",");
			//为user实例赋值
			user.setName(userValue[0]);
			user.setPassword(userValue[1]);
			
			return user;
		}
		if(toType == String.class){
			//将需要转换的值强制类型转换成User类型
			UserBean user = (UserBean) value;
			return "<" +user.getName()+","+user.getPassword()+">";
		}
		return null;
	}
	
}


注册类型转换器:

com.app.entity.UserBean=com.app.converter.UserConverter

jsp文件:

<s:form action="RegisterLogin">
  	<s:textfield name="user.name" label="用户名"></s:textfield>
   	<s:submit value="登陆"></s:submit>
   </s:form>


当在jsp页面的文本框中输入:chenssy,chentmt即可登录成功

其实Struts2提供了一个StrutsTypeConverter抽象类,实现这个抽象类可以简化类型转换器的实现。该类实现了DefaultTypeConverterconvertValue方法,实现该方法时,它将两个不同转换方法替换成不同方法—当需要把字符串转换成复合类型时,调用convertFromString抽象方法;当需要把复合类型转换成字符串时,调用convertToString抽象方法。

由上面可以知道:我们只需要继承StrutsTypeConmverter抽象类,并且重写convertFromString方法和convertToString方法,我们就可以简单实现自己的类型转换器。

	public class UserConverter extends StrutsTypeConverter{
	//实现将字符串类型转换成复合类型的方法
	public Object convertFormString (Map context,String[] values,Class toClass){
	......
	} 
	
	//实现将复合类型转换成字符串类型的方法
        Public String convertToString (Map context,Object o){
	.........
	}
}   


读李刚《轻量级Java EE企业应用实战》


分享到:
评论

相关推荐

    Struts2 学习笔记

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 ...09 自定义拦截器 38 10 类型转换 38 Struts2总结 39

    struts2课程笔记

    struts2知识点:处理流程,基本配置,与servlet的API解耦,结果类型,通配符和动态方法的调用,类型转换,文件上传,拦截器,表单验证,国际化,OGNL表达式,UI标签,模型驱动,防止表单重复提交,项目练习知识点:...

    struts2学习笔记

    Struts2环境搭建 Struts2类型转换 Struts2输入校验 拦截器 文件的上传与下载 Struts2的国际化 深入探析 struts2与servlet API耦合方法

    struts2学习笔记十(第10讲.Struts2的核心 拦截器)

    NULL 博文链接:https://zhaolianyang.iteye.com/blog/870600

    struts学习笔记(2)

    当前struts2的filter过滤到一个.action结尾的请求的时候,会把这个请求交给struts2内部的拦截器(interceptor) 2)拦截器起到什么作用 可以帮我们丰富action的功能,比自动类型转换(页面传一个String类型的id,接收的...

    吴天雄--SpringMVC笔记.doc

    SpringMVC笔记内容:第一天(SpringMVC的概述、SpringMVC与Struts2优势分析、重要组件、运行原理、SpringMVC环境搭建、@RequestMapping注解详解、字符编码过滤器、传参形式(基本数据类型或String、对象类型、对象....

    JavaEE5学习笔记11-JSF转换器验证器使用经验总结

    JavaEE5学习笔记11-JSF转换器验证器使用经验总结。

    struts2框架核心笔记整力

    struts2框架经典整理,异常处理的方式和配置,全局资源文件执行国际化的方法,数据校验,数据类型转换器,基础讲解。

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

    整理后java开发全套达内学习笔记(含练习)

    int 32bit, -2^31~2^31-1 (2147483648,20亿,10位有效数字) long 64bit, -2^63~2^63-1 (900亿亿,20位有效数字) float 32bit, 9位有效数字,含小数(四舍五入)(小数点算一位,正负号不算) double 64bit, 18位...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题49.Struts2的拦截器是什么?你都用它干什么?.mp4 │ Java面试题50.Spring MVC的执行流程.mp4 │ Java面试题51.SpringMVC和Struts2的不同.mp4 │ Java面试题52.简单介绍一下Spring或者Spring的两大核心...

Global site tag (gtag.js) - Google Analytics