8.struts2自定义类型转换器
**自定义类型转换器(了解)**
1.如果一些特殊的数据类型不能转换,那么需要自定义数据类型的转换器。
2.开发自定义类型转换的开发步骤
* 编写类型转换器
> 实现TypeConverter接口,实现一个方法
* Object convertValue(Map<String,Object> context,Object target, Member member,String propertyName,Object value,Class toType);
> 继承DefaultTypeConverter类,重写一个方法
* Object convertValue(Map<String,Object> context,Object value,Class toType)
> 继承StrutsTypeConverter类,重写两个方法
* Object convertFromString(Map context,String[] values,Class toClass)
> 从字符串转换成具体类型
> values数组,存入的值就是用户输入的值(要转换的值 1981/12/1)
> toClass 要转换的数据的类型 Date.class
* String convertToString(Map context,Object o)
> 把具体的类型转换成字符串
> o 代表的要转换的数据(Date类型的数据)
> 注意:类型转换本身就是一个双向的过程:
* JSP ---> Action String ---> 某个类型
* Action ---> JSP 某个类型 ---> String
* 类型转换的代码,以 1990/10/10 为例,自定义日期转换器,完成转换,下面这段代码是第二种方法,也就是继承了DefaultTypeConverter类。
public Object convertValue(Map<String, Object> context, Object value,
Class toType) {
// 根据toType判断 是请求封装 还是 数据回显
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
if (toType == Date.class) {
// 请求参数封装 (value是字符串)
String[] params = (String[]) value;
String strVal = params[0]; // 转换为 日期类型
try {
return dateFormat.parse(strVal);
} catch (ParseException e) {
e.printStackTrace();
}
} else {
// 回显(value是 Date)
Date date = (Date) value;
return dateFormat.format(date);
}
return null;
}
* 注册类型转换器(包含两种方式)
> 局部注册:针对某个表单中的某个字段生效的!
* 属性驱动的方式:使用set方法接收数据
> 注意:在Action所在的包下创建一个文件,文件的格式是:Action类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径
* 例如:birthday=cn.itcast.demo3.MyDateConverter
* 模型驱动的方式:实现ModelDriven接口的方式
> 注意:在实体类所在的包下创建一个文件,文件的格式是:实体类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径
* 例如:birthday=cn.itcast.demo3.MyDateConverter
> 全局注册:针对整个项目的所有的日期类型都会生效的!
* 在src的目录下,创建一个xwork-conversion.properties (名称是固定的)
> 例如:java.util.Date=cn.itcast.demo3.MyDateConverter
表单demo2.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>
<h3>数据的类型转换</h3>
<s:fielderror/>
<form action="${ pageContext.request.contextPath }/customer" method="post">
客户名称:<input type="text" name="username" /><br/>
客户年龄:<input type="text" name="age" /><br/>
客户生日:<input type="text" name="birthday" /><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
CustomerAction:
package demo2;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class CustomerAction extends ActionSupport{
private String username;
private int age;
private Date birthday;
public void setUsername(String username) {
this.username = username;
}
public void setAge(int age) {
this.age = age;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String add(){
System.out.println(username+"::"+age+"::"+birthday);
return NONE;
}
}
自定义转换器MyDateConverter:
package demo2;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import freemarker.template.SimpleDate;
/**
* 我的日期类型的转换器
* @author mjl
*
*/
public class MyDateConverter extends StrutsTypeConverter{
private SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
/**
* 把String转换成具体的数据的类型
* String[] arrs 用户表单传入的值,要转换的数据
* Class clazz要转换的类型
*/
public Object convertFromString(Map arg0, String[] arrs, Class clazz) {
String val=arrs[0];
if(clazz==Date.class){
//字符串转日期 sdf.parse 日期转字符串 sdf.format()
try {
return sdf.parse(val);
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 把具体的数据的类型转换成字符串
* Object obj代表日期, 被转换成String的对象
*/
public String convertToString(Map arg0, Object obj) {
Date date=(Date) obj;
return sdf.format(date);
}
}
配置properties:
birthday=demo2.MyDateConverter

浙公网安备 33010602011771号