2011-09-12 12 views
27

私が見た例を返しスプリングMVCコントローラは、タイプ

public ModelAndView helloWorld() { 
    ModelAndView mav = new ModelAndView(); 
    mav.setViewName("helloWorld"); 
    mav.addObject("message", "Hello World!"); 
    return mav; 
} 

2つの違いは何ですか?また、どちらを使用する必要がありますか?私の見解を解決できるかのどちらかが原因です。

+0

あたりとしてhelloworld.jspに戻されますか? –

+0

ここに答えがあります:https://stackoverflow.com/questions/29365833/what-are-valid-return-types-of-a-spring-mvc-controller-method/29366138#29366138 – Rajeev

答えて

15

私たちがMVC 3について話しているのであれば、どちらも正しいです。しかし、ModelAndViewを直接返すことは古い方法であり、より口頭で行われます。

@ResponseBodyを除く他の文字列を返すだけの場合、この文字列はビュー名として扱われ、スプリングはリゾルバを表示するようにプッシュします。したがって、心配する必要はありません(少なくとも、コントローラを書いている)、使用するビューレンダラのタイプ(JSPまたはベロシティにしても問題ありません)。 Modelインスタンスのみを伝播し、次にそれをどうするかをヒントとして返します。適切なModelAndViewオブジェクトは後で文字列で内部的に作成されます。

一般に、スプリング3では、引数と戻り値の型を柔軟に設定できます(SpringドキュメントのDefining @RequestMapping handler methodsセクションを参照)。

+1

新しいMVC 3のアプローチ( 'String'を返す)では、' Model'インスタンスはどのようにしてビューに入りますか?コントローラでは、 'model.addAttribute(..)'を使用して属性を追加しますが、最終的に 'String'だけが返されます。したがって、Viewリゾルバは' Model'オブジェクトについてどのように知っていますか?ありがとう! – user2490003

+0

私は、RequestMapping(つまりモデルはあなたがリゾルバから与えられたもの)によって行われた何らかの依存した注入を信じています - しかし、正直言って私は過去5年間Springとの連絡がなかったので分かりません^^ –

1

freemarkerやvelocityなどのテンプレート言語を使用してレスポンスを作成する場合は、ModelAndViewを返すことができます。

応答としてjson/xmlまたは何らかの文字列(たとえば、ajaxリクエスト)を返す場合は、最初のメソッドを使用できます。私はそれがpublic @ResponseBody String findOwner(@PathVariable String ownerId, Model model)であるべきだと思う、返された値が応答テキストとして変換される必要があることを示す@ResponseBodyと呼ばれる注釈を追加する必要があります。 @ResponseBodyを使用すると、JacksonまたはJaxBのようなライブラリを使用して、それぞれjson/xml応答を作成できます。

これらの戻り値はAnnotationMethodHandlerAdapterで登録されたmessageConvertersを使用して変換されます。

参考:あなたはたとえば、jspページ

をレンダリングしたい場合はSpring MVCのでhttp://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/

+1

ポイントがありません。返される文字列より適切な 'viewリゾルバ 'を定義した場合、view(jsp、templateなど)の名前として扱われます。 '@ ResponseBody'はそれとは関係ありません。 –

+0

@AdamJurczykだから、すでに 'view resolver'を定義していれば、' @ ResponseBody'(私はJSONをAjax呼び出しのために返したいと思います)をどのように使うことができますか?ありがとう – MyTitle

6

、あなたはのModelAndViewを返す必要があります:

@RequestMapping(value="/index.html", method=RequestMethod.GET) 
    public ModelAndView indexView(){ 
     ModelAndView mv = new ModelAndView("index"); 
     return mv; 
    }  

あなたがいるときに、この関数はindex.jspを返します。 /index.html

また、@ResponseBodyアノテーションとシリアライザを使用して、任意のJSONまたはXMLオブジェクトを返すことができます。例えば

:この例では

@RequestMapping(value="/getStudent.do",method=RequestMethod.POST) 
    @ResponseBody 
    public List<Student> getStudent(@RequestParam("studentId") String id){ 
     List<Student> students = daoService.getStudent(id); 
     return students; 
    } 

あなたはケースにJSONとしてリストを返します、あなたはジャクソン・シリアライザを有効にしています。あなたは春のXMLに以下を追加する必要があることを可能にするために:

<context:annotation-config/> 

シリアライザ自身:

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
<property name="messageConverters"> 
    <list> 
    <ref bean="jacksonMessageConverter"/> 
    </list> 
</property> 
</bean> 

はそれがお役に立てば幸いです。

+2

MAVを直接作成して返す必要はありません。これに加えて、 'context:annotation-config'を使用しているなら、' jackson'がクラスパス上にあれば自動的にシリアライザを置く必要はありません。 –

+0

非常に便利な完璧でシンプルな例です。 – Tastybrownies

17

これは同じロジックですが、同じバージョンの春ではありません。

ModelAndViewオブジェクトは、モデルとビューを処理するSpring 2.xの方法です。 与えられた例では、modelandviewオブジェクトはモデル内に1つのデータ "message"を持つ "helloWorld"ビューをロードします(テンプレートエンジンはhelloWorld.jspまたはhelloWorld.html ...)。

他の方法はスプリング3.xの方法です。あなたはあなたのhelloworldとまったく同じ例を書くことができました。

@RequestMapping(value="/helloWorld", method=RequestMethod.GET) 
public String helloWorld(Model model) { 
    model.addAttribute("message", "Hello World!"); 
    return "helloWorld"; 
} 

このモデルには、要求に応じて自動的に入力されます。

URLマッピング "helloWorld"が直接ビュー名であるため、この表記を簡略化できます。

@RequestMapping(value="/helloWorld", method=RequestMethod.GET) 
public void helloWorld(Model model) { 
    model.addAttribute("message", "Hello World!"); 
} 

のHelloWorldビューは自動にのModelAndViewまたは文字列を返す

5

が同じ仕事をしてロードされます。それは、ビュー(jspページ)に分解され、ビューにレンダリングされるモデルオブジェクトを与えます。文字列を返すと、springはviewResolverを使用してビューに内部的に解決し、ModelAndViewオブジェクトを作成して返します。 ModelAndViewオブジェクトの戻り値は古いバージョンからのものです。あなたの都合の良いことに基づいてこれを行うことができます。

は答えの束が@RequestBodyに指摘されている。また、このquestion

を見てください。あなたの質問には正確には関係しません。しかし、コンバーターを使用してコンテンツタイプに基づいてオブジェクトを変換し、ドキュメント本体の一部になることに注意してください。

1
public String findOwner(@PathVariable String ownerId, Model model) { 
    Owner owner = ownerService.findOwner(ownerId); 
    model.addAttribute("owner", owner); 
    return "displayOwner" 
}      

この方法では戻り値の型がStringであり、我々は我々が

modelparam.addAttribute("obj",value); 

のように追加して、ビューごとにJSPにdisplayownerに戻りますモデルと値を追加するので、パラメータとしてモデルを追加この方法では戻り値の型は、私たちはモデル 、ここでMAVを返しますのModelAndViewあるリゾルバ

public ModelAndView helloWorld() { 
    ModelAndView mav = new ModelAndView(); 
    mav.setViewName("helloWorld"); 
    mav.addObject("message", "Hello World!"); 
    return mav; 
} 

ので、ここで私達は広告はずのModelAndViewの目的であります

model.addObject("object","value"); 

のようなdが、ここでビュー名は、私たちが話している春のMVCのバージョンviewResolver

関連する問題