@ModelAttribute
と@Valid
を使用する利点は何ですか?
違いはどれですか?
それらを一緒に使用することは可能ですか?
@ModelAttribute
は、メソッドパラメータまたはメソッドの戻り値の型を名前付きモデル属性にマップ/バインドするために使用されます。 @ ModelAttribute sJavaDocを参照してください。これはSpringアノテーションです。
@Valid
は、オブジェクトを JSR-303 Bean Validation としてマークするアノテーションです。 @ Valid sJavaDocを参照してください。これはJavaEE6の一部ですが、Hibernateには、ほとんどの人が代わりに使用する以前の実装があると思います。
@ModelAttribute
を使用する利点は、フォームの入力をBeanにマップできることです。 @Valid
の利点は、JSR-303 Bean検証を利用して、作成されたBeanがいくつかのルールセットに対して検証されていることを確認できることです。
はい、@ModelAttribute
と@Valid
を一緒に使用できます。
フォーム(sic View)からModelオブジェクトにデータを転送する最良の方法は、Springを使用して典型的/従来のMVCデザインパターンに従うことです。私の個人的な好みの方法は、JSPにSpring JSTL <form:*>
タグを付け、modelAttribute
を設定したフォームを作成することです。コントローラで、フォームの入力を表すBeanである一致する@ModelAttribute
を持つフォームからPOSTを受け入れるハンドラを持っています。次に、その「フォームBean」を渡します。 「必要に応じて「FormBean」を任意のモデルに変換する(フォームがモデルオブジェクトを直接作成する場合は不要)、DAOを介した保存/更新などを行うために、サービスレイヤーに移動します。これは1つの方法にすぎません。物事を行うためですが、それはおそらく私が日常の仕事で春に行うことの大部分です。
私は強く春の参考資料を読み、チュートリアルに従うことをお勧めします。参考資料は非常によく書かれていて、わかりやすく、Springで物事を行うさまざまな方法の例がたくさん含まれています。通常、Springで物事を行う方法にはかなりの数のオプションがあります。
以下の部分を確認してください 春のリファレンスドキュメント :
データバインディングに加えて、データバインディングエラーの記録に使用されたものと同じBindingResultを渡す独自のカスタムバリデーターを使用して検証を呼び出すこともできます。これにより、データバインディングと検証のエラーを1つの場所に蓄積し、その後ユーザーに報告することができます。
@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result) {
new PetValidator().validate(pet, result);
if (result.hasErrors()) {
return "petForm";
}
// ...
}
または、JSR-303 @Validアノテーションを追加して、検証を自動的に呼び出すことができます。
@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@Valid @ModelAttribute("pet") Pet pet, BindingResult result) {
if (result.hasErrors()) {
return "petForm";
}
// ...
}