なぜmodel
はprintHello
メソッドへの入力パラメータとして宣言されていますか?ローカル変数としては言いませんか?
あなたはローカル変数として宣言し、必要ならばそれを返すことができます。
@RequestMapping("/hello")
public ModelMap printHello() {
return new ModelMap("message", "Hello Spring MVC Framework!");
}
しかし、あなたはSpringのデータバインディング(バインディング要求属性(GETリクエストのクエリパラメータ)を利用していないこの方法モデル化する)。
また、Spring MVCのは、論理ビュー名としてController
サフィックスなしでコントローラ名を使用するデフォルトのDefaultRequestToViewNameTranslator
を使用して、それを推測しますので、あなたは、(あなたの元の例return "hello"
のように)任意のビュー名を提供していないこの方法は、(あなたの例では、それはhello
になりますあなたのコントローラはHelloController
です)。詳細は、documentationを参照してください。
さらに、Model
またはModelMap
ではなく、新しいModelAndView
インスタンスを返すことができます。この場合、ビュー名とモデル属性を明示的に設定することができます。
しかし、ハンドラメソッドの引数としてModelを使用する主な利点は、データバインディングです。
あなたがメソッドの引数としてモデルと(への要求をバインドする)いくつかのモデル属性を提供する場合、あなたはすでに追加してモデルインスタンスを取得(とリクエストパラメータを用いて充填)モデル属性モデルにして、あなたが追加することができますあなたがそれを必要とするならば、それに別の属性。
@RequestMapping(path = "/hello", method = RequestMethod.GET)
public String printHello(Model model, @ModelAttribute("form") SearchForm form, BindingResult result) {
model.addAttribute("anotherUsefulValue", myService.getSomeValue());
// 'hello' view will get the model with both 'form' and 'anotherUsefulValue' attributes
// and 'form' attribute will have 'text' field filled from request's
// query parameter 'text'.
return "hello";
}
class SearchForm {
private String text;
// ... getter and setter
}
この方法を使用すると、text
という名前のテキストフィールドを持つ一部のHTML form
からの要求をGET行うことができますし、このフォームを送信すると、あなたのモデルは、値としてインスタンス化さSearchForm
オブジェクトの属性form
が含まれます。このオブジェクトのフィールドtext
は、値としてtext
クエリパラメータを持ちます。
spring-form JSP Tag Libraryを使用した例:
<form:form method="GET" action="/hello" modelAttribute="form">
<form:input path="text" />
<input type="submit">
</form>
それともURL /hello?text=12345
を入力してください。 model
はform
属性のtext
フィールドは12345
となり、の属性にはanotherUsefulValue
属性も含まれます。 Springのデータバインディングとカスタムモデルの属性を組み合わせただけです。
もちろん、新しいモデルを手動で作成し、form
属性とともにanotherUsefulValue
をメソッドのform
引数から設定することができます。しかし、それは単なる定型文です。
model
どこビュー明示的に渡さされていないが、これは何とか舞台裏起こるのでしょうか?
もちろんです。春のDispatcherServlet
は他の多くのものと同じようにこれを行います。これはすべてdocumentationに記載されています。

Front Controller
ちょうどあなたのコントローラメソッドが返されたかを知ると、それは新しいモデルであるか、あなたの方法ですべてのモデルを返さないし、その後Front Controller
が、それは引数としてお使いのコントローラメソッドに渡されたモデルを使用している場合に理解することができます。
DispatcherServletがHandlerMappingを参照して適切なControllerを呼び出すとき、おそらくそれはオブジェクトをメソッドの引数に渡すように、それ自身のModelMapオブジェクトを構築すると考えています。また、ローカルインスタンシエーションで明示的に構築すると、オブジェクトはハンドラによって管理されないため、バインディングは発生しません。したがって、それを慣例/合意として考えることができます。 –