1. 概要

このシリーズの最初の記事では、フォームタグライブラリの使用法とデータをコントローラーにバインドする方法を紹介しました。

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

2. 入力タグ

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

<form:input path="name" />

Spring 3.1以降では、電子メール、日付など、他のHTML5固有のタイプを使用できます。 たとえば、メールフィールドを作成する場合は、type =’email’:を使用できます。

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

同様に日付フィールドを作成する 、type =’date’を使用できます。これにより、HTML5と互換性のある多くのブラウザーで日付ピッカーがレンダリングされます:

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

3. パスワードタグ

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

<form:password path="password" />

4. textareaタグ

このタグは、HTML textareaをレンダリングします。

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

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

5. チェックボックスおよびチェックボックスタグ

checkbox タグは、 type=’checkbox’のHTMLinputタグをレンダリングします。 Spring MVCのフォームタグライブラリは、チェックボックスタグへのさまざまなアプローチを提供します。これは、チェックボックスのすべてのニーズを満たす必要があります。

<form:checkbox path="receiveNewsletter" />

上記の例では、boolean値を持つクラシックシングルチェックボックスを生成します。 バインドされた値をtrueに設定すると、このチェックボックスはデフォルトでチェックされます。

次の例では、複数のチェックボックスを生成します。この場合、チェックボックスの値は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;

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

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

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

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

通常、バインドされたプロパティはコレクションであるため、ユーザーが選択した複数の値を保持できます。

List<String> favouriteLanguage;

6. ラジオボタンおよびラジオボタンタグ

このタグは、 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’を持つ複数のHTMLinputタグをレンダリングします。

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

この場合、配列リスト、またはアイテムで使用可能なオプションを含むマップとして使用可能なオプションを渡すことができます。 プロパティ:

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

7. selectタグ

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

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

配列リスト、またはアイテムプロパティで使用可能なオプションを含むマップで渡す値を生成します。 もう一度、コントローラー内で値を初期化できます。

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タグは単一のHTMLoption をレンダリングしますが、optionsタグはHTMLoptionタグのリストをレンダリングします。

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

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

一度に複数の項目を選択する必要がある場合は、複数のリストボックスを作成できます。このタイプのリストをレンダリングするには、 multiple =” true”属性を追加するだけです。 selectタグ。

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

ここで、バインドされたプロパティはarrayまたはjava.util.Collectionです。

List<String> fruit;

8. 非表示タグ

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

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

9. エラータグ

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

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

これにより、pathプロパティで指定されたフィールドのエラーが表示されます。 エラーメッセージは、デフォルトで span タグ内にレンダリングされ、.errorspath値にidとして追加され、オプションで 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. JSR303Bean検証

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>

SpringMVCが@Validアノテーションを介してJSR303検証をサポートするようにするには、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がフォームを操作するために提供するさまざまなタグについて説明しました。

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

上記のすべての例は、GitHubプロジェクトにあります。 これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。

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

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