javascript
最全面的SpringMVC教程(四)——Controller 与 RestFul
前言
本文為 【SpringMVC教程】Controller 與 RestFul 相關(guān)內(nèi)容介紹,具體將對控制器Controller,實現(xiàn)Controller接口,使用注解@Controller,RequestMapping及RestFul 風(fēng)格(包括:Rest架構(gòu)的主要原則、什么是Restful、數(shù)據(jù)過濾、RequestMapping中指定請求方法、Ajax方式發(fā)送請求)等進(jìn)行詳盡介紹~
📌博主主頁:小新要變強(qiáng) 的主頁
👉Java全棧學(xué)習(xí)路線可參考:【Java全棧學(xué)習(xí)路線】最全的Java學(xué)習(xí)路線及知識清單,Java自學(xué)方向指引,內(nèi)含最全Java全棧學(xué)習(xí)技術(shù)清單~
👉算法刷題路線可參考:算法刷題路線總結(jié)與相關(guān)資料分享,內(nèi)含最詳盡的算法刷題路線指南及相關(guān)資料分享~
👉Java微服務(wù)開源項目可參考:企業(yè)級Java微服務(wù)開源項目(開源框架,用于學(xué)習(xí)、畢設(shè)、公司項目、私活等,減少開發(fā)工作,讓您只關(guān)注業(yè)務(wù)!)
??本文上接:最全面的SpringMVC教程(三)——跨域問題
目錄
文章標(biāo)題
- 前言
- 目錄
- 一、控制器Controller
- 二、實現(xiàn)Controller接口
- 三、使用注解@Controller
- 四、RequestMapping
- 五、RestFul 風(fēng)格
- 1??Rest架構(gòu)的主要原則
- 2??什么是Restful
- 3??數(shù)據(jù)過濾
- 4??RequestMapping中指定請求方法
- 5??Ajax方式發(fā)送請求
- 后記
一、控制器Controller
- 控制器復(fù)雜提供訪問應(yīng)用程序的行為,通常通過接口定義或注解定義兩種方法實現(xiàn)
- 控制器負(fù)責(zé)解析用戶的請求并將其轉(zhuǎn)換為一個模型
- 在Spring MVC中一個控制器類可以包含多個方法
- 在Spring MVC中,對于Controller的配置方式有很多種
二、實現(xiàn)Controller接口
Controller是一個接口,在org.springframework.web.servlet.mvc包下,接口中只有一個方法:
//實現(xiàn)該接口的類獲得控制器功能 public interface Controller {//處理請求且返回一個模型與視圖對象ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception; }測試:
🍀(1)新建一個Moudle:springmvc-controller ,mvc的配置文件只留下 視圖解析器。
🍀(2)編寫一個Controller類,ControllerTest1。
//定義控制器 //注意點(diǎn):不要導(dǎo)錯包,實現(xiàn)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;} }🍀(3)到Spring配置文件中注冊請求的bean;name對應(yīng)請求路徑;class對應(yīng)處理請求的類
<bean name="/t1" class="com.kuang.controller.ControllerTest1"/>🍀(4)編寫前端test.jsp,要在WEB-INF/jsp目錄下編寫,對應(yīng)我們的視圖解析器
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Kuangshen</title> </head> <body>${msg} </body> </html>🍀(5)配置Tomcat運(yùn)行測試,沒有項目發(fā)布名配置的就是一個 / ,所以請求不用加項目名
說明:
- 實現(xiàn)接口Controller定義控制器是較老的辦法
- 缺點(diǎn)是:一個控制器中只有一個方法,如果要多個方法則需要定義多個Controller;定義的方式比較麻煩。
三、使用注解@Controller
- @Controller注解類型用于聲明Spring類的實例是一個控制器(在講IOC時還提到了另外3個注解);
- Spring可以使用掃描機(jī)制來找到應(yīng)用程序中所有基于注解的控制器類,為了保證Spring能找到你的控制器,需要在配置文件中聲明組件掃描。
增加一個ControllerTest2類,使用注解實現(xiàn):
//@Controller注解的類會自動添加到Spring上下文中 @Controller public class ControllerTest2{//映射訪問路徑@RequestMapping("/t2")public String index(Model model){//Spring MVC會自動實例化一個Model對象用于向視圖中傳值model.addAttribute("msg", "ControllerTest2");//返回視圖位置return "test";} }運(yùn)行tomcat測試:
可以發(fā)現(xiàn),我們的兩個請求都可以指向一個視圖,但是頁面結(jié)果的結(jié)果是不一樣的,從這里可以看出視圖是被復(fù)用的,而控制器與視圖之間是弱偶合關(guān)系。
四、RequestMapping
@RequestMapping注解用于映射url到控制器類或一個特定的處理程序方法。可用于類或方法上。用于類上,表示類中的所有響應(yīng)請求的方法都是以該地址作為父路徑。
為了測試結(jié)論更加準(zhǔn)確,我們可以加上一個項目名進(jìn)行測試。
🍀@RequestMapping只注解在方法上面。
@Controller public class TestController {@RequestMapping("/h1")public String test(){return "test";} }訪問路徑: http://localhost:8080 / 項目名 / h1
🍀@RequestMapping同時注解在類與方法上
@Controller @RequestMapping("/admin") public class TestController {@RequestMapping("/h1")public String test(){return "test";} }訪問路徑: http://localhost:8080 / 項目名/ admin /h1 , 需要先指定類的路徑再指定方法的路徑。
五、RestFul 風(fēng)格
Restful是一種風(fēng)格,可以遵循,也可以不遵循,但是現(xiàn)在它已經(jīng)變成主流。
1??Rest架構(gòu)的主要原則
- 網(wǎng)絡(luò)上的所有事物都被抽象為資源。
- 每個資源都有一個唯一的資源標(biāo)識符。
- 同一個資源具有多種表現(xiàn)形式他可能是xml,也可能是json等。
- 對資源的各種操作不會改變資源標(biāo)識符。
- 所有的操作都是無狀態(tài)的。
- 符合REST原則的架構(gòu)方式即可稱為RestFul。
2??什么是Restful
Restful web service是一種常見的rest的應(yīng)用,是遵守了rest風(fēng)格的web服務(wù),rest式的web服務(wù)是一種ROA(The Resource-Oriented Architecture)(面向資源的架構(gòu)).
在Restful風(fēng)格中,我們將互聯(lián)網(wǎng)的資源抽象成資源,將獲取資源的方式定義為方法,從此請求再也不止get和post了:
| 查詢所有用戶 | /user/findAll | GET /user |
| 查詢編號為1的用戶 | /user/findById?id=1 | GET /user/1 |
| 新增一個用戶 | /user/save | POST /user |
| 修改編號為1的用戶 | /user/update | PUT /user/1 |
| 刪除編號為1的用戶 | /user/delete?id=1 | DELETE /user/1 |
Spring MVC 對 RESTful應(yīng)用提供了以下支持:
- 利用@RequestMapping 指定要處理請求的URI模板和HTTP請求的動作類型
- 利用@PathVariable將URI請求模板中的變量映射到處理方法參數(shù)上
- 利用Ajax,在客戶端發(fā)出PUT、DELETE動作的請求
3??數(shù)據(jù)過濾
我們想獲取所有用戶,使用如下url即可/user。但是真是場景下,我們可能需要需要一些條件進(jìn)行過濾:
例如:我們需要查詢名字叫張三的前10條數(shù)據(jù),使用以下場景即可:
/user?name=jerry&pageSize=10&page=1查詢的url不變,變的是條件,我們只需要同伙url獲取對應(yīng)的參數(shù)就能實現(xiàn)復(fù)雜的多條件查詢。
4??RequestMapping中指定請求方法
@RequestMapping(value = "/{id}", method = RequestMethod.GET) @RequestMapping(value = "/add", method = RequestMethod.POST) @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) @RequestMapping(value = "/{id}", method = RequestMethod.PUT)當(dāng)然還有更好用的:
@GetMapping("/user/{id}") @PostMapping("/user") @DeleteMapping("/user/{id}") @PutMapping("/user/{id}")5??Ajax方式發(fā)送請求
可以采用Ajax方式發(fā)送PUT和DELETE請求。
我們可以使用當(dāng)下比較流行的axios組件測試:
<script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script>const instance = axios.create({baseURL: 'http://127.0.0.1:8088/app/'});// 為給定 ID 的 user 創(chuàng)建請求instance.get('goods').then(function (response) {console.log(response);}).catch(function (error) {console.log(error);});instance.get('goods/1').then(function (response) {console.log(response);}).catch(function (error) {console.log(error);});instance.post('goods', {name: '洗發(fā)露',price: 25454}).then(function (response) {console.log(response);}).catch(function (error) {console.log(error);});instance.put('goods', {name: '洗發(fā)露',price: 25454}).then(function (response) {console.log(response);}).catch(function (error) {console.log(error);});instance.delete('goods/1').then(function (response) {console.log(response);}).catch(function (error) {console.log(error);});</script>使用jquery同樣可以發(fā)送如下請求:
$.ajax( {type : "GET",url : "http://localhost:8080/springmvc/user/rest/1",dataType : "json",success : function(data) {console.log("get請求!---------------------")console.log(data)} });$.ajax( {type : "DELETE",url : "http://localhost:8080/springmvc/user/rest/1",dataType : "json",success : function(data) {console.log("delete請求!---------------------")console.log(data)} });$.ajax( {type : "put",url : "http://localhost:8080/springmvc/user/rest/1",dataType : "json",data: {id:12,username:"楠哥",password:"123"},success : function(data) {console.log("get請求!---------------------")console.log(data)} });$.ajax( {type : "post",url : "http://localhost:8080/springmvc/user/rest",dataType : "json",data: {id:12,username:"楠哥",password:"123"},success : function(data) {console.log("get請求!---------------------")console.log(data)} });后記
👉Java全棧學(xué)習(xí)路線可參考:【Java全棧學(xué)習(xí)路線】最全的Java學(xué)習(xí)路線及知識清單,Java自學(xué)方向指引,內(nèi)含最全Java全棧學(xué)習(xí)技術(shù)清單~
👉算法刷題路線可參考:算法刷題路線總結(jié)與相關(guān)資料分享,內(nèi)含最詳盡的算法刷題路線指南及相關(guān)資料分享~
總結(jié)
以上是生活随笔為你收集整理的最全面的SpringMVC教程(四)——Controller 与 RestFul的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cpython源码分析03(*)_简要总
- 下一篇: IDEA2022 搭建SpringMVC