<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
HttpMessageConverter 是報文資訊轉換器,作用有 2 個:
將請求報文轉換為Java物件:請求報文是從瀏覽器傳送到伺服器,傳送到伺服器中就是 request 物件
將Java物件轉換為響應報文:響應報文是伺服器響應給瀏覽器的,伺服器中用的java,瀏覽器不能解析java,所以要轉換成響應報文給瀏覽器。
其中,HttpMessageConverter 提供了兩個註解:@RequestBody,@ResponseBody。還有兩個型別:RequestEntity,ResponseEntity。
最常用的還是用來將Java物件轉換為響應報文的兩個:@ResponseBody和ResponseEntity。
至於獲取請求引數,或者請求頭什麼的,前面已經有過好幾種方法了,沒必要再使用這裡的 @RequestBody 和 RequestEntity。
@RequestBody可以獲取請求體,需要在控制器方法設定一個形參,使用@RequestBody進行標識,當前請求的請求體就會為當前註解所標識的形參賦值。
比如這有一個頁面表單,用來傳送請求。
<form th:action="@{/testRequestBody}" method="post"> 使用者名稱:<input type="text" name="username"> 密碼:<input type="password" name="password"> <input type="submit"> </form>
對應的有個控制器處理這個請求:
@RequestMapping("/testRequestBody") public String testRequestBody(@RequestBody String requestBody){ System.out.println("requestBody:"+requestBody); return "success"; }
這裡要補充一個 success.html 以供跳轉。
然後我們在表單中輸入 username=admin,password=123456,提交後,檢視控制檯的輸出:
requestBody:username=admin&password=123456
username=admin&password=123456這個就是請求體的內容了。
RequestEntity是封裝請求報文的一種型別,包含了請求頭和請求體。
使用時,需要在控制器方法的形參中設定該型別的形參,當前請求的請求報文就會賦值給該形參。
接著,就可以通過getHeaders()獲取請求頭資訊,通過getBody()獲取請求體資訊。
複製一下上面的表單,請求地址換一下:
<form th:action="@{/testRequestEntity}" method="post"> 使用者名稱:<input type="text" name="username"><br> 密碼:<input type="password" name="password"><br> <input type="submit"> </form>
然後補充一個控制器方法:
@RequestMapping("/testRequestEntity") public String testRequestEntity(RequestEntity<String> requestEntity){ System.out.println("請求頭:"+requestEntity.getHeaders()); System.out.println("請求體:"+requestEntity.getBody()); return "success"; }
輸入表單提交測試一下:
在不使用@ResponseBody這個註解的時候,使用servlet api 中 HttpServletResponse 也是可以響應給瀏覽器的。
比如:
@RequestMapping("/testResponse") public void testResponse(HttpServletResponse response) throws IOException { response.getWriter().print("hello, response"); }
前端寫一個超連結測試一下:
<a th:href="@{/testResponse}" rel="external nofollow" >使用HttpServletResponse響應瀏覽器</a>
點選超連結。
使用@ResponseBody則可以標識一個控制器方法,可以將該方法的返回值直接作為響應報文的響應體響應到瀏覽器。
@RequestMapping("/testResponseBody") @ResponseBody public String testResponseBody(){ return "success"; }
這裡的控制器方法增加了@ResponseBody:
繼續增加超連結測試一下:
<a th:href="@{/testResponseBody}" rel="external nofollow" >使用 @testResponseBody 響應瀏覽器</a>
注意,為了區分效果,success.html 裡我修改下內容:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>這是 success.html 頁面</h1> </body> </html>
OK,現在點選超連結,頁面顯示 success。
接著,我去掉控制器裡的 @ResponseBody,再重新部署點選超連結試試。
跳轉到了 success.html 頁面。
所以,使用@ResponseBody還是很方便的,我們需要返回給瀏覽器什麼資料,直接在控制器方法裡 return 即可。
上面範例響應的是個字串,對於瀏覽器來說就直接顯示了。如果我要響應一個物件呢?
比如,新建一個 User 類,設定好構造方法,set 和 get:
public class User { private Integer id; private String username; private String password; private Integer age; private String sex; ... ...
編寫控制器:
@RequestMapping("/testResponseUser") @ResponseBody public User testResponseUser() { return new User(1001, "大周", "123456", 11, "男"); }
直接返回一個 User 物件。
為了測試,繼續在前端頁面增加一個超連結:
<a th:href="@{/testResponseUser}" rel="external nofollow" >響應瀏覽器User物件</a>
重新部署,點選測試,報錯了。
這裡還需要轉換的步驟,把 User 物件轉換成 json 格式的字串。
在 pom.xml 中加入依賴 jackson:
<!--物件轉化json 響應給瀏覽器--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.1</version> </dependency>
另外,檢查一下 springMVC.xml 組態檔中的註解驅動是否開啟:
<!--開啟 mvc 的註解驅動--> <mvc:annotation-driven />
重新部署,點選超連結。
響應正常。
使用ajax傳送請求,跟上面點選超連結傳送請,也只是傳送請求方式不同而已,對於伺服器來說,都是一樣處理。
ajax的優點就是頁面不重新整理的情況下,可以與伺服器進行互動。
繼續在前端頁面增加內容,新增一個超連結,繫結一個點選事件@click:
<div id="app"> <a th:href="@{/testAjax}" rel="external nofollow" @click="testAjax">springMVC 處理ajax</a><br> </div>
這裡需要用到靜態資源 vue.min.js 和 axios.min.js,下載後放到webappstaticjs下。
通過vue和axios處理點選事件:
<!--引入--> <script type="text/javascript" th:src="@{/static/js/vue.min.js}"></script> <script type="text/javascript" th:src="@{/static/js/axios.min.js}"></script> <script> new Vue({ el: "#app", methods: { testAjax: function (event) { axios({ method: "post", url: event.target.href, params: { username: "admin", password: "123456" } }).then(function (response) { // 請求處理成功後要執行的 alert(response.data) // response.data 獲取到響應的資料 }); event.preventDefault(); // 取消超連結的預設行為 } } }); </script>
增加對於的請求控制器:
@RequestMapping("/testAjax") @ResponseBody public String testAjax(String username, String password) { System.out.println("username:" + username + ",password:" + password); return "hello, Ajax"; }
重新部署之前,記得maven 重新打包一下。
另外,springMVC 組態檔中記得放開靜態資源的存取:
<!--放開靜態資源的存取--> <mvc:default-servlet-handler />
重新部署,點選超連結。
這是以後會經常用的註解。
@RestController註解是 springMVC 提供的一個複合註解。
標識在控制器的類上,就相當於為類新增了@Controller註解,並且為其中的每個方法新增了@ResponseBody註解。
ResponseEntity用於控制器方法的返回值型別。
該控制器方法的返回值就是響應到瀏覽器的響應報文,後面的下載上傳檔案的範例中會使用到。
以上就是SpringMVC HttpMessageConverter報文資訊轉換器的詳細內容,更多關於SpringMVC HttpMessageConverter的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45