`

struts的转换器

阅读更多
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转换。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics