Spring MVC: データバインディング

ここに画像の説明を挿入します

データバインディング

データ バインディングとは、Web ページ上の要求および応答データと、コントローラー内の対応する処理メソッドとの間のオブジェクト バインディング (つまり、ユーザーが送信したフォーム データを Java オブジェクトにバインドする) を指します。

ここに画像の説明を挿入します

プロセスは次のとおりです。

  1. ServletRequest オブジェクトは WebDataBinderFactory オブジェクトに渡されます。
  2. 同時に、対象メソッドの入力パラメータ オブジェクトも WebDataBinderFactory オブジェクトに渡されます。WebDataBinderFactory オブジェクトは、渡されたパラメーターに基づいて DataBinder オブジェクトを作成します。
  3. DataBinder オブジェクトは、ConversionService コンポーネントを呼び出してデータ型の変換または書式設定を実行し、サーブレットのリクエスト情報を、コントローラーの対応する処理メソッドの入力パラメーター オブジェクトに入力します。
  4. 次に、DataBinder オブジェクトは Validator コンポーネントを呼び出して、バインドされたリクエスト情報の入力パラメーター オブジェクトのデータの有効性を確認し、データ バインディング結果 BindingResult オブジェクトを生成します。
  5. 検証結果は BindingResult オブジェクトに保存され、DataBinder オブジェクトは処理メソッドの対応する入力パラメータに検証結果を割り当てることができます。

データ型変換

要求データと応答データはデータ型の変換が必要です。Spring MVC の ConversionService コンポーネントには、Java 型変換作業のほとんどを完了できる Spring MVC の組み込みコンバータが多数含まれています。もちろん、カスタム コンバータを作成し、ConversionServiceFactoryBean を使用して Spring IoC コンテナ内で ConversionService を定義することもできます。Spring はカスタム ConversionService を自動的に認識し、カスタム コンバータを自動的に呼び出して、Bean プロパティ設定および Spring MVC 処理メソッドの入力パラメータ バインディング データのデータ型変換を実行します。

データのフォーマット

通常、データ形式は文字列型を日付型に変換するために使用されます。

簡単な例:
前章の Spring + Spring MVC + JDBCTemplate の統合事例をもとに、オブジェクトの date 属性を追加し、追加した関数を実装する

1. @DateTimeFormat(pattern = “yyyy-MM-dd”) アノテーションを使用して文字列型を日付型に変換し、
ここに画像の説明を挿入します
図に示すようにメソッド実装クラスを追加します。
ここに画像の説明を挿入します

RESTful スタイルを使用してコントローラー層にユーザー情報を追加します

package cn.edu.springmvcdemo.controller;

import cn.edu.springmvcdemo.model.User;
import cn.edu.springmvcdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.List;

@Controller
public class UserController {
    
    
    @Autowired
    private UserService userService;

    @RequestMapping(value = "/users",method = RequestMethod.GET)
    public String getSelectAll(Model model){
    
    
        //查看
        List<User> users = userService.selectAll();
        model.addAttribute("users",users);

        //新增
        model.addAttribute("user",new User());
        return "user";
    }

    @RequestMapping(value = "/user",method = RequestMethod.POST)
    public String addUser(User user){
    
    
        userService.add(user);
        return "redirect:/users";
    }
}

user.jspに次の内容を追加します。

<br><br><br>
<form:form action="${pageContext.request.contextPath}/user" method="post" modelAttribute="user">
    用户姓名:<form:input path="name" /> <br>
    用户年龄:<form:input path="age" /> <br>
    用户班级:<form:input path="grade" /> <br>
    入学日期:<form:input path="date" /> <br>
    <input type="submit" value="添加">
</form:form>

また、中国語の文字化けを防ぐために、web.xml設定ファイルに以下の設定を追加する必要があります。

<!-- 防止出现中文乱码配置 -->
<filter>
  <filter-name>encoding</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>encoding</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

また、日付データはフロントエンドからバックエンドに渡す際には正常に取得できますが、バックエンドがデータベースに挿入する際には1日の差が生じます。jdbc.properties 構成ファイルで、serverTimezone=UTC を serverTimezone=Asia/Shanghai に変更します。 注
ここに画像の説明を挿入します
: UTC は世界統一時刻であり、北京時間より 8 時間早いです。

結果は以下のようになります。
ここに画像の説明を挿入します

2. @InitBinder アノテーションを付けた汎用データ書式設定クラスを作成し、日付書式設定が必要なコントローラー クラスがそれを継承できるようにします。

package cn.edu.springmvcdemo.controller;

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;

import java.text.SimpleDateFormat;
import java.util.Date;

//设置数据格式化通用类
public class CurrencyController {
    
    
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder){
    
    
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        //设定为合法的日期格式
        simpleDateFormat.setLenient(false);
        //注册到编辑器中
        webDataBinder.registerCustomEditor(Date.class,new CustomDateEditor(simpleDateFormat,false));
    }
}

その他は変更されず、コントローラー クラスは一般的なデータ形式クラスとアノテーション@DateTimeFormat(pattern = “yyyy-MM-dd”) アノテーションを継承します。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

結果は以下のようになります。
ここに画像の説明を挿入します

データ検証

データ検証は、データの整合性を保証するために実行される検証操作です。以下は、検証に JSR-303 を使用する方法の簡単な紹介です。

JSR-303 (Java Specific Requests、Java 仕様提案) は、 Java 標準検証フレームワークです。JSR-303 の検証はアノテーションに基づいており、検証が必要なエンティティ クラスの属性または get() メソッドの後でアノテーション タグが自動的に検証されます。

よく使用される検証アノテーション

注釈 説明する
@ヌル 空の小切手。オブジェクトが NULL であることを確認する
@NotNull 空の小切手。オブジェクトが NULL ではないことを確認します。長さ 0 の文字列をチェックできません。
@NotBlank 空の小切手。制約文字列がNULLかどうか、および削除前後のスペースの長さが0より大きいかどうかを確認します。
@空ではない 空の小切手。制約要素が NULL または EMPTY であるかどうかを確認する
@過去 日付チェック。Date オブジェクトと Calendar オブジェクトが現在時刻より前であるかどうかを確認します (経過した時刻は過去である必要があります)。
@未来 日付チェック。Date オブジェクトと Calendar オブジェクトが現在時刻より後であるかどうかを確認します (経過した時刻は未来である必要があります)。
@DecimalMax 数値チェック。検証に合格する値は、制約で指定された最大値を超えることはなく、小数点の精度があります。
@DecimalMin 数値チェック。検証に合格する値は、制約で指定された最小値以上であり、小数点以下の精度があります。
@Eメール 数値チェック。電子メール アドレスであるかどうかを確認します。NULL の場合は検証なしで通過できます。

簡単な例:
上で追加したユーザー ケースに基づいてデータ検証を実行する

まず、pom.xml に次の依存関係を追加します。

<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
  <groupId>org.hibernate.validator</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>6.2.5.Final</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator-annotation-processor -->
<dependency>
  <groupId>org.hibernate.validator</groupId>
  <artifactId>hibernate-validator-annotation-processor</artifactId>
  <version>6.2.5.Final</version>
</dependency>

次に、エンティティクラスの属性に検証アノテーションを追加します。
ここに画像の説明を挿入します

そして、コントローラークラスのユーザーメソッドにパラメータを追加する前に @Valid アノテーションを使用し、BindingResult オブジェクトを使用して検証結果を取得します。

@RequestMapping(value = "/user",method = RequestMethod.POST)
//注:这两个参数必须紧靠着(即当有第三个参数时,第三个参数不能放在这两个参数的中间)
public String addUser(@Valid User user, BindingResult bindingResult,Model model){
    
    
    //当不符合数据校验时,结果存放在 bindingResult 中
    if(bindingResult.getErrorCount() > 0){
    
    
        //遍历获取
        for (FieldError fieldError:bindingResult.getFieldErrors()){
    
    
            System.out.println("校验结果 == " + fieldError.getField() + ":" + fieldError.getDefaultMessage());
        }
        //添加数据不符,不作添加并返回
        //查看
        List<User> users = userService.selectAll();
        model.addAttribute("users",users);
        return "user";
    }

    userService.add(user);
    return "redirect:/users";
}

次に、user.jsp の <form:errors> タグを使用して、検証結果をエコーし​​ます

<form:form action="${pageContext.request.contextPath}/user" method="post" modelAttribute="user">
    用户姓名:<form:input path="name" /> <form:errors path="name" /> <br>
    用户年龄:<form:input path="age" /> <form:errors path="age" /> <br>
    用户班级:<form:input path="grade" /> <form:errors path="grade" /> <br>
    入学日期:<form:input path="date" /> <form:errors path="date" /> <br>
    <input type="submit" value="添加">
</form:form>

最終的に、テスト結果は
次のようになります。
ここに画像の説明を挿入します

ここに画像の説明を挿入します

通常、デフォルトの検証結果はエコーに使用できます。もちろん、エコー情報をカスタマイズすることもできます。

1. 検証アノテーションで message 属性を使用するだけですが、英語の結果をエコーするようにカスタマイズすることはできません。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

2. 国際化設定ファイルを使用してカスタム エコー情報を設定します。「Spring
MVC: ビューとビュー パーサー」の記事で国際化リソース ファイルを設定する場合に基づいて、i18n.properties 設定ファイルの下に次の内容を追加します。
.name + エンティティクラス名の先頭文字小文字 + 属性名、データ型変換エラーメッセージが typeMismatch の場合 + エンティティクラス名の先頭文字小文字 + 属性名

NotEmpty.user.grade=国际化资源文件配置结果:该信息不能为空
typeMismatch.user.date=国际化资源文件配置结果:该信息不能为空

結果は以下のようになります。
ここに画像の説明を挿入します

添付

Spring MVC では、Java オブジェクトをリクエスト パラメーターとして直接使用し、コントローラー層でコンテンツを返すために、 @RequestBody および @ResponseBody アノテーションがコントローラー層でよく使用されます。以下は JSON データを返す実装です。

簡単な例:
まず、pom.xml に次の依存関係を追加します。

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.12.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.12.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.12.0</version>
</dependency>

次に、コントローラークラスに以下のメソッドを追加します。

@RequestMapping(value = "jsonViewTest")
public String jsonViewTest(){
    
    
    return "json";
}

@ResponseBody
@RequestMapping(value = "jsonTest",method = RequestMethod.GET)
public List<User> jsonTest(){
    
    
    List<User> users = userService.selectAll();
    System.out.println(users);
    return users;
}

次に、json.jspを作成します。同時に、 jquery-2.1.2.js ファイルを src\main\webapp\resources\js\jquery ディレクトリにインポートします (クリックしてダウンロードして入手します)。

<%--
  Created by IntelliJ IDEA.
  User: dell
  Date: 2023/8/8
  Time: 15:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <script type="text/javascript" src="${pageContext.request.contextPath}/resources/js/jquery/jquery-2.1.2.js" />
    <script type="text/javascript">
        $(function () {
      
      
            $("#jsonid").click(function(){
      
      
                var href = this.href;
                var args = {
      
      };
                $.post(href,args,function (data) {
      
      
                    alert(data);
                })
                return false;
        })
    </script>
</head>
<body>
    <a id="jsonid" href="${pageContext.request.contextPath}/jsonTest" >
        获取 json 数据格式的所有用户信息
    </a>
</body>
</html>

最後に、テスト結果
1. クリックして
ここに画像の説明を挿入します
2 を取得します。結果は以下のとおりです。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/qq_56886142/article/details/132094309