struts2类型转换2

如何自定义类型转换器 ?
1). 为什么需要自定义的类型转换器 ? 因为 Struts 不能自动完成 字符串 到 引用类型 的 转换.
2). 如何定义类型转换器:
I. 开发类型转换器的类: 扩展 StrutsTypeConverter 类.
II. 配置类型转换器:
有两种方式
①. 基于字段的配置:
> 在字段所在的 Model(可能是 Action, 可能是一个 JavaBean) 的包下, 新建一个 ModelClassName-conversion.properties 文件
> 在该文件中输入键值对: fieldName=类型转换器的全类名.
> 第一次使用该转换器时创建实例.
> 类型转换器是单实例的!

②. 基于类型的配置:
> 在 src 下新建 xwork-conversion.properties
> 键入: 待转换的类型=类型转换器的全类名.
> 在当前 Struts2 应用被加载时创建实例.

老版本的struts2项目中常用来对Date日期类型做转换,而在新版本的struts2项目中,实际上

是对于日期类型不需要类型转换器,因为常用的日期值2018-03-16 20:11:49和2018-03-16

这种struts2可以自动类型转换成Date类型。

官网原文:

内置类型转换支持
类型转换由XWork实现。XWork会自动为您处理最常见的类型转换。这包括对以下各项的字符串转换支持:


布尔值/布尔值
字符/字符
int / Integer,float / Float,long / Long,double / Double
日期 - 使用与当前请求关联的语言环境的SHORT格式(详细见java分类下的日期格式汇总)
数组 - 假设单个字符串可以转换为单个项目
集合 - 如果不能确定对象类型,则假定它是一个字符串,并创建一个新的ArrayList>请注意,对于数组,类型转换将按照数组元素的类型并尝试单独转换每个项目>。与任何其他类型转换一样,如果无法执行转换,则使用标准类型转换>错误报告来指示处理类型转换时发生的问题。
枚举
BigDecimal和BigInteger

老项目中常用的类型转换方式是②基于类型的配置:定义日期类型转换

常用工具类1:
package com.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import javax.servlet.ServletContext;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.util.StrutsTypeConverter;

public class DateConverter extends StrutsTypeConverter {

	private DateFormat dateFormat;
	
	public DateConverter() {
		System.out.println("DateConverter's constructor...");
	}
	
	public DateFormat getDateFormat(){
		if(dateFormat == null){
			//获取当前 WEB 应用的初始化参数 pattern(即web.xml的pattern)
			ServletContext servletContext = ServletActionContext.getServletContext();
			System.out.println(servletContext); 
			String pattern = servletContext.getInitParameter("pattern");
			dateFormat = new SimpleDateFormat(pattern);
		}
		
		return dateFormat;
	}
	
	@Override
	public Object convertFromString(Map context, String[] values, Class toClass) {
		
		System.out.println("convertFromString...");
		
		if(toClass == Date.class){
			if(values != null && values.length > 0){
				String value = values[0];
				try {
					return getDateFormat().parseObject(value);
				} catch (ParseException e) {
					e.printStackTrace();
				}
			}
		}
		
		//若没有转换成功, 则返回 values
		return values;
	}

	@Override
	public String convertToString(Map context, Object o) {
		
		System.out.println("convertToString...");
		
		if(o instanceof Date){
			Date date = (Date) o;
			return getDateFormat().format(date);
		}
		
		//若转换失败返回 null
		return null;
	}

}

web.xml中定义要转换的日期格式:

  <context-param>
  <param-name>pattern</param-name>
  <param-value>yyyy-MM-dd hh:mm:ss</param-value>
  </context-param>

  

常用工具类2:
package com.utils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;

public class MyDateConverter extends DefaultTypeConverter {
	private static final DateFormat[] ACCEPT_DATE_FORMATS = new DateFormat[]{
			new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a"), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),
			new SimpleDateFormat("yyyy-MM-dd HH:mm a"), new SimpleDateFormat("yyyy-MM-dd HH:mm"),
			new SimpleDateFormat("dd/MM/yyyy"), new SimpleDateFormat("yyyy-MM-dd"), new SimpleDateFormat("yyyy/MM/dd")};

	public Object convertValue(Map context, Object value, Class toType) {
		if (toType != Date.class) {
			if (toType == String.class) {
				Date arg11 = (Date) value;
				return (new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss")).format(arg11);
			} else {
				return null;
			}
		} else {
			String date = null;
			String[] params = (String[]) ((String[]) value);
			date = params[0];
			DateFormat[] arg5 = ACCEPT_DATE_FORMATS;
			int arg6 = arg5.length;
			int arg7 = 0;

			while (arg7 < arg6) {
				DateFormat format = arg5[arg7];

				try {
					return format.parse(date);
				} catch (Exception arg10) {
					++arg7;
				}
			}

			return null;
		}
	}
}

注意:

1,还需要在src下编写xwork-conversion.properties

  内容举例如下:

  java.util.Date =com.utils.MyDateConverter
  #java.util.Date =com.utils.DateConverter

2,注意由后台的对象转成页面显示的String类型,要想类型转换器起作用。必须使用ognl

而不是el。

原文地址:https://www.cnblogs.com/zxwBj/p/8620514.html