Struts2框架之自定义参数类型转换

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_41855420/article/details/102658340

在前端提交的表单中有时会遇到需要手动转换的参数类型,比如日期格式,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日期型失败了。

\color{red}⑦、默认日期转换器原理分析

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;
    }
}
②、配置类型转换器

a \color{red}a、配置局部

在这里插入图片描述# 只将user中的birthday使用用自定义的date转换器 birthday=cn.hestyle.web.converter.MyDateConverter
浏览器访问
在这里插入图片描述控制台输出
在这里插入图片描述

b \color{red}b、配置全局

在这里插入图片描述浏览器访问
在这里插入图片描述控制台输出
在这里插入图片描述

# 将所有的Date类型转换都是用自定义的date转换器
java.util.Date=cn.hestyle.web.converter.MyDateConverter

\color{red}注意:

配置局部只对于配置的模型特定属性有效果(比如示例中User模型中的birthday属性),配置全局对所有模型都有效果。根据自身需求选择!

s t r u t s 2 \color{red}配置文件的名称不要修改,struts2就是这么规定的!!!

\color{red}别自己修改错了在评论区说教程垃圾。。。(经常有小白这么怼)

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/102658340