Struts2学习笔记(八):自定义类型转换器,将表单提交的字符串类型的日期数据转换成 Date 类型

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).

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值