瀏覽器與服務器之間的數據交換有很多類型,不只是表單提交數據這一種,比如ajax技術就大量使用json、xml等,這時候就涉及到瀏覽器端和服務器端數據格式轉換的問題,服務器端都是Java對象,需要把請求信息轉為Java對象,或者把Java對象轉換為響應信息,Spring提供了很重要的接口HttpMessageConverter。
這個接口有很多實現類完成信息轉換,比如:
----StringHttpMessageConverter----將請求信息轉為字符串
----ByteArrayHttpMessageConverter----讀寫二進制數據
----SourceHttpMessageConverter----讀寫javax.xml.transform.Source類型的數據
----XmlAwareFormHttpMessageConverter----轉換部分表單數據是xml的數據
----MappingJackson2HttpMessageConverter----用Jackson開源類包讀寫JSON數據
----Jaxb2RootElementHttpMessageConverter----通過JAXB2讀寫XML數據
。。。。。。還有很多
DispatcerServlet默認裝配了RequestMappingHandlerAdapter,而后者默認裝配了上面前4個HttpMessageConverter
其實json跟Java對象的轉換就三個要素:一個轉換器,兩個注解(@RequestBody、@ResponseBody)
MappingJackson2HttpMessageConverter轉換json數據
這是Spring MVC默認的json轉換器,雖然是默認,但還得自己導入jar包。也可以用別的轉換器,后面再說
因為Spring MVC默認使用該轉換器,因此applicationContext.xml中只需要配置<mvc:annotation-driven />
即可
用GET或者POST提交數據的時候,HTTP請求頭的Content-Type大概有以下三種:
----application/x-www-form-urlencoded:@RequestParam、@ModelAttribute、@RequestBody都可以處理
----multipart/form-data:@RequestBody沒法處理
----application/json、application/xml:必須用@RequestBody處理
@RequestBody將請求信息中的json轉為Java對象
@ResonseBody將處理方法返回的Java對象轉為json
還以上傳書籍信息為例,用ajax將書籍信息以json的格式上傳,后端修改數據后轉換為json傳給瀏覽器,再顯示出來
先寫index.html
<!DOCTYPE html>
<html>
<head>
<title>瀏覽器與服務器間用json傳遞數據</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="resources/jquery-3.1.0.js"></script>
<script type="text/javascript" src="resources/json2.js"></script><!-- 下面的JSON.stringify()即由此js提供 -->
<script type="text/javascript">
function sendRequest(){
var bookname=$("#bookname").val();
var author=$("#author").val();
var press=$("#press").val();
var isbn=$("#isbn").val();
var douban=$("#douban").val();
$.ajax({ /*用jQuery發送ajax請求*/
url:"addbook",
type:"POST", /*注意下面的data數據部分,JSON.stringify()的作用是把json對象轉為json字符串,不能少*/
data:JSON.stringify({"bookname":bookname,"author":author,"press":press,"isbn":isbn,"douban":douban}),
contentType:"application/json", /*將HTTP請求的Content-Type設置為“application/json”*/
dataType:"json",
success:function(result){
alert(result.bookname);
$("#b").html(result.bookname);
$("#a").html(result.author);
$("#p").html(result.press);
$("#i").html(result.isbn);
$("#d").html(result.douban);
}
});
}
$(function(){ /*頁面載入完畢后執行這個函數*/
$("#submit").click(sendRequest); /*為“提交”按鈕綁定單擊事件*/
});
</script>
</head>
<body>
<div>
書名:<input name="bookname" id="bookname" /><br>
作者:<input name="author" id="author" /><br>
出版社:<input name="press" id="press" /><br>
ISBN:<input name="isbn" id="isbn"/><br>
豆瓣評分:<input name="douban" id="douban"/><br>
<button type="button" id="submit">提交</button>
</div>
<h3 style="color:red;">下面是服務器返回的信息</h3>
<p>書名:<span id="b" style="color:red"></span></p>
<p>作者:<span id="a" style="color:red"></span></p>
<p>出版社:<span id="p" style="color:red"></span></p>
<p>ISBN:<span id="i" style="color:red"></span></p>
<p>豆瓣評分:<span id="d" style="color:red"></span></p>
</body>
</html>
寫Controller
package net.sonng.mvcdemo.controller;
import javax.servlet.http.HttpServletResponse;
import net.sonng.mvcdemo.entity.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class BookJSONController {
@ResponseBody //該注解將處理方法的返回值轉換為json
@RequestMapping("/addbook") //下面的@RequestBody可以將請求內容中的json轉為Java對象
public Book editBookInfo(@RequestBody Book book ){
book.setBookname(book.getBookname()+"----處理方法修改了數據");
book.setAuthor(book.getAuthor()+"----處理方法修改了數據");
book.setPress(book.getPress()+"----處理方法修改了數據");
book.setIsbn(book.getIsbn()+"----處理方法修改了數據");
return book;
}
}
瀏覽器訪問localhost:8888/mvcdemo/index.html 輸入信息后提交,下方即將服務器返回的信息列處理了
自定義JSON的HttpMessaageConverter轉換器
用alibaba的fastjson:下載或者用maven引入http://maven.aliyun.com/nexus/#nexus-search;quick~fastjson
主要就是改下applicationContext.xml配置:
<mvc:annotation-driven>
<mvc:message-converters register-defaults="false"> <!-- 不使用默認配置 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
<bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" />
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
<bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter" />
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter" >
<property name="supportedMediaTypes"> <!-- 支持的媒體類型 -->
<list>
<value>text/html;charset=UTF-8</value><!-- 順序不要寫反了,否則IE會出現下載提示 -->
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
總的說:json轉換就是一個轉換器,兩個注解