天天看點

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

一、@Controller & @RestController

這兩個是 Spring MVC 給我們提供的常用控制器,這兩個東西一般用在類上,通過它倆,可以聲明出這個類是控制器類。

控制器會交由給 Spring 容器做管理。

它倆相同的是他們都是可以聲明控制器,不同的是 RestController 是一個無頁面傳回的控制器。

RestController = ResponseBody + Controller

如果我們使用了 RestController,那麼我們就沒有辦法傳回到頁面,隻能給請求傳回資料。

類似于 ajax 的請求一樣,不做頁面跳轉,僅擷取資料。

寫個例子感受一下。

修改一下之前的 hello.html 

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

然後建立兩個控制器

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView
Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

ok哈,然後我們在修改一下 web.xml 

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

啟動項目,我們來進行測試

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

可以看到啊,是正常通路,現在點選 Controller

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

可以看到哈,跳轉了,直接跳轉到了我們的 hello.jsp 中了。

傳回再去點選 RestController

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

可以看到,直接将這個字元串傳回回來了,并沒有跳轉頁面。

後期我們可以使用這個 RestController 做異步互動,沒有頁面傳回,直接傳回資料。

RestController 的出現是為了讓我們程式員少寫 @ResponseBody

二、@RequestBody & @RequestParam

在之前學習 Servlet 的時候,我們使用 request.getParameter 接收參數,可以說是比較費勁了,得需要一個一個寫,引入了這個 SpringMVC 之後,我們就不需要寫那麼多 request 了。

@RequestBody 主要是接收請求體中的參數。拿到從前端頁面傳遞來的請求參數後,Spring MVC 會自動幫我們解析,并且綁定到我們的實體上去。

@RequestParam 主要是接收請求的 url 中的參數。同樣哈,這個也會自動幫我們綁定。

來感受一下

我們使用 Postman 來進行接口調試,不會 Postman 可以看我的部落格,簡單學習一下:postman 使用詳解

@RequestBody

先去建立一個實體,我們一會要用(順便自己弄一下 get、set、toString)

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

然後我們開始寫請求的 API 接口

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

我們就弄個簡單的輸出,就不弄 service 了。

當然,弄好這些還是不可以的,因為我們還需要三個 jar 包,沒有的話會報錯。

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

就這三個,自己去 maven 倉庫下載下傳,然後弄到項目中的 lib 目錄中。

然後我們通過 Postman 調試一下。啟動項目,打開 Postman。

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

然後問我們點選 Send

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

可以看到,伺服器端報錯了,我們看看錯誤。

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

大緻的意思就是我們的這個日期傳遞進來不合适,是以我們需要進行入參轉換。打開 Student 這個類,然後我們在日期上加注解。

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

加上之後,我們從新啟動 tomcat,然後再來用 Postman 請求~~

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView
Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

是OK的哈,我們把參數都傳遞進來了~~~

當然哈,不相信我們可以去掉這個 @RequestBody 這個注解,從新啟動項目,再試試

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

可以看到哈,沒有任何東西~

@RequestParam

這個其實比較簡單,我們也來寫一個例子

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

我們從新啟動伺服器,測試一下

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

send 一下

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

是沒有問題的哈。

但是,如果我們沒有傳遞 id,我們再來看看這個方法

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView
Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

伺服器端報錯了。這個是因為伺服器端預設是我們一定會傳遞 id 這個參數的,如果沒有傳遞那麼久會報錯的。

當然哈,Spring MVC 早就給你想到解決方案了,來看一下。

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

加這個 required 是為了讓規定這個 id 的參數可以不是必須的,當我們設定成 false,也就是說我們可以傳遞,可以不傳遞,預設的情況是 true,是必須要傳遞的。

這裡我們從新啟動伺服器,再來測試一下

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView
Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

可以的,是沒有問題的哈。

三、ModelAndView

這個 ModelAndView 是我們以後也比較常用的一個類,這個類是用來傳回視圖還有資料的。

來寫一個例子感受一下。

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

ModelAndView 中有一個 addObject 的方法,這個方法類似 HttpServletRequest 中的 setAttribute 方法,前面的參數是 key,後面的是 value。

ModelAndView 中還有一個方法是 setViewName,這個是傳回的視圖的名字,這裡我們隻需要填寫傳回的視圖的名稱即可,因為規則我們在 springmvc.xml 中配置了。

到時候我們請求 路徑/mav/test 之後會帶着兩個傳回的請求值,跳轉到 mav.jsp 頁面。

我們再來建立一個 mav.jsp 頁面,在 WebContent 下面。

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

頁面中擷取我們後端傳遞過來的值同樣是使用 EL 表達式。

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

從新啟動伺服器,來測試一下。

Spring & Spring MVC 8. Spring MVC 控制器 & 映射器一、@Controller & @RestController二、@RequestBody & @RequestParam三、ModelAndView

是OK的,沒有問題。

本篇東西有點多,大家自己好好聯系一下,因為這些東西以後我們都常用。

最近我的個人網站在從新搭建,準備換架構,如果有小夥伴有什麼提議,加點什麼内容,可以直接私聊我的 CSDN 賬号,或者 QQ :2100363119

繼續閱讀