7

私は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=foovalue=barを持つ属性を設定しているようです。したがって、custom()メソッドはこの値を使用できます。

実際、私の出力は次のとおりです。

'foo'リクエスト属性値'bar'を取得しました

custom()メソッドの前にbeforeInvokingHandlerMethod()が呼び出されるのはなぜですか?

そして、なぜbeforeInvokingHandlerMethod()@ModelAttributeアノテーションによってアノテーションされているのですか?この場合はどういう意味ですか?

4

1 に答える 1

1

これRequestAttribute は、フォーム送信で渡したパラメータに他なりません。サンプル例で理解しましょう

私が以下のフォームを持っていると仮定します

<form action="...">
<input type=hidden name=param1 id=param1 value=test/>
</form>

さて、以下のようにフォーム送信でマッピングされたリクエストURLでマッピングされた以下のコントローラーがある場合。

@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("param1") String param1 ) {
    // Here, I will have value of param1 as test in String object which will be mapped my Spring itself
}
于 2012-12-15T19:59:22.537 に答える