1、局部类型转换器: 只能给特定的 action 用;
login.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login" method="post">
日期:<input type="text" name="date"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="user" extends="struts-default">
<action name="login" class="com.struts.user.UserAction" method="login">
<result name="login">/index.jsp</result>
</action>
</package>
</struts>
UserAction.java:
package com.struts.user;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Date;
public class UserAction extends ActionSupport {
/**
* 将表单提交的日期数据封装到 Date 类型的属性中:
* 表单的 name 属性必须是 date;
* 表单提交的数据全部是 字符串类型的;
* struts 默认情况下,能够将 yyyy-MM-dd 格式的 字符串数据转换为 Date 类型;
* 如果是其他格式的数据,比如 yyyyMMdd,就不能够自动转换为 Date 类型了,需要我们自定义类型转换器;
*
* 自定义类型转换器步骤:
* 1、自定义一个类,继承 StrutsTypeConverter 类;
* 2、创建一个 properties 文件配置自定义转换器类;
* properties 文件必须和 action 在同一包下;
* properties 的名字必须是 ActionClassName-conversion.properties
* properties 的内容必须是 表单的name=自定义类的全路径
*/
private Date date;
public void setDate(Date date) {
this.date = date;
}
public String login() {
System.out.println(date);
return "login";
}
}
MyConverter.java:
package com.struts.user;
import org.apache.struts2.util.StrutsTypeConverter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
/**
* 自定义类型转换器;
*/
public class MyConverter extends StrutsTypeConverter {
// 要求:要支持的日期格式有以下几种:yyyyMMdd、yyyy-MM-dd、yyyy年MM月dd日、yyyy/MM/dd
// 预定义日期格式:
DateFormat[] dateFormats = {
new SimpleDateFormat("yyyyMMdd"),
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyy年MM月dd日"),
new SimpleDateFormat("yyyy/MM/dd")
};
/**
* 把 String 类型转换成 指定的类型
* @param map 当前上下文环境
* @param strings jsp 表单提交的字符串值的数组
* @param aClass 要转换为的目标类型
* @return
*/
@Override
public Object convertFromString(Map map, String[] strings, Class aClass) {
// 判断内容不能为空
if (strings == null || strings.length == 0){
return null;
}
// 判断类型必须为 Date 类型
if (Date.class != aClass){
return null;
}
// 循环判断:如果能够按照指定的格式转换成功,则直接退出;如果按照指定的格式转换失败,则继续按照下一种格式转换;
for (int i = 0; i < dateFormats.length; i++){
try {
// 将符合 yyyyMMdd 格式的字符串 解析成 Date 格式
// SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
return dateFormats[i].parse(strings[0]);
} catch (ParseException e) {
continue;
}
}
return null; // 如果全部转换失败,返回 null
}
@Override
public String convertToString(Map map, Object o) {
return null;
}
}
UserAction-conversion.properties:
date=com.struts.user.MyConverter
2、全局类型转换器:可以给所有的 action 用;
全局类型转换器 和 局部类型转换器的 类是一样的写法,唯一不同的是配置文件不一样。
全局类型转换器的 配置文件必须为:xwork-conversion.properties,且必须放在 src 目录下;
内容为:要转换的类型=自定义类型转换器类的全名;
比如:Java.util.Date=com.struts.user.MyConverter,表示遇到 Date 类型的数据就调用 自定义的类型转换器(MyConverter).