目标:当在前台的form表单当中输入多种不同格式的日期字符串数据之后,类型转换器对象都能够实现对所输入的日期字符串数据的解析操作。eg:yyyyMMdd或yyyy-MM-dd或yyyy/MM/dd等格式的日期字符串类型转换器都能够将其转换为Date类型。
登录界面login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录界面</title>
</head>
<body>
<!-- 在使用struts标签对象之后,当登录发生异常时,会对数据进行回写操作,并将异常信息进行显示操作 -->
<s:form method="post" action="login">
<s:textfield name="birthday" label="生日"/>
<s:submit name="提交"/>
</s:form>
</body>
</html>
处理器action:
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class loginAction extends ActionSupport{
private Date birthday;
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String execute()
{
System.out.println("执行execute方法");
return "success";
}
}
日期类型转换器对象:DateConverter
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.conversion.TypeConversionException;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
import freemarker.template.SimpleDate;
public class DateConverter extends DefaultTypeConverter{
//当前的类型转换器要想进行使用必须要进行注册操作
/* (non-Javadoc)
* @see com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter#convertValue(java.lang.Object, java.lang.Class)
*/
@Override
public Object convertValue(Object value, Class toType) {
SimpleDateFormat sdf;//声明一个日期转换对象
try
{
if(toType==Date.class)
{
String dateStr=((String[])value)[0];//将value对象当中的数据强转为字符串数组类型
sdf=getSimpleDateFormat(dateStr);//根据所输入的日期字符串来实例化日期类型转换对象
ActionContext.getContext().getSession().put("sdf",sdf);//将当前所实例化得日期转换类型对象存放到数组session中
return sdf.parse(dateStr);//使用日期转换类型对象来将指定格式的日期字符转换为对应的Date类型
}
else
if(toType==String.class)
{//表明当前所传递过来的参数为date类型
Date date=(Date)value;
//获取session会话对象当中所存放的日期转换类型对象
sdf=(SimpleDateFormat) ActionContext.getContext().getSession().get("sdf");
return sdf.format(date);//将日期类数据转换为指定的模板形式的字符串数据
}
}
catch(ParseException e)
{
e.printStackTrace();
}
return super.convertValue(value, toType);
}
//该方法的作用是根据所输入的日期字符串的格式不同而获取不同的模板来建立不同类型的日期转换类型对象,间接性的实现日期类型转换
//的动态操作
private SimpleDateFormat getSimpleDateFormat(String dateStr) {
//根据所输入日期的格式不同而实例化不同格式类型的日期转换类型对象
SimpleDateFormat sdf=null;//声明一个日期转换类型对象
if(Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$",dateStr))
{//表明当前所输入的日期类型的格式为2017-01-27
sdf=new SimpleDateFormat("yyyy-MM-dd");
}
else
if(Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$",dateStr))
{//表明当前所输入的日期类型的格式为2017/01/27
sdf=new SimpleDateFormat("yyyy/MM/dd");
}
else
if(Pattern.matches("^\\d{4}\\d{2}\\d{2}$",dateStr))
{//表明当前所输入的日期类型的格式为2017-01-27
sdf=new SimpleDateFormat("yyyyMMdd");
}
else
throw new TypeConversionException();
return sdf;
}
}
登录成功后进行日期显示的界面:success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:debug/>
<h2 style="color: red;">登录成功</h2>
对值栈对象当中的birthday数据进行输出操作:<br>
<s:property value="birthday"/>
<br>
采用日期标签来进行输出操作:(并设定输出的日期格式):<br>
<s:date name="birthday" format="yyyy年MM月dd日"/>
</body>
</html>
对日期类型转换器进行注册操作,建立一个loginAction-conversion.properties文件来将当前日期类型转换器注册为一个局部类型转换器对象
birthday=com.converter.DateConverter
在建立一个队日期无效字段信息进行回写的文件来设置类型转换失败时所回写的数据内容
invalid.fieldvalue.birthday=\u65E5\u671F\u683C\u5F0F\u53EA\u80FD\u4E3Ayyyy-MM-dd\u6216yyyy/MM/dd\u6216yyyyMMdd\u4E09\u79CD\u7C7B\u578B
程序运行效果:
当输入的是错误信息时: