私はSpring mvc3を使用していますが、いくつかの概念と混同していることがわかったので、要約してここに投稿します。
- データバインディング。
アクションに Bean がある場合 (つまり、「Person」という名前)、次の URL が要求されたときに、前に struct2 を使用します。
http://localhost:8080/app/form?person.id=1&person.name=xxx&pet.name=yy
次に、Person の新しいインスタンスが作成され、パラメータ '1' と 'xxx' がこのインスタンスに入力されます。そして、Pet の新しいインスタンスが作成され、「yy」という名前がこの Bean に取り込まれます。
これが struct2 でのデータ バインディングの唯一の方法です。リクエストで beanname.property を指定します。
春の mvc3 では、データをバインドする 1 つの方法を知っています。
http://localhost:8080/app/form?id=1&name=xxx&other=yy
@RequestMapping('form')
public String form(Person person,BindingResult result){
//now I get the person
}
それでも機能しますが、いくつか質問があります。
1) リクエスト URL に 3 つのパラメーター「name」、「pass」、「other」があります。Spring はどのパラメーターを Bean (モデル) に入力する必要があるかをどのように認識しますか。
2) パラメータを struct2 の例のように複数のモデル (人とペットの両方) にバインドしたい場合はどうですか?
また、spring タグの「form」のmodelAttribute
and属性は何を意味するのでしょうか?commandName
2.検証する
bean の場合 (例のゲッターとセッターは無視してください):
import javax.validation.constraints.NotNull;
public class Bean {
@NotNull(message="id can not be null")
private int id;
}
私はこのコントローラーを使用します:
@RequestMapping("val")
public @ResponseBody
String validate(@Valid Bean bean, BindingResult result) {
if (result.hasErrors()) {
return result.getAllErrors() + "";
} else
return "no error";
}
「NotEmpty」のみが機能することがわかりました。このURLを使用する場合:
/val?name=xxx ==> no error !! // id is null now,why it does not has error?
3. 型変換。
たとえば、次の URL をご覧ください。
http://localhost:8080/app/form?id=1&name=xxx&other=yy
IDを文字列値に設定すると、明らかに「NumberFormatException」がスローされます。
次に、この例外をどこでキャッチしますか? コントローラーの場合、各コントローラーに非常に多くの try-catch ブロックを書き込む必要があります。
なお、型変換例外は「NumberFormatException」だけに限らず、「dataformaterrorexception」などの場合もあります。
しかし、それらはすべて型変換に属しています。共通のソリューションを使用して処理するにはどうすればよいですか?