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

  

  

  

posted @ 2018-03-06 00:24  一日看尽长安花cxjj  阅读(140)  评论(0)    收藏  举报