Spring MVCと@ModelAttributeアノテーション

Spring MVCと@ModelAttributeアノテーション

1. 概要

最も重要なSpring-MVCアノテーションの1つは、@ModelAttributeアノテーションです。

@ModelAttributeは、メソッドパラメーターまたはメソッド戻り値を名前付きモデル属性にバインドし、それをWebビューに公開するアノテーションです。

次の例では、一般的な概念である会社の従業員から送信されたフォームを通じて、注釈の使いやすさと機能性を示します。

参考文献:

Spring MVCのモデル、ModelMap、およびモデルビュー

Spring MVCによって提供されるインターフェースModel,ModelMapおよびModelViewについて学習します。

Spring @RequestParamアノテーション

Springの@RequestParamアノテーションの詳細ガイド

2. 深さの@ModelAttribute

導入段落で明らかにしたように、@ModelAttributeはメソッドパラメータとして、またはメソッドレベルで使用できます。

2.1 At the Method Level

アノテーションがメソッドレベルで使用される場合、そのメソッドの目的が1つ以上のモデル属性を追加することであることを示します。 このようなメソッドは、@RequestMappingメソッドと同じ引数タイプをサポートしますが、リクエストに直接マップすることはできません。

これがどのように機能するかを理解するために、ここで簡単な例を見てみましょう。

@ModelAttribute
public void addAttributes(Model model) {
    model.addAttribute("msg", "Welcome to the Netherlands!");
}

この例では、コントローラークラスで定義されているすべてのmodelsにmsgという名前の属性を追加するメソッドを示しています。

もちろん、これは記事の後半で実際に動作することを確認します。

一般に、Spring-MVCは、リクエストハンドラーメソッドを呼び出す前に、常にそのメソッドを最初に呼び出します。 That is, @ModelAttribute methods are invoked before the controller methods annotated with @RequestMapping are invoked.シーケンスの背後にあるロジックは、コントローラーメソッド内で処理を開始する前にモデルオブジェクトを作成する必要があるということです。

それぞれのクラスに@ControllerAdviceとして注釈を付けることも重要です。 したがって、グローバルとして識別されるModelに値を追加できます。 これは、実際には、すべての要求に対して、応答部分のすべてのメソッドに対してデフォルト値が存在することを意味します。

2.2 As a Method Argument

メソッドの引数として使用される場合、モデルから引数を取得する必要があることを示します。 存在しない場合は、最初にインスタンス化してからモデルに追加し、モデルに存在したら、名前が一致するすべてのリクエストパラメータから引数フィールドに入力する必要があります。

次のコードスニペットでは、employeeモデル属性に、addEmployeeエンドポイントに送信されたフォームからのデータが入力されます。 Spring MVCは、submitメソッドを呼び出す前に、バックグラウンドでこれを実行します。

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
public String submit(@ModelAttribute("employee") Employee employee) {
    // Code that uses the employee object

    return "employeeView";
}

この記事の後半で、employeeオブジェクトを使用してemployeeViewテンプレートにデータを入力する方法の完全な例を示します。

そのため、フォームデータをBeanにバインドします。 The controller annotated with @RequestMapping can have custom class argument(s) annotated with @ModelAttribute.

これは、Spring-MVCで一般的にデータバインディングとして知られているもので、各フォームフィールドを個別に解析する必要がない一般的なメカニズムです。

3. フォームの例

このセクションでは、概要セクションで参照されている例を示します。これは、ユーザー(特定の例では会社の従業員)に個人情報(具体的にはnameと%()を入力するように求める非常に基本的なフォームです。 t1)s送信が完了し、エラーが発生しなかった後、ユーザーは以前に送信されたデータが別の画面に表示されることを期待します。

3.1 The View

まず、idフィールドとnameフィールドを使用して簡単なフォームを作成しましょう。


    Name
    

    Id
    

    

3.2 The Controller

上記のビューのロジックが実装されているコントローラークラスは次のとおりです。

@Controller
@ControllerAdvice
public class EmployeeController {

    private Map employeeMap = new HashMap<>();

    @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
    public String submit(
      @ModelAttribute("employee") Employee employee,
      BindingResult result, ModelMap model) {
        if (result.hasErrors()) {
            return "error";
        }
        model.addAttribute("name", employee.getName());
        model.addAttribute("id", employee.getId());

        employeeMap.put(employee.getId(), employee);

        return "employeeView";
    }

    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("msg", "Welcome to the Netherlands!");
    }
}

submit()メソッドには、ViewにバインドされたEmployeeオブジェクトがあります。 このアノテーションの威力を見ることができますか? フォームフィールドをオブジェクトモデルに簡単にマッピングできます。 このメソッドでは、フォームから値をフェッチし、それらをModelMapに設定しています。

最後に、employeeViewを返します。これは、それぞれのJSPファイルがViewの代表として呼び出されることを意味します。

さらに、addAttributes()メソッドもあります。 その目的は、グローバルに識別されるModelに値を追加することです。 つまり、すべてのコントローラーメソッドへのすべての要求に対する応答としてデフォルト値が返されます。 また、特定のクラスに@ControllerAdviceとして注釈を付ける必要があります。

3.3 The Model

前述のように、Modelオブジェクトは非常に単純であり、「フロントエンド」属性に必要なすべてのものが含まれています。 それでは、例を見てみましょう。

@XmlRootElement
public class Employee {

    private long id;
    private String name;

    public Employee(long id, String name) {
        this.id = id;
        this.name = name;
    }

    // standard getters and setters removed
}

3.4 Wrap Up

@ControllerAdviceは、コントローラー、特にすべての@RequestMappingメソッドに適用される@ModelAttributeメソッドを支援します。 もちろん、残りの@RequestMappingメソッドの前に、addAttributes()メソッドが最初に実行されます。

このことを念頭に置いて、submit()addAttributes()の両方を実行した後、Controllerクラスから返されたViewで、名前を指定することでそれらを参照できます。たとえば${name}のように、ドル化された中括弧デュオの内部。

3.5 Results View

フォームから受け取ったものを印刷してみましょう。

${msg}

Name : ${name} ID : ${id}

4. 結論

このチュートリアルでは、メソッド引数とメソッドレベルの使用例の両方について、@ModelAttributeアノテーションの使用法を調査しました.

この簡単なチュートリアルの実装は、githubプロジェクトにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。