Spring MVCでフォームを使い始める
1. 概要
この記事では、Springフォームとコントローラーへのデータバインディングについて説明します。 また、Spring MVCの主要な注釈の1つを見ていきます。 @ModelAttribute。
もちろん、Spring MVCは複雑なトピックであり、Spring MVCを最大限に活用するには、理解しておく必要のあることがたくさんあるため、definitely dig deeper into the framework hereです。
参考文献:
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引数に自動的にバインドされます。
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フォームの例–送信
送信後、データが表示されます。
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にする必要があります。