2012-12-15 212 views
6

私はSpring MVCでかなり新しいです。現在、私はSpring MVC Webフレームワークの機能を示すSpring MVC Showcaseを勉強しています。Spring MVCで@ModelAttributeアノテーションと@RequestAttributeアノテーションを使用することを理解する

この例では、カスタム解決可能なWeb引数の処理方法を理解するためにいくつかの問題があります。

実際には次のような状況があります。メソッドが含まれている「/データ/カスタム」

コントローラクラス:

<a id="customArg" class="textLink" href="<c:url value="/data/custom" />">Custom</a> 

このリンクをクリックすると、URLへのHTTPリクエストを生成します。私のhome.jspをビューでは、私は次のリンクを持っています

@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リクエストを処理するメソッドは、カスタム()です:それは、この要求は、次のコードを持って処理します。したがって、前のリンクがクリックされると、HTTPリクエストはカスタムメソッドによって処理されます。

@RequestAttributeアノテーションが正確に何をするのかを理解することには問題があります。この場合、fooという名前のリクエスト属性を新しいString foo変数にバインドすると思います。しかし、この属性はどこから取られていますか?この変数はSpringによって取られていますか?

私の考えは、このリクエスト属性がHttpServletRequestオブジェクトから取得されているということです。このクラスでは、私もbeforeInvokingHandlerMethodを(持っている、ので、私は内側=バー名= fooの値を持っていることが、この方法は属性を設定しているようですので、話すの名前を持っている方法、)そう思いますHttpServletRequestオブジェクトを呼び出すと、custom()メソッドはこの値を使用できます。

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

ガット 'foo' で要求属性値 'バー'

なぜカスタム()メソッドの前に呼び出されbeforeInvokingHandlerMethod()?

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

答えて

1

RequestAttributeは、フォーム提出で渡したパラメータに過ぎません。サンプル例を理解することができ

は、私は以下のようにフォームの送信にマッピングされているリクエストURLにマッピングされている以下のコントローラを持っている場合、私は、以下のフォームを

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

を有していると仮定する。

@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 
} 
+0

うーん、私はよくこのことを理解してみましょう:私は正しく「foo」という、「バー」の値を持つフォームを合格した場合@ModelAttributeアノテーションで私のbeforeInvokingHandlerMethod()メソッドは同じものであるannoteそうとき?このメソッドの中で私はrequest.setAttribute( "foo"、 "bar");を実行します。 ? – AndreaNobili

+0

Excatly、あなたは何かを訂正しています。ModelAttributeの理解を深めるために、Spring MVC http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/webの公式文書をご覧ください。 /bind/annotation/ModelAttribute.htmlまた、http://blog.trifork.nl/2009/05/14/simple-forms-with-spring-mvc-2-5/ –

+0

からこのドキュメントを読んだことがありましたが、私がModelAttributeアノテーションによってannotedされたメソッドを持っていると、メソッドのパラメータを名前付きモデルの属性にバインドしています。そして、他のメソッドでそれを使用することができます。メソッドを使用してRequestAttribute注釈を使用しますか? 私の場合、バインドするパラメータは何ですか? "bar"という値を持つ "foo"という名前のパラメータですか? ありがとうございます非常に親切です:-) – AndreaNobili

関連する問題