struts2在接受数据后,会将接收到的数据转换成对应的数据类型。这里是struts2中类型转换器的作用,而其中默认的类型转换器有如下(struts-default.xml文件中):
页面数据提交,转换器收到数据后执行convertValue()方法,将相应的string字符串按照内部对应属性类型进行转换,在数据传回页面时,有经过转换器将所以转换成string字符串。
在struts2中要实现数据回显(格式错误时跳转回提交页面,显示数据并提示错误)要借助struts-tags的标签,并在struts.xml对应页面action下,加入name=”input”的页面(struts2默认要求)。
<result name="input">/test.jsp</result>
test.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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<s:form action="test/some" method="post">
<s:textfield name="date" label="date"></s:textfield>
<s:textfield name="age" label="age"></s:textfield>
<s:submit value="submit"></s:submit>
</s:form>
</body>
</html>
如上,在数据格式错误时会有相应提示与数据回显:
自定义的类型转换器(时间类型转换器):
1、参照源码
2、myDateConvert.java
public class myDateConvert extends DefaultTypeConverter {
//value接受的是String[],class是要被转换的类型,因为页面到服务端和服务端到页面都要经过转换器,所以内部是双向逻辑。
@Override
public Object convertValue(Object value, Class toType) {
SimpleDateFormat sdf = null; //new一个时间格式空对象
try{
if(toType == Date.class){//页面到服务端
String dateStr = ((String[])value)[0];//获取要被转换为date参数的第一个string字符串
sdf = getSimpleDateFormat(dateStr);//通过方法获取到对应的格式
ActionContext.getContext().getSession().put("sdf", sdf);//将格式存入session中,以便在回显和页面获取数据时的格式转换
return sdf.parse(dateStr);//返回按格式转换的date值
}
else if(toType == String.class){//服务端到页面
Date date = (Date)value;//回显时数据单值,强转date
sdf = (SimpleDateFormat)ActionContext.getContext().get("sdf");//session获取格式
return sdf.format(date);//返回按格式转换后的string字符串
}
}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)){//用模块匹配来判断格式
sdf = new SimpleDateFormat("yyyy-MM-dd");
}else if(Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$", dateStr)){
sdf = new SimpleDateFormat("yyyy/MM/dd");
}else if(Pattern.matches("^\\d{4}\\d{2}\\d{2}$", dateStr)){
sdf = new SimpleDateFormat("yyyyMMdd");
}else {
throw new TypeConversionException();//若格式都不符合则抛出异常
}
return sdf;
}
}
3、这是自定义的转换器,要进行配置,为action指定转换器。
通过局部类型转换注册:
- 在指定action所在包下,新建properties文件,action名-conversion.properties
- 内容:属性=转换器的全限定性类名
运行:
4、这里数据回显后的错误提示都是英文,于是可以自定义:
- 在对于action包下,新建action名.properties
- 内容:invalid.fieldvalue.变量名=错误提示信息
5、测试运行: