Spring MVCのフォーム入門

Spring MVCでフォームを使い始める

1. 概要

この記事では、Springフォームとコントローラーへのデータバインディングについて説明します。 また、Spring MVCの主要な注釈の1つを見ていきます。 @ModelAttribute

もちろん、Spring MVCは複雑なトピックであり、Spring MVCを最大限に活用するには、理解しておく必要のあることがたくさんあるため、definitely dig deeper into the framework hereです。

参考文献:

SpringMVCのフォームタグライブラリを調べる

フォームの作成と検証に役立つ、Spring MVCが提供するさまざまなタグについての簡単なチュートリアル。

Spring MVCでのFreeMarkerの使用の概要

FreeMarkerは、Apache Software FoundationのJavaベースのテンプレートエンジンです。 このチュートリアルでは、Spring MVCで使用するためにFreeMarkerを構成する方法を説明します。

SpringでのThymeleafの使用の概要

Thymeleafは、Springとの優れた統合を備えたテンプレート言語です。 この記事では、Spring MVCアプリケーションでThymeleafを使用する方法について説明します。

2. モデル

まず、表示してフォームにバインドするa simple entityを定義しましょう。

public class Employee {
    private String name;
    private long id;
    private String contactNumber;

    // standard getters and setters
}

これがフォームバッキングオブジェクトになります。

3. 景色

次へ–the actual formと、もちろんそれを含むHTMLファイルを定義しましょう。 新しい従業員が作成/登録されるページを使用します。

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

    
    
    
        

Welcome, Enter The Employee Details

Name
Id
Contact Number

まず、フォームの定義に役立つタグライブラリ(form taglib)がJSPページに含まれていることに注意してください。

次へ–ここでは<form:form>タグが重要な役割を果たします。これは通常のHTLM<form>タグと非常に似ていますが、modelAttribute属性は、このフォームをサポートするモデルオブジェクトの名前を指定するキーです。

これは、後でコントローラーの@ModelAttributeに対応します。

次へ–各入力フィールドは、Spring Form taglibからのさらに別の便利なタグ–form: prefixを使用しています。 これらの各フィールドはa path attributeを指定します–これはモデル属性(この場合はEmployeeクラス)のゲッター/セッターに対応している必要があります。 ページがロードされると、入力フィールドにSpringが入力され、入力フィールドにバインドされた各フィールドのゲッターが呼び出されます。 フォームが送信されると、セッターが呼び出されてフォームの値がオブジェクトに保存されます。

最後に–the form is submittedの場合、コントローラーのPOSTハンドラーが呼び出され、フォームは渡されたemployee引数に自動的にバインドされます。

Basic Forms with Spring MVC

4. コントローラー

それでは、バックエンドを処理するthe Controllerを見てみましょう。

@Controller
public class EmployeeController {

    @RequestMapping(value = "/employee", method = RequestMethod.GET)
    public ModelAndView showForm() {
        return new ModelAndView("employeeHome", "employee", new Employee());
    }

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

コントローラは、フォームにデータを表示するためのGETと、フォームの送信を介した作成操作のためのPOSTの2つの簡単な操作を定義します。

また、「employee」というオブジェクトがモデルに追加されていない場合、JSPがフォームを「employee」モデル属性にバインドするように設定されるため、JSPにアクセスしようとするとSpringが文句を言うことに注意してください。

java.lang.IllegalStateException:
  Neither BindingResult nor plain target object
    for bean name 'employee' available as request attribute
  at o.s.w.s.s.BindStatus.(BindStatus.java:141)

フォームバッキングオブジェクトにアクセスするには、@ModelAttributeアノテーションを介してオブジェクトを挿入する必要があります。

メソッド引数の `+ @ ModelAttribute +`は、引数がモデルから取得されることを示します。 モデルに存在しない場合、引数は最初にインスタンス化されてからモデルに追加されます。

5. バインドエラーの処理

デフォルトでは、Spring MVCはリクエストのバインディング中にエラーが発生すると例外をスローします。 これは通常、私たちが望むものではなく、代わりに、これらのエラーをユーザーに提示する必要があります。 コントローラメソッドに引数としてBindingResultを追加して、BindingResultを使用します。

public String submit(
  @Valid @ModelAttribute("employee") Employee employee,
  BindingResult result,
  ModelMap model)

BindingResult引数は、フォームバッキングオブジェクトの直後に配置する必要があります。これは、メソッド引数の順序が重要になるまれなケースの1つです。 そうしないと、次の例外が発生します。

java.lang.IllegalStateException:
  Errors/BindingResult argument declared without preceding model attribute.
    Check your handler method signature!

現在–例外はスローされなくなりました。代わりに、エラー[.brush:.java; .gutter:.true]#は、submitメソッドに渡されるBindingResultに登録されます。 この時点で、これらのエラーをさまざまな方法で処理できます。たとえば、操作をキャンセルできます。#

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

    //Do Something
    return "employeeView";
}

結果にエラーが含まれている場合、これらのエラーを正しく表示するために、ユーザーに別のビューを返すことに注意してください。 そのビューを見てみましょう–error.jsp:


    
    

    
        

Please enter the correct details

Retry

6. 従業員の表示

最後に、新しい従業員を作成するだけでなく、単に1人を表示することもできます。そのためのクイックビューコードは次のとおりです。


    

Submitted Employee Information

Name : ${name}
ID : ${id}
Contact Number : ${contactNumber}

JSPページはEL式を使用して、モデル内のEmployeeオブジェクトのプロパティの値を表示するだけです。

7. アプリケーションのテスト

単純なアプリケーションは、たとえばTomcatサーバーにデプロイでき、ローカルにアクセスできます。

これは、送信操作の前のメインフォームを含むビューです。

Spring MVC Form example - Submit

Spring MVCフォームの例–送信

送信後、データが表示されます。

Spring MVC Form example - View

Spring MVCフォームの例–ビュー

そしてそれだけです–a working example of a simple form with Spring MVC, with validation

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

最後に、記事の冒頭で述べたように、definitely dig deeper into Spring MVCにする必要があります。