SpringMVC處理Json-使用 HttpMessageConverter

TZQ_DO_Dreamer發表於2014-12-06
一、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


----歡迎各位技術宅批評指正!---


相關文章