SpringMVC的JSON數據交互(七)-@Response,@RestController,@RequestBody用法


1.@RequestBody   (自動將請求的數據封裝為對象)

作用:

@RequestBody注解用於讀取http請求的內容(字符串),通過springmvc提供的HttpMessageConverter接口將讀到的內容(json數據)轉換為java對象並綁定到Controller方法的參數上。

傳統的請求參數:

itemEdit.action?id=1&name=zhangsan&age=12

現在的請求參數:

使用POST請求,在請求體里面加入json數據

{

"id": 1,

"name": "測試商品",

"price": 99.9,

"detail": "測試商品描述",

"pic": "123456.jpg"

}

2.@ResponseBody

作用:

@ResponseBody注解用於將Controller的方法返回的對象,通過springmvc提供的HttpMessageConverter接口轉換為指定格式的數據如:json,xml等,通過Response響應給客戶端

 

 

總結:

  在controller中我們可以在方法上面添加@ResponseBody注解,這樣我們返回實體對象或者字符串時,就會自動轉換成json對象傳給前端。在spring4.0后,@ResponseBody又可以加在類上,表示該類中的所有方法都加有@ResponseBody,很方便。另一種方式是使用@RestController注解在類上,作用等於@Controller與@ResponseBody同時加在類上,這也是最方便的一種方式。要讓@ResponseBody在類上也起作用,需要在springmvc配置文件中加上<mvc:annotation-driven />這一行配置才可以。而@ResponseBody使用在方法上,則不用添加該配置也可以使用。也就是說springmvc默認只支持@ResponseBody在方法上使用,不支持在類上的使用。

  在實際項目中,我們可能會將后台管理項目與app的后台放在一個項目里面,這樣就等於是兩個后台共用一套springmvc的配置文件。但是app后台的controller都是返回json信息的,而后台管理是用來返回jsp界面的,會有點混亂。這種情況下,我們需要同時配置<mvc:annotation-driven />和viewResolver,這樣的話,app后台的controller都加上@RestController即可,而后台管理的controller則不要@ResponseBody和@RestController,只返回字符串格式的jsp文件名即可。這樣就可以兩不耽誤,兩個項目合在一起開發了。

查看RestController的源碼:  (是一個組合注解)

/*
 * Copyright 2002-2014 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.web.bind.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.stereotype.Controller;

/**
 * A convenience annotation that is itself annotated with {@link Controller @Controller}
 * and {@link ResponseBody @ResponseBody}.
 * <p>
 * Types that carry this annotation are treated as controllers where
 * {@link RequestMapping @RequestMapping} methods assume
 * {@link ResponseBody @ResponseBody} semantics by default.
 *
 * @author Rossen Stoyanchev
 * @author Sam Brannen
 * @since 4.0
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller @ResponseBody
public @interface RestController {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any
     * @since 4.0.1
     */
    String value() default "";

}

 

 

例如:

package cn.xm.jwxt.controller.common;

import cn.xm.jwxt.bean.common.Dictionary;
import cn.xm.jwxt.service.common.DictionaryService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.sql.SQLException;
import java.util.List;

/**
 * 字典controller
 */

@RequestMapping("/dictionary")//基本的映射路徑
//@ResponseBody//所有方法返回都是以JSON形式返回
//@Controller//控制層代碼
@RestController//這個注解等於@ResponseBody+@Controller
public class DictionaryController {
    @Autowired
    private DictionaryService dictionaryService;
    private Logger logger = Logger.getLogger(DictionaryController.class);

    @RequestMapping("/getDictionaryTree")
    public List<Dictionary> getDictionaryTrees() {
        List<Dictionary> dictionaryTree = null;
        try {
            dictionaryTree =  dictionaryService.getDictionaryTree();
        } catch (SQLException e) {
            logger.error("查詢字典樹出錯!",e);
        }
        return dictionaryTree;
    }


}

 

 

3.請求json,響應json實現:

3.1. 加入jar包

如果需要springMVC支持json,必須加入json的處理jar

我們使用Jackson這個jar,如下圖:

 

3.1 JSP頁面ajax請求

<script type="text/javascript">

$(function(){
    var param='{"id": 1,"name": "測試商品","price": 99.9,"detail": "測試商品描述","pic": "123456.jpg"}';
    $.ajax({
        url:"${pageContext.request.contextPath }/json.action",
        async:true,
        type:"POST",
        data:param,
        contentType : "application/json;charset=UTF-8",//發送數據的格式
        success: function(data){
              alert(data.name);
            },
        error:function(){
            alert("請求失敗");
            },
        dataType:"json"    //回掉數據格式
    });
    
})
</script>

 

3.2.處理ajax請求的controller

@RequestMapping(value = "/json.action")
    public    @ResponseBody Items json(@RequestBody Items items){
//        設置@RequestBody后子發動將ajax請求封裝為對象
        System.out.println(items);
        
//        設置@ResponseBody后自動將返回的數據封裝為ajax
        return items;
    }
    

 

3.3 配置json轉換器

如果不使用注解驅動<mvc:annotation-driven />,就需要給處理器適配器配置json轉換器,參考之前學習的自定義參數綁定。

 

在springmvc.xml配置文件中,給處理器適配器加入json轉換器:

<!--處理器適配器 -->

   <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">

      <property name="messageConverters">

      <list>

      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>

      </list>

      </property>

   </bean>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM