2011-02-07 3 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"를 해결합니다. bean 정의 XML 파일을 읽어

  • XmlViewResolver, 특성 파일을 읽어
  • 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을 돌려 주겠습니까? –

+0

나는 네가 기억하는 한 그것을 잡을 것이다. –

2

View 컨트롤러 메서드에서 직접 개체를 가져올 수 있습니다. 뷰 이름 일 필요는 없습니다. 따라서 컨트롤러는 자신의 로직을 사용하여 View 객체를 생성하고 ModelAndView 객체에 랩핑되었거나없이 객체를 반환 할 수 있습니다.

ViewResolver 프레임 워크가이 작업을 수행하지 못하도록 설득하는 것보다 쉽습니다.

-1

하게

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입니까? –

관련 문제