Ajax的默認格式爲:application/x-www-form-urlencoded,至關於(username="admin"&password=123)來傳遞數據(這是GET請求的固定格式)html
前端代碼:前端
當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註解或省略:web
【推薦】 //直接省略註解 @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參數混合使用均可以
Content-Type使用application/json的時候,要將JSON對象轉換爲JSON字符串
ajax
前端代碼:spring
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 註解:json
//這種方式下全部的參數都只能封裝在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種簡單,也沒有第一種靈活
<!-- 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>