struts的转换器
在传递表单数据的时候会遇到这种情况。在formbeen中或者实体类中定义的类型是Date,Integer等对象类型。那么类型为String类型的传递进去的时候无法完成数据转换。这就需要使用struts的转换器。
转换器的使用要先定义一个converter,只要实现Converter接口,并在convert方法中做好处理,就能完成一个converter。例如下面是一个日期转换器。
public class DateConvert implements Converter {
public DateConvert(String pattern){
super();
this.pattern = pattern;
}
private String pattern;
public Object convert(Class clazz, Object obj) {
String src = (String)obj;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
Date dest = null;
if(clazz == Date.class){
try {
dest = sdf.parse(src);
} catch (ParseException e) {
// TODO Auto-generated catch block
}
}
return dest;
}
}
定义好converter以后要在项目中注册。为了保证项目启动后最初就进行注册,可以考虑在ActionServlet中完成注册。所以我们可以写一个继承了ActionServlet类的Servelet类,并重构init方法进行注册。要注意的是,如果在web.xml文件中设置了初始参数convertNull为true。注册的代码要写在super.init()之后。因为ActionServlet的init方法会调用一个ConvertUtils.deregister()方法,把所有的转换器清除。
以上面的日期转换器为例,具体注册的代码如下:
ConvertUtils.register(new DateConvert("yyyy-MM-dd"), Date.class);
注册完的同时,不要忘记把自己定义的ActionServlet在web.xml文件中配置好。这样,表单中的日期文本就可以传入Date类型的属性中了。
但是还有一个问题,当发生错误需要进行数据回显时,<html:text>标签会从formbeen中读取数据,这个时候读取出的是Date类型的toString方法显示出的值,不是原来自己填写的值了。
要想进行双向转换,struts1已经没法做到了。struts2才可以做到。要在struts1达到我们预期的效果,可以使用其他的途径。
例如使用jstl的fmt标签。把formbeen中的Date类型的数据按一定格式转成String类型,然后再赋值给<html:text>。
示例代码如下:
<fmt:formatDate value="${userForm.user.birthday}" type="date" pattern="yyyy-MM-dd" var="birthday"/>
日期:<html:text property="user.birthday" value="${birthday}"></html:text> <br/>
上面有提到一个convertNull的参数。这个参数的作用要说明一下。
当我们在实体类或者formbeen中定义属性时,若是基本数据类型,那么struts标签在初始化时会先初始化formbeen,那么这个基本数据类型会先初始化为默认值。比如int类型就是0.那么在载入表单页面时,数据就会显示为0.这样非常不理想,明明没有填入任何数据,会显示出0.那么我们可以定义这个基本数据类型为包装类型,比如int就可以定义为Integer。它的默认值是null,null在struts的表单标签中是不显示的。但是当我们在这个标签中不填任何数据,当提交发生错误需要数据回显时问题就来了。struts会自动把null进行转换。Integer类型的null会转化成0.显示出来又会是0.解决这个问题的办法就是设置convertNull为true或者1或者yes或者on还有1都可以。这个可以从源代码中看到。它的作用就是忽略自动null转换。
分享到:
相关推荐
struts日期转换器。页面时间提交到action里自动转换格式,不转换会报错。呵呵,提供给各位大虾参考
这是一个struts2的类型转换器的案例,主要是写的如果将一个20110202这种类型的日期格式进行转换!
source 博文链接:https://callan.iteye.com/blog/185211
Struts 自定义转换器Struts 自定义转换器
对于Struts1和Struts2中都讲到了自定义类型转换器。但是有些人可能对自定义类型转换器的运行原理不理解,这里进行简单介绍一下……
自定义的struts时间转换器,轻松实现java中时间的转换。
传智播客struts2.1源代码_自定义类型转换器
使用struts2提供的转化器,实现Date类型的数据转换
struts 2.0 自定义类型转换器 注册类型转换器 入门实例 简单实例
NULL 博文链接:https://cdxs2.iteye.com/blog/1931878
这是一个讲解struts2框架转换器的ppt,在这个ppt中你可以学到strutsDefaultConversion转换器的前世今生,而已免积分哦!,附带有例子。
对于基本数据类型 strus2可以自动的将其转换成所需要的类型,但是我们自己定义的引用数据类型无法转换,本文详细介绍了strus2的自定义类型转换器
配合博文:http://blog.csdn.net/u011638419/article/details/41276445
Struts的自定义转换器 public class LineConvertor extends StrutsTypeConverter{...}
NULL 博文链接:https://hanazawakana.iteye.com/blog/1681564
Struts2转换器、拦截器、验证以及国际化
Struts2的转换器与验证框架
这是一个关于struts2的类型转换 以及 拦截器 还有校验的例子
NULL 博文链接:https://takeme.iteye.com/blog/1662273