私はSpringMVCでかなり新しいです。現在、SpringMVCWebフレームワークの機能を示すSpringMVCShowcaseを研究しています。
この例でカスタム解決可能なWeb引数がどのように処理されるかを理解するのに問題があります。
実際には、次のような状況があります。私のhome.jspビューには、次のリンクがあります。
<a id="customArg" class="textLink" href="<c:url value="/data/custom" />">Custom</a>
このリンクは、次のURLに対するHTTPリクエストを生成します:"/ data / custom"
このリクエストを処理するメソッドを含むコントローラークラスのコードは次のとおりです。
@Controller
public class CustomArgumentController {
@ModelAttribute
void beforeInvokingHandlerMethod(HttpServletRequest request) {
request.setAttribute("foo", "bar");
}
@RequestMapping(value="/data/custom", method=RequestMethod.GET)
public @ResponseBody String custom(@RequestAttribute("foo") String foo) {
return "Got 'foo' request attribute value '" + foo + "'";
}
}
このHTTPリクエストを処理するメソッドはcustom()です。したがって、前のリンクがクリックされると、HTTPリクエストはカスタムメソッドによって処理されます。
@RequestAttributeアノテーションが正確に何をするのかを理解するのに問題があります。この場合、fooという名前のリクエスト属性を新しいStringfoo変数にバインドすると思います。しかし、この属性はどこから取得されますか?この変数はSpringによって取得されますか?
OK、私の考えは、このリクエスト属性はHttpServletRequestオブジェクトから取得されるということです。このクラスには、話す名前を持つbeforeInvokingHandlerMethod()メソッドもあるので、このメソッドはHttpServletRequestオブジェクト内にname=fooとvalue=barを持つ属性を設定しているようです。したがって、custom()メソッドはこの値を使用できます。
実際、私の出力は次のとおりです。
'foo'リクエスト属性値'bar'を取得しました
custom()メソッドの前にbeforeInvokingHandlerMethod()が呼び出されるのはなぜですか?
そして、なぜbeforeInvokingHandlerMethod()が@ModelAttributeアノテーションによってアノテーションされているのですか?この場合はどういう意味ですか?