SpringMVC傳遞JSON數據的推薦方式

一、前後端傳遞和接受json數據

1. 使用Ajax默認格式來傳遞數據【推薦】

Ajax的默認格式爲:application/x-www-form-urlencoded,相當於(username="admin"&password=123)來傳遞數據(這是GET請求的固定格式)

前端代碼:

當Ajax以默認格式上傳時,data數據直接使用JSON對象user,不用轉換爲JSON字符串(很方便)
 var user= {
                "username" : username,
                "password" : password,
                "rememberMe":rememberMe
            };
$.ajax({
    url : "http://...../jsontest.do",
    type : "POST",
    async : true,
    data : user,
    dataType : 'json',
    success : function(data) {
    }
});

後端使用@RequestParam註解或省略:

【推薦】
//直接省略註解
@RequestMapping("/jsontest.do")
public void test(User user,String username,String password,Boolean rememberMe){
    System.out.println(user);
    System.out.println("username: " + username);
    System.out.println("password: " + password);
    System.out.println("rememberMe: " + rememberMe);

}

【不推薦】
//加上註解
@RequestMapping("/jsontest.do")
public void test(@RequestParam String username,
@RequestParam String password,@RequestParam Boolean rememberMe,){
    System.out.println("username: " + username);
    System.out.println("password: " + password);
    System.out.println("rememberMe: " + rememberMe);
}

優點:
1.前端傳遞數據不用轉換爲json字符串:JSON.stringify(user)
2.後端接受的參數很靈活,即可以封裝爲User對象,亦可以使用單個參數username,rememberMe,甚至User對象和單個rememberMe參數混合使用都可以

2. 使用application/json格式來傳遞數據

Content-Type使用application/json的時候,要將JSON對象轉換爲JSON字符串

前端代碼:

var user= {
                "username" : username,
                "password" : password
          };
$.ajax({
        url : "http://...../jsontest.do",
        type : "POST",
        async : true,
        contentType: "application/json; charset=utf-8",
        data : JSON.stringify(user),
        dataType : 'json',
        success : function(data) {
        }
 });

後端必須使用@RequestBody 註解:


//這種方式下所有的參數都只能封裝在User對象中,不能單獨設置參數
@RequestMapping("/jsontest")
public void test(@RequestBody User user  ){
    String username = user.getUsername();
    String password = user.getPassword();
}

或者

@RequestMapping("/jsontest")
public void test(@RequestBody Map map  ){
    String username = map.get("username").toString();
    String password = map.get("password").toString();
}

或者

 public void test(@RequestBody String jsonData) {
    JSONObject jsonObject = JSON.parseObject(jsonData);
    String username= jsonObject.getString("username");
    String username= jsonObject.getString("password");
 }

缺點:
1.前端需要使用JSON.stringify()將JSON對象轉換爲JSON字符串
2.後端在接受參數的時候比較麻煩,沒有第1種簡單,也沒有第一種靈活

二、 spring-web.xml中需要如下配置

 <!-- annotation-driven 控制器映射器和控制器適配器 ,用來控制@Controller處理http請求的方式-->
    <mvc:annotation-driven>
        <mvc:message-converters><!-- register-defaults="true"表示使用默認的消息轉換器 -->
            <!-- FastJson(Spring4.2x以上版本設置) -->
            <!-- 使用@responsebody註解並且返回值類型爲String時,返回的string字符串帶有雙引號"{'user':'songfs'}",其原因是直接將string類型轉成了json字符串,應該在json解析器之前添加字符串解析器-->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
            <!-- FastJsonHttpMessageConverter4 使@ResponseBody支持返回Map<String,Object>等類型,它會自動轉換爲json-->
            <!-- 需要返回json時需要配置 produces = "application/json"。不需要再指定utf-8了 -->
            <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4">
                <!-- 加入支持的媒體類型 -->
                <property name="supportedMediaTypes">
                    <list>
                        <!-- 這裏順序不能反,一定先寫text/html,不然IE執行AJAX時,返回JSON會出現下載文件 -->
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                        <value>application/xml;charset=UTF-8</value>
                    </list>
                </property>
                <property name="fastJsonConfig">
                    <bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
                        <property name="features">
                            <list>
                                <value>AllowArbitraryCommas</value>
                                <value>AllowUnQuotedFieldNames</value>
                                <value>DisableCircularReferenceDetect</value>
                            </list>
                        </property>
                        <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章