如何自定义类型转换器 ?
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。

最新文章

  1. bzoj3481题解
  2. python GUI输入窗口
  3. vs2010 rdlc .net4.0 卸载 Appdomain 时出错。 (异常来自 HRESULT:0x80131015) 解决办法
  4. cri-o pod 创建源码分析
  5. 熟悉linux开发环境(实验)
  6. 273. Integer to English Words
  7. 开发技巧01——改变Toast显示位置
  8. 关于使用Element.getNodeValue()返回NULL的问题
  9. ICOPclient版本号,异步connect
  10. 【ASP.NET】验证控件
  11. 【J2SE】java实现简单照片查看器
  12. 如何从mysql中将数据导入到sqlserver
  13. PDB调试python代码常用命令
  14. P1033 自由落体
  15. springcloud 服务注册、反注册 AOP 拦截,实现自定义功能
  16. 廖雪峰Java7处理日期和时间-4最佳实践-最佳实践
  17. 关于jquery的入门,简单的封装。
  18. C++之插入迭代器
  19. [leetcode]Binary Tree Zigzag Level Order Traversal @ Python
  20. ES6基础教程(整理自阮一峰)

热门文章

  1. MySQL 8.0及以上版本设置密码
  2. web前端Vue+Django rest framework 框架 生鲜电商项目实战✍✍✍
  3. 从可变长函数到legb
  4. 4-Ubuntu-启动/关闭/重启mysql服务
  5. .net core 根据环境变量区分正式、测试 配置文件
  6. WAMP中的mysql设置密码(默认密码为空)及phpmyadmin的配置
  7. 开启SSH 使用SSH登录工具连接虚拟机
  8. 如何定义一个BUG
  9. 修改Ubuntu16.04默认主题标题栏的颜色
  10. leetcood学习笔记-54-螺旋矩阵