一、前後端傳遞和接受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>