Struts2日期类型转换
xs.setCssj(new java.sql.Date(xs.getCssj().getTime()));//在传入时可选择更改为sql.Date - 但是用 util.Date 也是可以的 由于我们在Struts2 jsp页面传给action之前的日期类型被——struts2的内置类型转换器给转换成了String类型<或者是 转换器会根据目前所在的浏览器的语言类型,进行相应的日期类型的转换,只不过不是struts2对应的 内置相应语言的 日期罢了>,所以为了统一所有的兼容性,我们就是需要进行-手动的 全局也好、局部属性的类型格式的string-date的转换.
—-MORE—-
在Java Web开发中,进行上述转换一般有以下几种:
1、在Servlet中,这一切的转换我们得自己写代码完成;
2、在Struts1.x中,我们通过apachecommons-beanutils中的converters来帮助完成这些事情;
3、在Struts2中,使用的则是基于ongl的类型转换;
……由于类型转换的通用性,因而Web框架都会实现大多数类型的转换功能,而不需要程序员编码实现。然而,对于java.util.Date这种类型的转换,
各大框架似乎做得都不尽如人意。如:在Struts1.x中,该类型的转换就会有问题,很多人建议使用java.sql.Date这种类型来解决日期转换的问题
(实际上可以自定义一个类型转换器来解决该问题)。在Struts2中,这个问题似乎依然存在,也许你从来没有遇到过。
在开发的过程中,也许就像你一样,我没有对日期类型的转换做任何特殊的处理,而且Struts2也很好的帮我完成了转换。然而同事测试的时候却出现
了一个“莫名其妙”的问题:输入一个常用格式的日期类型yyyy-MM-dd,到后台却报错:找不到对应的set方法——setEffDate(Ljava.lang.String)。
的确,程序中只有setEffDate(java.util.Date)这个方法,没有setEffDate(Ljava.lang.String)这个方法。从Ljava.lang.String可以看出,
传到后台的String类型并没有转换成Date类型,因而报错。
查看struts2的源码:
在XWorkBasicConverter类中
private Object doConvertToDate(Map context, Object value, Class toType) {
。。。。。
}
发现使用 locale 来进行日期的格式化。而日期格式YYYY-MM-DD 只有在中文的语言环境才会有。
查看DateFormat中关于SHORT、MEDIUM、LONG的说明,可以知道,对于yyyy-MM-dd这种日期类型,在英语语言中是没法匹配的,由于Struts2匹配日期时,
使用了Locale,可见,IE浏览器默认的语言环境是英语。一经查看,果然如此,把中文设置为默认语言环境,再测试,没问题了。
针对这个问题,我们没法要求客户一定设置中文为默认浏览器的语言环境。因而对于Date类型的转换,可以自己定义一个转换器。
因而对于Date类型的转换,可以自己定义一个转换器。
参考http://www.javaeye.com/wiki/struts2/1365-passing-parameters-in-struts2
中的一个类型转换器定义(不适合国际化的环境),如需要,你可以定义自己的转换器
可以将该转换器注册为全局的:在classpath下建立xwork-conversion.properties文件,内容为:java.util.Date=你的类型转换器的完整限定类名
针对日期类java.util.Date进行类型转换,要求客户端使用“yyyy-MM-dd”,“yyyy/MM/dd”中的任意一种输入,并以“yyyy-MM-dd”的格式输出,该类型转换应用于全局范围
先定义一个实体类:
package cn.entity;
import java.util.Date;
public class User {
private String username;//名字
private Integer age;//年龄
private Date birthday;//生日
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
创建Action:
package cn.action;
import cn.entity.User;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport{
private User user;
public String execute(){
System.out.println(“姓名:”+user.getUsername());
System.out.println(“生日:”+user.getBirthday());
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
创建类型转换器 StrutsTypeContentType类是抽象类,定义了两个抽象方法,用于不同的转换方向 1.public Object convertFromString(Map context, String[] values, Class toType):将一个或多个字符串值转换为指定的类型 2.public String convertToString(Map context, Object object):将指定对象转化为字符串 如果继承StrutsTypeContentType类编写自定义类型转换器,需重载以上两个抽象方法。
package cn.strutstypeconverter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import com.opensymphony.xwork2.conversion.TypeConversionException;
public class DateConverter extends StrutsTypeConverter{
//支持转换的多种日期格式,可增加时间格式
private final DateFormat[] dfs={
new SimpleDateFormat(“yyyy年MM月dd日”),
new SimpleDateFormat(“yyyy-MM-dd”),
new SimpleDateFormat(“MM/dd/yy”),
new SimpleDateFormat(“yyyy.MM.dd”),
new SimpleDateFormat(“yy.MM.dd”),
new SimpleDateFormat(“yyyy/MM/dd”)
};
/**
* 将指定格式字符串转换为日期类型
/
@Override
public Object convertFromString(Map context, String[] values, Class toType) {
String dateStr=values[0]; //获取日期的字符串
for (int i = 0; i < dfs.length; i++) { //遍历日期支持格式,进行转换
try {
return dfs[i].parse(dateStr);
} catch (Exception e) {
continue;
}
}
//如果遍历完毕后仍没有转换成功,表示出现转换异常
throw new TypeConversionException();
}
/\*
* 将日期转换为指定的字符串格式
*/
@Override
public String convertToString(Map context, Object object) {
Date date=(Date) object;
//输出格式是yyyy-MM-dd
return new SimpleDateFormat(“yyyy-MM-dd”).format(date);
}
}
Struts2提供了两种方式配置转换器 1.应用于全局范围的类型转换器 在src目录创建xwork-conversion.properties
java.util.Date=cn.strutstypeconverter.DateConverter
2.应用于特定类的类型转换器 在特定类的相同目录下创建一个名为ClassName-conversion.properties的属性文件
user.birthday=cn.strutstypeconverter.DateConverter
配置struts.xml:
<?xml version=”1.0” encoding=”UTF-8” ?>
<!DOCTYPE struts PUBLIC
“-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”
“http://struts.apache.org/dtds/struts-2.0.dtd">
开发输入与展示页面 index.jsp:
<%@ page language=”java” import=”java.util.*” pageEncoding=”utf-8”%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+”://“+request.getServerName()+”:”+request.getServerPort()+path+”/“;
%>
<%@taglib uri=”/struts-tags” prefix=”s”%>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
用户名: |
年龄: |
生日: |
success.jsp:
<%@ page language=”java” import=”java.util.*” pageEncoding=”utf-8”%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+”://“+request.getServerName()+”:”+request.getServerPort()+path+”/“;
%>
<%@taglib uri=”/struts-tags” prefix=”s”%>
<%@taglib uri=”http://java.sun.com/jsp/jstl/core“ prefix=”c”%>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
成功
效果展示: 或
作者:Monodrama
出处:http://www.cnblogs.com/jingpeipei/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。