SpringMVCのフォームタグライブラリの調査

1概要

この連載の/spring-mvc-form-tutorial[最初の記事]のリンクでは、formタグ・ライブラリーの使用方法とデータをコントローラーにバインドする方法を紹介しました。

この記事では、Spring MVCがフォームの作成と検証に役立つように提供するさまざまなタグについて説明します。

2 入力 タグ

input タグから始めましょう。このタグは、バインドされた値とデフォルトで type = 'text’を使用してHTMLの input__タグをレンダリングします。

<form:input path="name"/>

Spring 3.1以降では、email、dateなど、他のHTML 5特有の型を使うことができます。

<form:input type="email" path="email"/>
<form:input type="date" path="dateOfBirth"/>

3 password タグ

このタグは、バインドされた値を使用して type = 'password’のHTML input__タグをレンダリングします。このHTML入力は、フィールドに入力された値をマスクします。

<form:password path="password"/>

4 textarea タグ

このタグはHTMLの テキストエリア をレンダリングします。

<form:textarea path="notes" rows="3" cols="20"/>

HTMLの textarea と同じ方法で、 rows columns の数を指定できます。

5 checkbox および checkboxes タグ

checkbox タグは、 type = 'チェックボックス’を持つHTMLの input__タグをレンダリングします。

Spring MVCのフォームタグライブラリは checkbox タグへのさまざまなアプローチを提供します。

<form:checkbox path="receiveNewsletter"/>

上記の例は、 boolean 値を持つ古典的な単一の checkbox を生成します。バウンド値を true に設定した場合、このチェックボックスはデフォルトでチェックされます。

次の例では、複数のチェックボックスを生成します。 この場合、 checkbox の値はJSPページ内にハードコードされています。

Bird watching: <form:checkbox path="hobbies" value="Bird watching"/>
Astronomy: <form:checkbox path="hobbies" value="Astronomy"/>
Snowboarding: <form:checkbox path="hobbies" value="Snowboarding"/>

ここで、バウンド値は array 型または java.util.Collection 型です。

String[]hobbies;

checkboxes タグの目的は、チェックボックス値が実行時に生成される複数のチェックボックスをレンダリングするために使用されます。

<form:checkboxes items="${favouriteLanguageItem}" path="favouriteLanguage"/>

items プロパティで利用可能なオプションを含む Array List 、または Map に渡す値を生成するために。コントローラ内部で値を初期化できます。

List<String> favouriteLanguageItem = new ArrayList<String>();
favouriteLanguageItem.add("Java");
favouriteLanguageItem.add("C++");
favouriteLanguageItem.add("Perl");

通常、boundプロパティはコレクションなので、ユーザーが選択した複数の値を保持できます。

List<String> favouriteLanguage;

6. radiobutton および radiobuttons タグ

このタグは、 type = 'radio’のHTML input__タグをレンダリングします。

Male: <form:radiobutton path="sex" value="M"/>
Female: <form:radiobutton path="sex" value="F"/>

典型的な使用パターンは同じプロパティにバインドされた異なる値を持つ複数のタグインスタンスを含みます。

private String sex;

checkboxes タグと同じように、 radiobuttons タグは type = 'radio' を持つ複数のHTML input タグをレンダリングします。

<form:radiobuttons items="${jobItem}" path="job"/>

この場合、 items プロパティで利用可能なオプションを含む Array List 、または Map として利用可能なオプションを渡すことができます。

List<String> jobItem = new ArrayList<String>();
jobItem.add("Full time");
jobItem.add("Part time");

7. select タグ

このタグはHTMLの select 要素をレンダリングします。

<form:select path="country" items="${countryItems}"/>

items プロパティで利用可能なオプションを含む Array List 、または Map に渡す値を生成するために。コントローラ内で値を初期化できます。

Map<String, String> countryItems = new LinkedHashMap<String, String>();
countryItems.put("US", "United States");
countryItems.put("IT", "Italy");
countryItems.put("UK", "United Kingdom");
countryItems.put("FR", "France");

selectタグはネストされた option options タグの使用もサポートします。

option タグは単一のHTML option をレンダリングしますが、 options タグはHTMLの option タグのリストをレンダリングします。

options タグは、 select タグと同様に、 items プロパティで使用可能なオプションを含む Array List 、または Map を取ります。

<form:select path="book">
    <form:option value="-" label="--Please Select--"/>
    <form:options items="${books}"/>
</form:select>

このタイプのリストをレンダリングするには、 select タグに multiple =” true” 属性を追加するだけです。

<form:select path="fruit" items="${fruit}" multiple="true"/>

ここで、boundプロパティは array または java.util.Collection です。

List<String> fruit;

8 hidden ​​タグ

このタグは、バインドされた値を使用して type = 'hidden’のHTML input__タグをレンダリングします。

<form:hidden path="id" value="12345"/>

9 errors タグ

フィールドエラーメッセージは、コントローラに関連付けられているバリデータによって生成されます。これらのフィールドエラーメッセージを表示するために errors タグを使うことができます。

<form:errors path="name" cssClass="error"/>

これにより、 path プロパティで指定されたフィールドのエラーが表示されます。

エラーメッセージは、デフォルトで span タグ内にレンダリングされ、 id として path 値に .errors が追加され、オプションで cssClass プロパティのCSSクラスが出力のスタイル設定に使用されます。

<span id="name.errors" class="error">Name is required!</span>

エラーメッセージをデフォルトの span タグではなく別の要素で囲むには、 element 属性内に任意の要素を指定します。

<form:errors path="name" cssClass="error" element="div"/>

これはエラーメッセージを div 要素内にレンダリングします。

<div id="name.errors" class="error">Name is required!</div>

私は、私たちは与えられたページのために(フィールドに関係なく)エラーの全リストを表示することができます。これは、ワイルドカード ** を使用することによって実現されます。

<form:errors path="** "/>

9.1. バリデータ

特定のフィールドのエラーを表示するには、バリデータを定義する必要があります。

public class PersonValidator implements Validator {

    @Override
    public boolean supports(Class clazz) {
        return Person.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required.name");
    }
}

この場合、フィールド name が空の場合、バリデータはリソースバンドルから required.name で識別されるエラーメッセージを返します。

リソースバンドルはSpring XML 設定ファイルで次のように定義されています。

<bean class="org.springframework.context.support.ResourceBundleMessageSource" id="messageSource">
     <property name="basename" value="messages"/>
</bean>

純粋なJava設定スタイルでは:

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasenames("messages");
    return messageSource;
}

エラーメッセージは messages.properties ファイル内で定義されています。

required.name = Name is required!

この検証を適用するには、コントローラにバリデータへの参照を含め、ユーザがフォームを送信したときに呼び出されるコントローラメソッドでメソッド validate を呼び出す必要があります。

@RequestMapping(value = "/addPerson", method = RequestMethod.POST)
public String submit(
  @ModelAttribute("person") Person person,
  BindingResult result,
  ModelMap modelMap) {

    validator.validate(person, result);

    if (result.hasErrors()) {
        return "personForm";
    }

    modelMap.addAttribute("person", person);
    return "personView";
}

9.2. JSR 303 Beanの検証

Spring 3からは、Beanの検証に JSR 303 @ Valid アノテーション経由)を使用できます。これを行うには、クラスパスに JSR303バリデータフレームワーク が必要です。私たちは Hibernate Validator (リファレンス実装)を使います。以下は、POMに含める必要がある依存関係です。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.1.1.Final</version>
</dependency>

Spring MVCが @ Valid アノテーションを介してJSR 303検証をサポートするようにするには、Spring設定ファイルで以下を有効にする必要があります。

<mvc:annotation-driven/>

あるいは、Java設定で対応するアノテーション @ EnableWebMvc を使用します。

@EnableWebMvc
@Configuration
public class ClientWebConfigJava implements WebMvcConfigurer {
   //All web configuration will go here
}

次に、コントローラメソッドに @ Valid アノテーションを付ける必要があります。

@RequestMapping(value = "/addPerson", method = RequestMethod.POST)
public String submit(
  @Valid @ModelAttribute("person") Person person,
  BindingResult result,
  ModelMap modelMap) {

    if(result.hasErrors()) {
        return "personForm";
    }

    modelMap.addAttribute("person", person);
    return "personView";
}

これで、エンティティのプロパティにHibernateバリデータアノテーションで検証するためのアノテーションを付けることができます。

@NotEmpty
private String password;

デフォルトでは、パスワード入力フィールドを空白のままにしておくと、このアノテーションには「空白ではない可能性があります」と表示されます。

バリデータの例で定義されているリソースバンドルにプロパティを作成することで、デフォルトのエラーメッセージを上書きできます。メッセージのキーは、 AnnotationName.entity.fieldname の規則に従います。

NotEmpty.person.password = Password is required!

10結論

このチュートリアルでは、Springがフォームを操作するために提供するさまざまなタグを調べました。

検証エラーを表示するためのタグと、カスタムエラーメッセージを表示するために必要な設定も確認しました。

上記の例はすべてhttps://github.com/eugenp/tutorials/tree/master/spring-mvc-xml[GitHubプロジェクト]にあります。これはEclipseベースのプロジェクトなので、そのままインポートして実行するのは簡単なはずです。

プロジェクトがローカルで実行されている場合は、フォームの例にアクセスできます。