1.@RequestBody (自動將請求的數據封裝為對象)
作用:
@RequestBody注解用於讀取http請求的內容(字符串),通過springmvc提供的HttpMessageConverter接口將讀到的內容(json數據)轉換為java對象並綁定到Controller方法的參數上。
傳統的請求參數:
itemEdit.action?id=1&name=zhangsan&age=12
現在的請求參數:
使用POST請求,在請求體里面加入json數據
{
"id": 1,
"name": "測試商品",
"price": 99.9,
"detail": "測試商品描述",
"pic": "123456.jpg"
}
2.@ResponseBody
作用:
@ResponseBody注解用於將Controller的方法返回的對象,通過springmvc提供的HttpMessageConverter接口轉換為指定格式的數據如:json,xml等,通過Response響應給客戶端
總結:
在controller中我們可以在方法上面添加@ResponseBody注解,這樣我們返回實體對象或者字符串時,就會自動轉換成json對象傳給前端。在spring4.0后,@ResponseBody又可以加在類上,表示該類中的所有方法都加有@ResponseBody,很方便。另一種方式是使用@RestController注解在類上,作用等於@Controller與@ResponseBody同時加在類上,這也是最方便的一種方式。要讓@ResponseBody在類上也起作用,需要在springmvc配置文件中加上<mvc:annotation-driven />這一行配置才可以。而@ResponseBody使用在方法上,則不用添加該配置也可以使用。也就是說springmvc默認只支持@ResponseBody在方法上使用,不支持在類上的使用。
在實際項目中,我們可能會將后台管理項目與app的后台放在一個項目里面,這樣就等於是兩個后台共用一套springmvc的配置文件。但是app后台的controller都是返回json信息的,而后台管理是用來返回jsp界面的,會有點混亂。這種情況下,我們需要同時配置<mvc:annotation-driven />和viewResolver,這樣的話,app后台的controller都加上@RestController即可,而后台管理的controller則不要@ResponseBody和@RestController,只返回字符串格式的jsp文件名即可。這樣就可以兩不耽誤,兩個項目合在一起開發了。
查看RestController的源碼: (是一個組合注解)
/* * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.web.bind.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.stereotype.Controller; /** * A convenience annotation that is itself annotated with {@link Controller @Controller} * and {@link ResponseBody @ResponseBody}. * <p> * Types that carry this annotation are treated as controllers where * {@link RequestMapping @RequestMapping} methods assume * {@link ResponseBody @ResponseBody} semantics by default. * * @author Rossen Stoyanchev * @author Sam Brannen * @since 4.0 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Controller @ResponseBody public @interface RestController { /** * The value may indicate a suggestion for a logical component name, * to be turned into a Spring bean in case of an autodetected component. * @return the suggested component name, if any * @since 4.0.1 */ String value() default ""; }
例如:
package cn.xm.jwxt.controller.common; import cn.xm.jwxt.bean.common.Dictionary; import cn.xm.jwxt.service.common.DictionaryService; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import java.sql.SQLException; import java.util.List; /** * 字典controller */ @RequestMapping("/dictionary")//基本的映射路徑 //@ResponseBody//所有方法返回都是以JSON形式返回 //@Controller//控制層代碼 @RestController//這個注解等於@ResponseBody+@Controller public class DictionaryController { @Autowired private DictionaryService dictionaryService; private Logger logger = Logger.getLogger(DictionaryController.class); @RequestMapping("/getDictionaryTree") public List<Dictionary> getDictionaryTrees() { List<Dictionary> dictionaryTree = null; try { dictionaryTree = dictionaryService.getDictionaryTree(); } catch (SQLException e) { logger.error("查詢字典樹出錯!",e); } return dictionaryTree; } }
3.請求json,響應json實現:
3.1. 加入jar包
如果需要springMVC支持json,必須加入json的處理jar
我們使用Jackson這個jar,如下圖:

3.1 JSP頁面ajax請求
<script type="text/javascript"> $(function(){ var param='{"id": 1,"name": "測試商品","price": 99.9,"detail": "測試商品描述","pic": "123456.jpg"}'; $.ajax({ url:"${pageContext.request.contextPath }/json.action", async:true, type:"POST", data:param, contentType : "application/json;charset=UTF-8",//發送數據的格式 success: function(data){ alert(data.name); }, error:function(){ alert("請求失敗"); }, dataType:"json" //回掉數據格式 }); }) </script>
3.2.處理ajax請求的controller
@RequestMapping(value = "/json.action") public @ResponseBody Items json(@RequestBody Items items){ // 設置@RequestBody后子發動將ajax請求封裝為對象 System.out.println(items); // 設置@ResponseBody后自動將返回的數據封裝為ajax return items; }
3.3 配置json轉換器
如果不使用注解驅動<mvc:annotation-driven />,就需要給處理器適配器配置json轉換器,參考之前學習的自定義參數綁定。
在springmvc.xml配置文件中,給處理器適配器加入json轉換器:
<!--處理器適配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> </list> </property> </bean>
