SpringMVC處理Json-使用 HttpMessageConverter
一、HttpMessageConverter<T>
作用:它負責將請求資訊轉換為一個物件(型別為T),將該物件輸出為響應資訊。
其實:DispatcherServlet預設已經安裝了AnnotationMethodHandlerAdapter作為HandlerAdapter元件的實現類,HttpMessageConverter即由AnnotationMethodHandlerAdapter使用,將請求資訊轉換為物件,或將物件轉換為響應資訊。
◇那麼問題來了?
問題1:如何使用HttpMessageConverter<T> 將請求資訊轉化並繫結到處理方法的入參當中呢?
解答:1.使用@RequestBody/@ResponseBody對處理方法進行標註2.使用HttpEntity<T>/ResponseEntity<T>作為處理方法的入參或者返回值
示例1:
@RequestMapping("/handle1" )
public String handle1( @RequestBody String
requebody) {
return "success" ;
}
解:將請求報文體轉換為字串繫結到reqeustBody入參中。
示例2:
@ResponseBody
@RequestMapping( "/getEmployeesForJson")
public Collection<Employee> getEmployees() {
return employeeDao .getAll();
}
解:將集合資料轉換為json資料並輸出到響應流中。
問題2:處理方法如何知道請求訊息的格式?在處理完成後又是根據什麼確定響應訊息的格式嗯?
解答:根據請求訊息頭的”Content-Type“及Accept屬性確定。
例如:
1). 分析原理①. 請求時的目標型別:②. 方法的實際返回值為:Employee 的集合③. SpringMVC 發現需要返回的是 JSON 型別,但實際返回的是 Employee 的集合。此時 @ResponseBody 查詢有沒有把結果轉為 JSON的 HttpMessageConverter,如果有,則呼叫其對應的方法,把結果轉為 JSON 型別。
結論:
1.只有當處理器方法使用到 @RequestBody/@ResponseBody 或HttpEntity<T>/ResponseEntity<T> 時,SpringMVC才使用註冊的HttpMessageConverter 對請求響應訊息進行處理。
2.當控制器處理方法使用到 @RequestBody/@ResponseBody 或HttpEntity<T>/ResponseEntity<T> 時,Spring 首先根據請求頭或響應頭的 Accept 屬性選擇匹配的 HttpMessageConverter, 進而根據引數型別或泛型型別的過濾得到匹配的 HttpMessageConverter,
若找不到可用的 HttpMessageConverter 將報錯
3.@RequestBody 和 @ResponseBody 不需要成對出現。如果方法入參使用到了@RequestBody,SpringMVC將會選擇匹配的HttpMessageConverter 將請求資訊轉換並繫結到該入參中。如果處理方法標註了@ResponseBody,SpringMVC選擇匹配的HttpMessageConverter 將方法返回值轉換並輸出響應訊息。
@RequestMapping("/testHttpMessageConverter" )
public ResponseEntity< byte[]>
testHttpMessageConverter(@RequestBody String requestBody,
HttpSession session) throws IOException{
System. out.println(requestBody);
InputStream in = session.getServletContext().getResourceAsStream("/WEB-INF/files/abc.pdf" );
byte [] bytes = new byte[in.available()];
in.read(bytes);
HttpHeaders headers = new HttpHeaders();
headers.add( "Content-Disposition", "attachment;filename=a.pdf" );
HttpStatus statusCode = HttpStatus. OK;
ResponseEntity< byte[]>
re = new ResponseEntity<byte []>(bytes,
headers, statusCode);
return re;
}
二、獲取json資料示例:
1.頁面請求:< a href ="getEmployeesForJson" id ="json">testForJson </a>
2.發post請求:
<script type= "text/javascript" src="scripts/jquery-1.9.1.min.js" ></script>
<script type= "text/javascript">
$(function(){
$( "#json").click(function (){
var url=this .href;
var args={};
$.post(url,args, function(data){
for(var i=0;i<data.length;i++){
alert( "lastName:"+data[i].lastName+",department:" +data[i].department.departmentName);
}
});
return false ;
});
});
</script>
三、處理請求
@ResponseBody
@RequestMapping( "/getEmployeesForJson")
public Collection<Employee> getEmployees() {
return employeeDao .getAll();
}
四、配置用於處理json的HttpMessageConverter
< mvc:annotation-driven ></mvc:annotation-driven>
顯示宣告:
</pre></div></div><div align="left" style="font-family: Cambria; orphans: 2; widows: 2;"><span style="font-family: Corbel;"><span style="font-size:18px;"></span></span><pre name="code" class="html"><mvc:annotation-driven>
<!-- 註冊處理 JSON 的轉換器 -->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
</mvc:message-converters>
</mvc:annotation-driven>
注意:要在JRE環境中新增 jackson-all-1.9.11.jar
----歡迎各位技術宅批評指正!---
相關文章
- 如何使用SpringMvc處理Rest異常SpringMVCREST
- SpringMVC異常處理SpringMVC
- springmvc 資料處理SpringMVC
- 【SpringMVC】HttpMessageConverter報文資訊轉換器SpringMVCHTTP
- 【SpringMVC】 4.2 異常處理SpringMVC
- SpringMVC請求處理流程SpringMVC
- SpringMVC處理模型資料SpringMVC模型
- springmvc處理ajax請求SpringMVC
- SpringMVC 統一異常處理SpringMVC
- SpringMVC(一)SpringMVC的處理流程、元件說明、搭建SpringMVC元件
- SpringMVC原始碼剖析(五)-訊息轉換器HttpMessageConverterSpringMVC原始碼HTTP
- springmvc原始碼 ---DispatcherServlet 處理請求SpringMVC原始碼Servlet
- SpringMVC:資料處理及跳轉SpringMVC
- SpringMVC異常的處理機制SpringMVC
- SpringMVC 解析(五)URI連結處理SpringMVC
- SpringMVC非同步處理的 5 種方式SpringMVC非同步
- 封裝springmvc處理ajax請求結果封裝SpringMVC
- SpringMVC入門學習---資料的處理SpringMVC
- Day133.異常處理 -SpringMVCSpringMVC
- SpringMVC學習系列(10) 之 異常處理SpringMVC
- HttpMessageConverterHTTP
- 八、SpringMVC--SpringMVC 表單標籤 和處理靜態資源SpringMVC
- SpringMVC請求處理過程原始碼簡析SpringMVC原始碼
- SpringMVC學習筆記10-異常處理SpringMVC筆記
- SpringMVC底層——請求引數處理流程描述SpringMVC
- SpringMVC 學習筆記(四) 處理模型資料SpringMVC筆記模型
- SpringMVC原始碼剖析5:訊息轉換器HttpMessageConverter與@ResponseBody註解SpringMVC原始碼HTTP
- 使用Hive處理WordCountHive
- SpringMVC原始碼分析:POST請求中的檔案處理SpringMVC原始碼
- SpringMVC處理請求頭、響應頭、編碼行為SpringMVC
- SpringMVC(四)-- springmvc的系統學習之檔案上傳、ajax&json處理SpringMVCJSON
- SpringMVC學習筆記6-指定處理請求型別SpringMVC筆記型別
- SpringMvc-10.14上傳、攔截器、異常處理SpringMVC
- SpringMVC【校驗器、統一處理異常、RESTful、攔截器】SpringMVCREST
- MySQL使用Batch批量處理MySqlBAT
- 使用Excel高效處理資料Excel
- 使用openpyxl處理表格資料
- 使用FFmpeg處理音視訊