Spring mvc Controller和RestFul原理解析
控制器Controller
- 控制器複雜提供訪問應用程式的行為,通常通過介面定義或註解定義兩種方法實現。
- 控制器負責解析使用者的請求並將其轉換為一個模型。
- 在Spring MVC中一個控制器類可以包含多個方法
- 在Spring MVC中,對於Controller的配置方式有很多種
實現Controller介面
Controller是一個介面,在org.springframework.web.servlet.mvc包下,介面中只有一個方法;
//實現該介面的類獲得控制器功能 public interface Controller { //處理請求且返回一個模型與檢視物件 ModelAndView handleRequest(HttpServletRequest var1,HttpServletResponse var2) throws Exception; }
測試
編寫一個Controller類,ControllerTest1
// 定義控制器 // 注意點:不要導錯包,實現Controller介面,重寫方法; public class ControllerTest1 implements Controller { public ModelAndView handleRequest(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) throws Exception { //返回一個模型檢視物件 ModelAndView mv = new ModelAndView(); mv.addObject("msg","Test1Controller"); mv.setViewName("test"); return mv; } }
編寫完畢後,去Spring配置檔案中註冊請求的bean;name對應請求路徑,class對應處理請求的類
<bean name="/t1" class="com.xiaohua.controller.ControllerTest1"/>
編寫前端test.jsp,注意在WEB-INF/jsp目錄下編寫,對應我們的檢視解析器
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Kuangshen</title> </head> <body> ${msg} </body> </html>
配置Tomcat執行測試,我這裡沒有專案釋出名配置的就是一個 / ,所以請求不用加專案名,OK!
說明:
實現介面Controller定義控制器是較老的辦法
缺點是:一個控制器中只有一個方法,如果要多個方法則需要定義多個Controller;定義的方式比較麻煩;
使用註解@Controller
@Controller註解型別用於宣告Spring類的例項是一個控制器(在講IOC時還提到了另外3個註解);
Spring可以使用掃描機制來找到應用程式中所有基於註解的控制器類,為了保證Spring能找到你的控制器,需要在配置檔案中宣告元件掃描。
<!-- 自動掃描指定的包,下面所有註解類交給IOC容器管理 -->
<context:component-scan base-package="com.xiaohua.controller"/>
增加一個ControllerTest2類,使用註解實現;
// @Controller註解的類會自動新增到Spring上下文中 @Controller public class ControllerTest2{ //對映訪問路徑 @RequestMapping("/t2") public String index(Model model){ //Spring MVC會自動例項化一個Model物件用於向檢視中傳值 model.addAttribute("msg","ControllerTest2"); //返回檢視位置 return "test"; } }
執行tomcat測試
可以發現,我們的兩個請求都可以指向一個檢視,但是頁面結果的結果是不一樣的,從這裡可以看出檢視是被複用的,而控制器與檢視之間是弱偶合關係。
RequestMapping
@RequestMapping註解用於對映url到控制器類或一個特定的處理程式方法。可用於類或方法上。用於類上,表示類中的所有響應請求的方法都是以該地址作為父路徑。
為了測試結論更加準確,我們可以加上一個專案名測試 myweb
只註解在方法上面
@Controller public class TestController { @RequestMapping("/h1") public String test(){ return "test"; } }
訪問路徑:http://localhost:8080 / 專案名 / h1
同時註解類與方法
@Controller @RequestMapping("/admin") public class TestController { @RequestMapping("/h1") public String test(){ return "test"; } }
訪問路徑:http://localhost:8080 / 專案名/ admin /h1,需要先指定類的路徑再指定方法的路徑;
RestFul風格
Restful就是一個資源定位及資源操作的風格。不是標準也不是協議,只是一種風格。基於這個風格設計的軟體可以更簡潔,更有層次,更易於實現快取等機制。
功能
- 資源:網際網路所有的事物都可以被抽象為資源
- 資源操作:使用POST、DELETE、PUT、GET,使用不同方法對資源進行操作。
- 分別對應 新增、 刪除、修改、查詢。
傳統方式操作資源 :通過不同的引數來實現不同的效果!方法單一,post 和 get
- http://127.0.0.1/item/queryItem.action?id=1 查詢,GET
- http://127.0.0.1/item/saveItem.action 新增,POST
- http://127.0.0.1/item/updateItem.action 更新,POST
- http://127.0.0.1/item/deleteItem.action?id=1 刪除,GET或POST
使用RESTful操作資源 : 可以通過不同的請求方式來實現不同的效果!如下:請求地址一樣,但是功能可以不同!
- http://127.0.0.1/item/1 查詢,GET
- http://127.0.0.1/item 新增,POST
- http://127.0.0.1/item 更新,PUT
- http://127.0.0.1/item/1 刪除,DELETE
學習測試
在新建一個類 RestFulController
@Controller public class RestFulController { }
在Spring MVC中可以使用 @PathVariable 註解,讓方法引數的值對應繫結到一個URI模板變數上。
@Controller public class RestFulController { //對映訪問路徑 @RequestMapping("/commit/{p1}/{p2}") public String index(@PathVariable int p1,@PathVariable int p2,Model model){ int result = p1+p2; //Spring MVC會自動例項化一個Model物件用於向檢視中傳值 model.addAttribute("msg","結果:"+result); //返回檢視位置 return "test"; } }
我們來測試請求檢視下
使用路徑變數的好處?
- 使路徑變得更加簡潔;
- 獲得引數更加方便,框架會自動進行型別轉換。
- 通過路徑變數的型別可以約束訪問引數,如果型別不一樣,則訪問不到對應的請求方法,如這裡訪問是的路徑是/commit/1/a,則路徑與方法不匹配,而不會是引數轉換失敗。
我們來修改下對應的引數型別,再次測試
//對映訪問路徑 @RequestMapping("/commit/{p1}/{p2}") public String index(@PathVariable int p1,@PathVariable String p2,Model model){ String result = p1+p2; //Spring MVC會自動例項化一個Model物件用於向檢視中傳值 model.addAttribute("msg","結果:"+result); //返回檢視位置 return "test"; }
使用method屬性指定請求型別
用於約束請求的型別,可以收窄請求範圍。指定請求謂詞的型別如GET,POST,HEAD,OPTIONS,PUT,PATCH,DELETE,TRACE等
我們來測試一下:
增加一個方法
//對映訪問路徑,必須是POST請求 @RequestMapping(value = "/hello",method = {RequestMethod.POST}) public String index2(Model model){ model.addAttribute("msg","hello!"); return "test"; }
我們使用瀏覽器位址列進行訪問預設是Get請求,會報錯405:
如果將POST修改為GET則正常了;
//對映訪問路徑,必須是Get請求 @RequestMapping(value = "/hello",method = {RequestMethod.GET}) public String index2(Model model){ model.addAttribute("msg","hello!"); return "test"; }
小結:
Spring MVC 的 @RequestMapping 註解能夠處理 HTTP 請求的方法,比如 GET,DELETE 以及 PATCH。
所有的位址列請求預設都會是 HTTP GET 型別的。
方法級別的註解變體有如下幾個: 組合註解
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
- @PatchMapping
- @GetMapping 是一個組合註解
它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一個快捷方式。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。