1. 概要

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

もちろん、Spring MVCは複雑なトピックであり、Spring MVCを最大限に活用するには理解する必要のあることがたくさんあるため、ここでフレームワークを深く掘り下げてください

2. モデル

最初に–表示してフォームにバインドする単純なエンティティを定義しましょう。

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

    // standard getters and setters
}

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

3. 景色

次に、実際のフォームと、もちろんそれを含むHTMLファイルを定義しましょう。 新しい従業員が作成/登録されるページを使用します。

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
    <head>
    </head>
    <body>
        <h3>Welcome, Enter The Employee Details</h3>
        <form:form method="POST" 
          action="/spring-mvc-xml/addEmployee" modelAttribute="employee">
             <table>
                <tr>
                    <td><form:label path="name">Name</form:label></td>
                    <td><form:input path="name"/></td>
                </tr>
                <tr>
                    <td><form:label path="id">Id</form:label></td>
                    <td><form:input path="id"/></td>
                </tr>
                <tr>
                    <td><form:label path="contactNumber">
                      Contact Number</form:label></td>
                    <td><form:input path="contactNumber"/></td>
                </tr>
                <tr>
                    <td><input type="submit" value="Submit"/></td>
                </tr>
            </table>
        </form:form>
    </body>
</html>

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

次へ– ここではタグが重要な役割を果たします。 通常のHTLMと非常によく似ています

タグが modelAttribute 属性は、このフォームをサポートするモデルオブジェクトの名前を指定するキーです。

<form:form method="POST" 
  action="/SpringMVCFormExample/addEmployee" modelAttribute="employee">

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

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

最後に– フォームが送信されると、コントローラーのPOSTハンドラーが呼び出され、フォームは渡されたemployee引数に自動的にバインドされます。

4. コントローラー

それでは、バックエンドを処理するコントローラーを見てみましょう。

@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.<init>(BindStatus.java:141)

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

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

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

デフォルトでは、リクエストのバインド中にエラーが発生すると、SpringMVCは例外をスローします。 これは通常、私たちが望むものではなく、代わりに、これらのエラーをユーザーに提示する必要があります。 コントローラメソッドに引数として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!

現在–例外はスローされなくなりました。 代わりに、エラー 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:

<html>
    <head>
    </head>

    <body>
        <h3>Please enter the correct details</h3>
        <table>
            <tr>
                <td><a href="employee">Retry</a></td>
            </tr>
        </table>
    </body>

</html>

6. 従業員の表示

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

<body>
    <h2>Submitted Employee Information</h2>
    <table>
        <tr>
            <td>Name :</td>
            <td>${name}</td>
        </tr>
        <tr>
            <td>ID :</td>
            <td>${id}</td>
        </tr>
        <tr>
            <td>Contact Number :</td>
            <td>${contactNumber}</td>
        </tr>
    </table>
</body>

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

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

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

http:// localhost:8080 / spring-mvc-xml / employee

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

Spring MVCフォームの例–送信

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

Spring MVCフォームの例–表示

以上です– 検証を使用した、SpringMVCを使用した単純なフォームの実例。

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

最後に、記事の冒頭で述べたように、は間違いなくSpringMVCを深く掘り下げる必要があります。