版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
在前端提交的表单中有时会遇到需要手动转换的参数类型,比如日期格式,struts2默认的转换器只能将yyyy-MM-dd
格式的字符串转成日期Date型,但是假设现在的需求是yyyy/MM/dd
,这时我们就需要自定义转换器。
1、日期转换Demo
首先我们通过一个用户注册的Demo演示日期的转换。
①、项目目录结构
②、User.java
类
package cn.hestyle.model;
import java.util.Date;
public class User {
private String username;
private String password;
private Date birthday;
private String hobbies;
private boolean married;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getHobbies() {
return hobbies;
}
public void setHobbies(String hobbies) {
this.hobbies = hobbies;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public boolean isMarried() {
return married;
}
public void setMarried(boolean married) {
this.married = married;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", birthday=" + birthday +
", hobbies='" + hobbies + '\'' +
", married=" + married +
'}';
}
}
③、RegisterAction.java
类
package cn.hestyle.web.action;
import cn.hestyle.model.User;
import com.opensymphony.xwork2.ModelDriven;
/**
* 通过实现ModelDriven<User>接口
*/
public class RegisterAction implements ModelDriven<User> {
//user的各个属性必须实现getter、setter方法,并且user需要手动new出来
private User user = new User();
public String register(){
System.out.println(user);
return "success";
}
@Override
public User getModel() {
System.out.println("调用了getModel方法");
return user;
}
}
④、struts.xml
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- 开启开发者模式 -->
<constant name="struts.devMode" value="true"></constant>
<!-- 定义一个名为user的包 -->
<package name="user" extends="struts-default">
<!-- 声明register动作,并且使用RegisterAction中的register方法进行处理 -->
<action name="register" class="cn.hestyle.web.action.RegisterAction" method="register">
<result name="input">/index.jsp</result>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
⑤、index.jsp
类
<%--
Created by IntelliJ IDEA.
User: hestyle
Date: 2019/10/20
Time: 2:35 下午
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/register.action" method="post">
<table border="1px">
<tr>
<td>用户名</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>生日</td>
<td><input type="text" name="birthday"></td>
</tr>
<tr>
<td>爱好</td>
<td>
<input type="checkbox" name="hobbies" value="编码">编码
<input type="checkbox" name="hobbies" value="撩妹">撩妹
<input type="checkbox" name="hobbies" value="加班">加班
</td>
</tr>
<tr>
<td>婚姻状况</td>
<td>
<input type="radio" name="married" value="true">已婚
<input type="radio" name="married" value="false" checked="checked">未婚
</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="注册"></td>
</tr>
</table>
</form>
</body>
</html>
⑥、浏览器访问
控制台输出
可以看出表单中yyyy-MM-dd
格式的字符串成功转换成Date类型,现在我们在表单中输入yyyy/MM/dd
格式的字符串看看能不能自动转换。
控制台输出
可以看出yyyy/MM/dd
格式的字符串转换Date日期型失败了。
在struts-default.xml
中有一个DateConverter
转换器
DateConverter
类是继承DefaultTypeConverter
抽象类
那么,如果我们需要自定义一个Date转换器,我们需要继承DefaultTypeConverter
抽象类。但是我们一般都通过实现它的子类StrutsTypeConverter
来定义转化器。
表单封装使用了ModelDriven<User>
接口,关于表单数据的处理请参考我的博客:
Struts2框架之Action获取请求参数的四种方式
2、编写自定义Date转换器
①、MyDateConverter.java
类
package cn.hestyle.web.converter;
import org.apache.struts2.util.StrutsTypeConverter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;
public class MyDateConverter extends StrutsTypeConverter {
//自定义一个date格式字符串
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
@Override
public Object convertFromString(Map map, String[] strings, Class toClass) {
//判断strings是否为空
if (strings == null || strings.length == 0){
return null;
}
String dateStr = strings[0];
if (toClass == java.util.Date.class){
try {
//转换成date类型
return simpleDateFormat.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
//由于convertFromString是重写,原方法没有throws,所以只能抛出运行时异常
throw new RuntimeException(e);
}
}
return null;
}
@Override
public String convertToString(Map map, Object o) {
return null;
}
}
②、配置类型转换器
# 只将user中的birthday使用用自定义的date转换器 birthday=cn.hestyle.web.converter.MyDateConverter
浏览器访问
控制台输出
浏览器访问
控制台输出
# 将所有的Date类型转换都是用自定义的date转换器
java.util.Date=cn.hestyle.web.converter.MyDateConverter
配置局部只对于配置的模型特定属性有效果(比如示例中User模型中的birthday属性),配置全局对所有模型都有效果。根据自身需求选择!