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

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

1. 概要

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

この記事では、Spring MVCがcreate and validate formsを支援するために提供するさまざまなタグについて説明します。

2. inputタグ

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

Spring 3.1以降では、電子メール、日付など、他のHTML5固有のタイプを使用できます。 [.hps]#For exampleif we wanted tocreate an emailfieldwe can type='email':#を使用します

[.hps]#Similarlyto createa date field, [#result_box]#we can use type='date', which will render a date picker in many browsers compatible with HTML5: ##

3. passwordタグ

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

4. textareaタグ

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

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

5. checkboxおよびcheckboxesタグ

checkboxタグは、type='checkbox'を使用してHTMLinputタグをレンダリングします。 Spring MVCのフォームタグライブラリは、checkboxのすべてのニーズを満たす必要があるcheckboxタグへのさまざまなアプローチを提供します。

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

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

Bird watching: 
Astronomy: 
Snowboarding: 

ここで、バインドされた値はタイプarrayまたはjava.util.Collectionです。

String[] hobbies;

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

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

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

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

List favouriteLanguage;

6. radiobuttonおよびradiobuttonsタグ

このタグは、type='radio':でHTMLinputタグをレンダリングします

Male: 
Female: 

一般的な使用パターンには、同じプロパティに異なる値がバインドされた複数のタグインスタンスが含まれます。

private String sex;

checkboxesタグと同様に、radiobuttonsタグは複数のHTMLinputタグをtype='radio'でレンダリングします。

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

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

7. selectタグ

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

値を生成するために、ArrayList、またはitemsプロパティで使用可能なオプションを含むMapを渡します。 [.hps]#Once again#、コントローラー内で値を初期化できます:

Map countryItems = new LinkedHashMap();
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タグは、selectタグと同様に、itemsプロパティで使用可能なオプションを含むArrayList、またはMapを取ります。 :


    
    

[.hps]#Whenwe have theneedto selectseveral items at oncecreate amultipleリストbox.#このタイプをレンダリングするにはリストに、selectタグにmultiple=”true”属性を追加するだけです。

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

List fruit;

8. hiddenタグ

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

9. Errorsタグ

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

これにより、pathプロパティで指定されたフィールドのエラーが表示されます。 エラーメッセージは、デフォルトでspanタグ内に表示され、.errorsidとしてpath値に追加され、オプションでcssClassのCSSクラスが追加されます。 ■出力のスタイル設定に使用できるプロパティ:

Name is required!

デフォルトのspanタグの代わりに別の要素でエラーメッセージを囲むために、element属性内に優先要素を指定できます。

これにより、div要素内にエラーメッセージが表示されます。

Name is required!

In addition to having [.hps] a specific input element[.hps]エラーを表示する機能では、特定のページのエラーのリスト全体(フィールドに関係なく)を表示できます。 これは、ワイルドカード*を使用することで実現されます。

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で識別されるエラーメッセージを返します。

リソースバンドルは、SpringXML構成ファイルで次のように定義されています。


     

または、Pure 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 303Bean検証

Spring 3以降、Bean検証にJSR 303を(@Validアノテーションを介して)使用できるようになりました。 これを行うには、クラスパスにJSR303 validator frameworkが必要です。 Hibernate Validator(リファレンス実装)を使用します。 POMに含める必要がある依存関係は次のとおりです。


    org.hibernate
    hibernate-validator
    5.1.1.Final

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

または、Java構成で対応するアノテーション@EnableWebMvcを使用します。

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

次に、コントローラーメソッド[.hps]#thatwe want tovalidate#に@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;

デフォルトでは、パスワード入力フィールドを空のままにすると、この注釈には“may not be empty”が表示されます。

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

NotEmpty.person.password = Password is required!

10. 結論

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

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

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

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