Spring MVC 학습노트의 json 형식 입력 및 출력

4986 단어 springmvcjson
Spring mvc 처리 json은 jackson의 라이브러리를 사용해야 하기 때문에 json 형식의 입력과 출력을 지원하기 위해pom을 먼저 수정해야 합니다.xml jackson 패키지 인용 추가

    <!-- json -->
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-core-lgpl</artifactId>
      <version>1.8.1</version>
    </dependency>

    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-lgpl</artifactId>
      <version>1.8.1</version>
    </dependency>
먼저 이전의 Helloworld를 수정하세요.jsp, 클라이언트 json 형식의 데이터 입력을 추가합니다.

  var cfg =   {
    type: 'POST', 
    data: JSON.stringify({userName:'winzip',password:'password',mobileNO:'13818881888'}), 
    dataType: 'json',
    contentType:'application/json;charset=UTF-8',    
    success: function(result) { 
      alert(result.success); 
    } 
  };

function doTestJson(actionName){
  cfg.url = actionName;
  $.ajax(cfg);
}
앞의 분석에 의하면spring mvc에서 json 형식으로 입력된 데이터를 분석하는 방법은 두 가지가 있다. 하나는 @RequestBody를 사용하여 입력을 설정하는 것이다.

  @RequestMapping("/json1")
  @ResponseBody
  public JsonResult testJson1(@RequestBody User u){
    log.info("get json input from request body annotation");
    log.info(u.getUserName());
    return new JsonResult(true,"return ok");
}
2: HttpEntity를 사용하여 입력 바인딩

  @RequestMapping("/json2")  
  public ResponseEntity<JsonResult> testJson2(HttpEntity<User> u){
    log.info("get json input from HttpEntity annotation");
    log.info(u.getBody().getUserName());
    ResponseEntity<JsonResult> responseResult = new ResponseEntity<JsonResult>( new JsonResult(true,"return ok"),HttpStatus.OK);
    return responseResult;
}
Json 형식의 출력도 두 가지 방법이 있습니다. 1: @responseBody를 사용하여 출력 내용을 context body 2로 설정합니다. 반환값은 ResponseEntity형식, context body를 되돌려줍니다. 세 번째 방식은 ContentNegotiatingViewResolver를 사용하여 출력을 json 형식으로 설정하는 것입니다. servlet context 프로필을 다음과 같이 수정해야 합니다.

  <bean
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="order" value="1" />
    <property name="mediaTypes">
      <map>
        <entry key="json" value="application/json" />
      </map>
    </property>
    <property name="defaultViews">
      <list>
        <bean
          class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
      </list>
    </property>
    <property name="ignoreAcceptHeader" value="true" />
  </bean>
그러나 이 형식의 출력은 {model 클래스 이름: {내용}}의 json 형식을 되돌려줍니다. 예를 들어 다음 코드입니다.

  @RequestMapping("/json3.json")
  public JsonResult testJson3(@RequestBody User u){
    log.info("handle json output from ContentNegotiatingViewResolver");
    return new JsonResult(true,"return ok");
  }
원하는 반환은 {success:true,message:"return ok"}입니다.그러나 실제 되돌아오는 것은 {'json Result': {'success':true,'msg':'return ok'}} 왜냐하면 Mapping Jackson JsonView에서 되돌아오는 값에 대한 처리가 모델맵에 있는 값이 하나만 있는 상황을 고려하지 않고 맵Name:{map Result}의 형식에 따라 수치를 되돌려주기 때문이다.수정 방법, MappingJacksonJsonView 클래스를 다시 불러오고 filterModel을 다시 쓰는 방법은 다음과 같습니다.

  protected Object filterModel(Map<String, Object> model) { 
    Map<?, ?> result = (Map<?, ?>) super.filterModel(model); 
    if (result.size() == 1) { 
      return result.values().iterator().next(); 
    } else { 
      return result; 
    } 
  } 
ContentNegotiatingViewResolver 의 수정 사항은 다음과 같습니다.

<bean
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="order" value="1" />
    <property name="mediaTypes">
      <map>
        <entry key="json" value="application/json" />
      </map>
    </property>
    <property name="defaultViews">
      <list>
        <bean
          class="net.zhepu.json.MappingJacksonJsonView" />
      </list>
    </property>
    <property name="ignoreAcceptHeader" value="true" />
  </bean>
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기