6

私はSpring MVCでかなり新しいです。

この期間、私はSTS ダッシュボードからダウンロードできるSpring MVC ショーケースの例を研究しています。

この例でカスタムの解決可能な 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注釈が何であるかを理解するのに問題があります。

String fooこの場合、foo という名前のリクエスト属性を新しい変数にバインドしていると思います。

しかし... この属性はどこから取得されますか? この変数はSpringによって取得されますか?

わかりました...私の考えでは、このリクエスト属性はHttpServletRequestオブジェクトから取得されます...

これは、このクラスには、話す名前を持つメソッドもあるためだと思います...したがって、このメソッドは、オブジェクト内にandbeforeInvokingHandlerMethod()を持つ属性を設定しているようです...そして、メソッドは使用できますこの値...name=foovalue=barHttpServletRequestcustom()

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

Got 'foo' request attribute value 'bar'

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

そして、なぜ注釈beforeInvokingHandlerMethod()によって@ModelAttribute注釈が付けられているのですか? このケースはどういう意味ですか?

4

1 に答える 1

2

を前提として正しい@RequestAttributeので、に設定する必要はありませんbeforeInvokingHandlerMethod/data/initリクエストをに転送するためにマップされたメソッドがあると仮定します/data/custom。この場合、リクエスト属性はinitメソッドでも設定できます。

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

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

ここで理由がわかります http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib-methods

メソッドの@ModelAttributeは、そのメソッドの目的が1つ以上のモデル属性を追加することであることを示します。このようなメソッドは、@ RequestMappingメソッドと同じ引数タイプをサポートしますが、リクエストに直接マップすることはできません。代わりに、コントローラー内の@ModelAttributeメソッドは、同じコントローラー内で@RequestMappingメソッドの前に呼び出されます。

于 2012-12-17T18:08:00.123 に答える