码迷,mamicode.com
首页 > 其他好文 > 详细

Struts2基础学习(四)—类型转换器

时间:2016-05-09 18:23:38      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

一、自定义转换器

1.概述

     Struts2提供了常规类型转换器,可以用于常用数据类型的转换,但如果目标类型是一个特殊类型,则需要自定义转换器。Struts2 类型转换器实际上都是基于OGNL实现的,在OGNL项目中,有一个TypeConverter接口,自定义类型转换器必须实现
ongl.TypeConverter。

     技术分享

 

2.编写类型转换器

(1)实现TypeConverter接口,实现一个方法

    public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType);

(2)继承DefaultTypeConverter类,重写一个方法

	public Object convertValue(Map<String,Object> context,Object value,Class toType)

(3)继承StrutsTypeConverter类重写两个方法

public Object convertFromString(Map context,String[] values,Class toClass)
public String convertToString(Map context,Object o)

 

     java.util.Date类型的属性可以接收格式为2009-07-20的请求参数值。但如果我们需要接收格式为20091221的请求参数,我们必须定义类型转换器,否则struts2无法自动完成类型转换。

第一种:继承DefalutTypeConverter类

public class DateConvert extends DefaultTypeConverter{

	@Override
	public Object convertValue(Map<String,Object> context,Object value,Class toType){

		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

		try{
			//String--->Date
			if(toType == Date.class){
				String[] params = (String[])value;
				return sdf.parseObject(params[0]);
			}
			else if(toType == String.class){ //Date--->String
				Date date = (Date)value;
				return sdf.format(date);
			}
		}catch(ParseException e){
			e.printStackTrace();
		}

		return super.convertValue(context,value,toType);
	}
}

第二种继承StrutsTypeConverter类

public class DateConvert2 extends StrutsTypeConverter{

	private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
	
	//String--->Date
	@Override
	public Object convertFromString(Map context,String[] values,Class toClass){
		
		if(toClass == Date.class){
			try{
				String date = values[0];
				return sdf.parse(date);
			}catch(ParseException e){
				e.printStackTrace();
			}
		}
		return null;
	}

	//Date--->String
	@Override
	public String convertToString(Map context,Object o){
		
		if(o instanceof Date){
			return sdf.format(o);
		}
		
		return null;
	}
}

 

3.注册类型转换器

(1)局部注册

     针对的是表单中某个字段生效。分为属性驱动方式模型驱动方式两种。

      属性驱动的方式
     注意: 在Action所在的包下创建一个文件,文件的格式是:Action类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径。birthday=com.kiwi.convert.DateConvert2

      模型驱动的方式

     注意: 在实体类所在的包下创建一个文件,文件的格式是:实体类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径。

 

(2)全局注册

     针对整个项目所有的日期类型都会生效。

     在src的目录下,创建一个xwork-conversion.properties      

     例如: java.util.Date=cn.itcast.demo3.MyDateConverter

 

4.类型转换的错误处理

(1)当发生类型转换错误的时候,根据报错的信息提示,没有提供input类型的结果视图。那可以在<action>标签中配置input结果视图。
(2)如果Struts2的类型转换器执行类型转换时出现错误,该拦截器将负责将对应错误封装成表单域错误(FieldError),并将这些错误信息放入ActionContext中。
(3)使用类型转换中的错误处理用户定义Action必须继承ActionSupport。
(4)在自定义类型转换器中,异常必须抛出不能捕获,conversionError会处理该异常,然后转入名为input的逻辑视图。
(5)在Action所在包中,创建 ActionName.properties,在局部资源文件中配置提示信息

         invalid.fieldvalue.属性名= 错误信息

 

index.jsp

<s:form action="personAction">
    
        <s:textfield label="用户名" name="username"></s:textfield>
        <s:textfield label="密 码" name="password"></s:textfield>
        <s:textfield label="年 龄"  name="age"></s:textfield>
        <s:textfield label="生 日" name="birthday"></s:textfield>
        
        <s:submit value="提交"></s:submit>
    </s:form>
struts.xml
		<action name="personAction"  class="com.kiwi.action.PersonAction">
			<result name="success">/success.jsp</result>
			<result name="input">/index.jsp</result>
		</action>

结果:

      技术分享

Struts2基础学习(四)—类型转换器

标签:

原文地址:http://www.cnblogs.com/yangang2013/p/5474835.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!