2011-02-07 26 views
15

ロジックに応じてSpring MVCコントローラからビューを返したいとします。エラーが発生した場合は、JSONをHTMLビューで返します。これはASP.NET MVC ActionResultのようなもので、あらゆる種類のビューを返すことができ、結果をレンダリングし、要求で送信されるコンテンツタイプに依存しません。私はこれの例を見つけることができません。Spring MVCコントローラからJSONまたはViewを返す

+2

http://stackoverflow.com/questions/6173093/spring-return-json-from-controller-as-modelandview – Bozho

答えて

17

これを以下のように達成しました。

@RequestMapping(value="/users", method=RequestMethod.POST) 
public Object index(@RequestBody SearchUsersViewModel model, HttpServletResponse response) { 

    model.setList(userService.getUsers(model)); 

    if(true) 
    { 
     return new ModelAndView("controls/tables/users", "model", model); 
    } 
    else 
    { 
     return JsonView.Render(model, response); 
    }  
} 

JsonView。コール

config.request = $ 
       .ajax({ 
        url : url, 
        data : $.toJSON(def.data), 
        type : def.type, 
        dataType : def.dataType, 
        processData : true, 
        contentType : def.contentType, 
        success : function(data) { 

         try { 
          var json = data; 
          if (typeof data === "String" || typeof data == "string") { 
           json = (eval('(' + data + ')')); 
          } 
          if ('object' === typeof json) { 
           if (json.Validation && json.Validation.Errors.length > 0) { 

            $.each(json.Validation.Errors, function() { 
             // Error Code Check 
            }); 

            // Error Callback 
            if (typeof (def.errorCallback) == 'function') { 
             def.errorCallback(json); 
            } 
           } else { 
            def.callback(data); 
           } 
          } else { 
           def.callback(data); 
          } 
         } catch (e) { 
          def.callback(data); 
          // Hide Loading 
         } 
        }, 
        error : function(data) { 


        } 
       }); 
+1

あなたのコードには 'if(true)'があります - いつJSONが返されますか? – Paul

+0

私はただそこでテストしていました。リターンオブジェクトのエラーをテストし、jsonを返します。それ以外の場合はHTMLを返します。 –

0

おそらくResolveBundleViewResolverを見ると、ビューを混在させることができます。 docsには、これを使用する方法に関する情報があります。

ドキュメント(例はタイルとJSTLを混合することであるが、同様に他の人のために適用する必要があります)...

コンテキストファイル

<bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> 
    <property name="basename" value="views"/> 
</bean> 

views.properties

... 
welcomeView.(class)=org.springframework.web.servlet.view.tiles2.TilesView 
welcomeView.url=welcome (this is the name of a Tiles definition) 

vetsView.(class)=org.springframework.web.servlet.view.tiles2.TilesView 
vetsView.url=vetsView (again, this is the name of a Tiles definition) 

findOwnersForm.(class)=org.springframework.web.servlet.view.JstlView 
findOwnersForm.url=/WEB-INF/jsp/findOwners.jsp 
... 
4

から条件に応じて異なる論理ビュー名を返すようにコントローラをプログラムします。たとえば:

@RequestMapping(value="/hello/{name}", method=RequestMethod.GET) 
public ModelAndView hello(@PathVariable String name) { 
    String viewName = (name.length() > 1) ? "hello" : "error"; 
    ModelAndView mav = new ModelAndView(viewName); 
    mav.addObject("name", name); 
    return mav; 
} 

はJSONビューにビュー名"error"を解決するためにビューリゾルバを設定します。

  • XmlViewResolver Bean定義のXMLファイルを読み込み、
  • ResourceBundleViewResolverプロパティファイルを読み込み、のアプリケーションコンテキスト内を検索します
  • BeanNameViewResolver:春は、以下を含むマッピングを表示するビュー名を設定するには、多くの方法を提供し、ビュー名と同じ名前を持つBeanに対してDispatcherServletを実行します。

例えば、BeanNameViewResolverを使用します

<bean name="error" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/> 

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> 
    <property name="order" value="1"/> 
</bean> 
5

念のため、あなたが次の操作を行うことができます例外でJSONを返すようにしたい:

@ExceptionHandler(Exception.class) 
    @ResponseBody 
     public void handleIOException(Exception exception,HttpServletRequest request, HttpServletResponse response) { 
     response.setContentType("application/json"); 
     String json = "{\"Name\": 50}"; 
     PrintWriter out= response.getWriter(); 
     out.write(json); 
     } 

私はわからないんだけどこれはあなたがやりたいことですが、ちょうどその場合には.... :)

+0

であり、 JSONをキャッチしてJSONを返しますか? –

+0

私が覚えている限り、それはつかまるだろう。 –

2

実際の返品を防ぐことは何ですか?Viewオブジェクトをコントローラメソッドから直接呼び出すことができます。ビュー名である必要はありません。したがって、コントローラは独自のロジックを使用してViewオブジェクトを構築し、ModelAndViewオブジェクトにラップされていてもいなくてもそれを返すことができます。

ViewResolverフレームワークをこのようにすることを説得しようとするよりも簡単ですが、これもうまくいくでしょう。

-1

はここで、チン黄の答えを拡張することができますjavaの

public class JsonView { 

    public static ModelAndView Render(Object model, HttpServletResponse response) 
    { 
     MappingJacksonHttpMessageConverter jsonConverter = new MappingJacksonHttpMessageConverter(); 

     MediaType jsonMimeType = MediaType.APPLICATION_JSON; 


     try { 
      jsonConverter.write(model, jsonMimeType, new ServletServerHttpResponse(response)); 
     } catch (HttpMessageNotWritableException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

JS機能は私のためにどのような作品です。設定は必要ありません。

response.setStatus(500); 
return new ModelAndView(new MappingJacksonJsonView(), model); 

これは自動的にモデルをJSONに変換し、応答に書き込みます。 ここでモデルはタイプMap<String,Object>であり、エラーがコントローラで起こった場合、応答はタイプHttpServletResponse

+0

新しいJSONビューを返す必要があるたびに、そのインスタンスをインスタンス化するのは悪い考えです。 –

+0

良いアイディア@JukkaDahlbomとは何ですか? –

関連する問題