Spring MVC学習の概要(6):カスタム型変換

       フォームで送信されるデータ型はすべて文字列型です。バックグラウンドでリクエストを受信した後、Springフレームワーク内のHandlerAdapterはデフォルトでデータ型変換を実行します。ただし、ユーザーフォームにユーザーの誕生日など、基本的でないデータ型が含まれている場合、HandlerAdapterは文字列型を日付型に自動的に変換できません。現時点では、SpringMVCを支援するConverterインターフェイスを実装する必要があります。データ型の変換を完了します。カスタム型コンバーターを使用しない場合の影響を最初に確認します。実装手順は次のとおりです。

(1)エンティティクラスを作成します

public class User {
    private String name;
    private String password;
    private Integer age;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", birthday=" + birthday +
                '}';
    }
}

(2)index.jspにユーザーフォームを追加します。


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form method="post" action="${pageContext.request.contextPath}/user/login">
    姓名:<input type="text" name="name"><br>
    密码:<input type="text" name="password"><br>
    年龄:<input type="text" name="age"><br>
    生日:<input type="text" name="birthday"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

(3)UserControllerクラスを作成します

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/login")
    public String login(User user){
        System.out.println(user);
        return "success";
    }
}

(4)Success.jspページ

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>SUCCESS</h3>
</body>
</html>

プロジェクトを開始し、ページに情報を入力して[送信]をクリックします。この時点で、ページに入力されている誕生日の形式は1997/12/12です。

ただし、1997-10-10と入力すると、次のようにデータが正しくカプセル化されません。

 

Spring MVCは、あるデータ型を別のデータ型に変換できるインターフェースであるConverter <S、T>を提供します。ここで、Sはソース型を表し、Tはターゲット型を表します。実現プロセスは次のとおりです。

(1)インターフェースを実装するためのカスタムタイプコンバーター

public class MyDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String s) {
        if(s == null){
            throw new RuntimeException("日期数据为空");
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        try{
            return df.parse(s);
        }catch (Exception e){
            throw new RuntimeException("日期数据转换失败");
        }
    }
}

(2)springmvc.xmlに構成を追加します

<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"></mvc:annotation-driven>
    <!--  注册自定义类型转换器  -->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.yht.example1.utils.MyDateConverter"></bean>
            </set>
        </property>
    </bean>

このとき、ページに1997-12-12と入力すると、次のように操作が成功します。

1997/12/12と1997-12-12の2つの形式があることに注意してください。前述のように、Spring MVCフレームワークは1997/12/12をpojoオブジェクトの日付型に自動的にマップできますが、1997-12-12をマップできないため、カスタム型コンバーターを使用して1997-12-12形式を処理します。入力データですが、カスタム型コンバーターが機能する場合、元の1997/12/12形式の日付を正常にマップできません。ConversionServiceFactoryBeanのソースコードを簡単に確認したところ、次のように、問題がsetメソッドにあることがわかりました。

 個人的には、コンバーター属性は構成ファイルのプロパティを介して割り当てられ、元のSpringMVCでデフォルトで実行されていた型変換操作は上書きされると思います。私が使用しているSpringMVCのjarパッケージはすべてバージョン4.2.3です。このクラスの実装が下位バージョンで異なるかどうかは、今後さらに調査する必要があります。

現在、たくさんのブログをチェックしていて、この2つのフォーマットを同時に使用できる解決策は見つかりませんでした。小さなパートナーが見つけたら、コメントして一緒に進歩することができます。

日付のフォーマットに関しては、Spring MVCに@DateTimeFormat(pattern = "yyyy-MM-dd")アノテーションがあります。このアノテーションをUserクラスの誕生日属性に追加するだけで済みます。パターンがyyyy-MM-ddの場合1997-12-12形式をサポートします。パターンがyyyy / MM / ddの場合、1997/12/12がサポートされます。

 

おすすめ

転載: blog.csdn.net/weixin_47382783/article/details/113574318