目錄
一、RESTful風(fēng)格支持
1.1 RESTful風(fēng)格介紹
1.2 postman使用
二、@PathVariable
2.1?實(shí)例程序
2.2 測(cè)試結(jié)果?
三、@PostMapping、@GetMapping、@PutMapping、@DeleteMapping
四、@HiddenHttpMethodFilter
4.1?在web.xml配置過濾器
4.2?控制器方法
4.3?JSP頁面
4.4?測(cè)試結(jié)果
往期專欄&文章相關(guān)導(dǎo)讀?
1. Maven系列專欄文章
2. Mybatis系列專欄文章
3. Spring系列專欄文章
4. Spring MVC系列專欄文章?
一、RESTful風(fēng)格支持
1.1 RESTful風(fēng)格介紹
RESTful風(fēng)格是一種URL路徑的設(shè)計(jì)風(fēng)格。在RESTful風(fēng)格的URL路徑中,網(wǎng)絡(luò)上的任意數(shù)據(jù)都可以看成一個(gè)資源,它可以是一段文本、一張圖片,也可以是一個(gè)Java對(duì)象。而每個(gè)資源都會(huì)占據(jù)一個(gè)網(wǎng)絡(luò)路徑,無論對(duì)該資源進(jìn)行增刪改查,訪問的路徑是一致的。
傳統(tǒng)URL:
- 查找id為1的學(xué)生:
- http://localhost:8080/student/findById?id=30
- 刪除id為1的學(xué)生:
- http://localhost:8080/student/deleteById?id=30
- RESTful風(fēng)格URL:
- 查找id為30的學(xué)生:
- http://localhost:8080/student/30
- 刪除id為30的學(xué)生:
- http://localhost:8080/student/30
那么如何區(qū)分對(duì)該資源是哪一種操作?通過請(qǐng)求方式不同,判斷進(jìn)行的是什么操作。
之前我們學(xué)過兩種請(qǐng)求方式,GET請(qǐng)求和POST請(qǐng)求,而訪問RESTful風(fēng)格的URL一共有四種請(qǐng)求方式:
- GET請(qǐng)求:查詢操作
- POST請(qǐng)求:新增操作
- DELETE請(qǐng)求:刪除操作
- PUT請(qǐng)求:修改操作
RESTful風(fēng)格URL:
- 查找id為30的學(xué)生:
- http://localhost:8080/student/30 GET方式請(qǐng)求
- 刪除id為30的學(xué)生:
- http://localhost:8080/student/30 DELETE方式請(qǐng)求
RESTful風(fēng)格的優(yōu)點(diǎn):
結(jié)構(gòu)清晰、符合標(biāo)準(zhǔn)、易于理解、擴(kuò)展方便。?
1.2 postman使用
默認(rèn)情況下瀏覽器是無法發(fā)送DELETE請(qǐng)求和PUT請(qǐng)求的,我們可以使用Postman工具發(fā)送這些請(qǐng)求。這里我已經(jīng)把該工具上傳到我的資源里面去了,有需要的讀者可以去下載:
點(diǎn)擊new-collection創(chuàng)建請(qǐng)求集合?
添加請(qǐng)求?
注:那里是點(diǎn)擊發(fā)送,右邊的才是點(diǎn)擊保存
保存請(qǐng)求到集合,以后可以隨時(shí)發(fā)送該請(qǐng)求
測(cè)試:
OK,這里的name加了@ModelAttribute注解,因此是從model中獲取的?,并不是從請(qǐng)求路徑上面獲取的。
二、@PathVariable
作用:在RESTful風(fēng)格的URL中獲取占位符的值
位置:方法參數(shù)前
屬性:
value:獲取哪個(gè)占位符的值作為參數(shù)值,如果占位符和參數(shù)名相同,可以省略該屬性。
2.1?實(shí)例程序
package com.example.controller;
import com.example.domain.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
@Controller
@RequestMapping("/student")
// 模擬學(xué)生的增刪改查控制器
public class StudentController {
// 路徑的{id}表示占位符,最后會(huì)封裝到方法的參數(shù)中使用
// 刪除學(xué)生
@RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
public String deleteStudent(@PathVariable("id") int id, HttpServletRequest request){
System.out.println("刪除id為"+id+"的學(xué)生");
String str = "刪除id為"+id+"的學(xué)生";
request.setAttribute("delete",str);
return "student";
}
// 如果占位符和參數(shù)名相同,可以省略@PathVariable的value屬性
// 根據(jù)id查詢學(xué)生
@RequestMapping(value = "/{id}",method = RequestMethod.GET)
public String findStudentById(@PathVariable int id,HttpServletRequest request){
request.setAttribute("get","根據(jù)id查詢學(xué)生:"+id);
System.out.println("根據(jù)id查詢學(xué)生\t"+id);
return "student";
}
// 新增學(xué)生
@RequestMapping(value = "/{id}",method = RequestMethod.POST)
public String addStudent(@PathVariable int id, Student student, HttpServletRequest request){
request.setAttribute("add",student.toString());
System.out.println("新增學(xué)生:"+student+"\t"+id);
return "student";
}
// 修改學(xué)生
@RequestMapping(value = "/{id}",method = RequestMethod.PUT)
public String updateStudent(@PathVariable int id,Student student,HttpServletRequest request){
System.out.println("修改學(xué)生\t"+id+"\t"+student);
request.setAttribute("update","修改學(xué)生:"+student);
return "student";
}
}
JSP頁面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>student</title>
</head>
<body>
<h1>Add:${requestScope.add}</h1>
<h1>Delete:${requestScope.delete}</h1>
<h1>Update:${requestScope.update}</h1>
<h1>Get:${requestScope.get}</h1>
</body>
</html>
2.2 測(cè)試結(jié)果?
訪問方式:
新增學(xué)生:POST http://localhost:8080/student/1?name=LYL&sex=男
修改學(xué)生:PUT http://localhost:8080/student/1?name=LYL&sex=女
刪除學(xué)生:DELETE http://localhost:8080/student/1
查詢學(xué)生:GET http://localhost:8080/student/1
?OK,可以看到都是頁面都是隨著不同的請(qǐng)求方式,出來也頁面也不一樣。
看一下控制臺(tái)是否打印對(duì)應(yīng)的日志:
OK,也都是成功顯示的了。?
三、@PostMapping、@GetMapping、@PutMapping、@DeleteMapping
為了簡(jiǎn)化請(qǐng)求方式@RequestMapping的寫法,就產(chǎn)生了了這四個(gè)注解。寫法如下:
@Controller @RequestMapping("/student") // 模擬學(xué)生的增刪改查控制器 public class StudentController { // 路徑的{id}表示占位符,最后會(huì)封裝到方法的參數(shù)中使用 // 刪除學(xué)生 //@RequestMapping(value = "/{id}",method = RequestMethod.DELETE) @DeleteMapping("/{id}") public String deleteStudent(@PathVariable("id") int id, HttpServletRequest request){ System.out.println("刪除id為"+id+"的學(xué)生"); String str = "刪除id為"+id+"的學(xué)生"; request.setAttribute("delete",str); return "student"; } // 如果占位符和參數(shù)名相同,可以省略@PathVariable的value屬性 // 根據(jù)id查詢學(xué)生 //@RequestMapping(value = "/{id}",method = RequestMethod.GET) @GetMapping("/{id}") public String findStudentById(@PathVariable int id,HttpServletRequest request){ request.setAttribute("get","根據(jù)id查詢學(xué)生:"+id); System.out.println("根據(jù)id查詢學(xué)生\t"+id); return "student"; } // 新增學(xué)生 //@RequestMapping(value = "/{id}",method = RequestMethod.POST) @PostMapping("/{id}") public String addStudent(@PathVariable int id, Student student, HttpServletRequest request){ request.setAttribute("add",student.toString()); System.out.println("新增學(xué)生:"+student+"\t"+id); return "student"; } // 修改學(xué)生 //@RequestMapping(value = "/{id}",method = RequestMethod.PUT) @PutMapping("/{id}") public String updateStudent(@PathVariable int id,Student student,HttpServletRequest request){ System.out.println("修改學(xué)生\t"+id+"\t"+student); request.setAttribute("update","修改學(xué)生:"+student); return "student"; } }
四、@HiddenHttpMethodFilter
由于瀏覽器form表單只支持GET與POST請(qǐng)求,而DELETE、PUT請(qǐng)求并不支持。SpringMVC有一個(gè)過濾器,可以將瀏覽器的POST請(qǐng)求改為指定的請(qǐng)求方式,發(fā)送給的控制器方法。用法如下:
4.1?在web.xml配置過濾器
<!-- 請(qǐng)求方式過濾器 -->
<filter>
<filter-name>httpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>httpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.2?控制器方法
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
@Controller
@RequestMapping("/c7")
public class MyController7 {
@DeleteMapping("/delete")
public String testDelete(HttpServletRequest request){
System.out.println("刪除方法");
request.setAttribute("delete","刪除方法");
return "student";
}
@PutMapping("/put")
public String testPut(HttpServletRequest request){
request.setAttribute("update","修改方法");
System.out.println("修改方法");
return "student";
}
}
4.3?JSP頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>DELETE、PUT提交</title>
</head>
<body>
<!-- 刪除 -->
<%-- 提交DELETE、PUT請(qǐng)求,表單必須提交方式為post--%>
<%-- 表單中有一個(gè)隱藏域,name值為_method,value值為提交方式--%>
<form action="/c7/delete" method="post">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" value="刪除">
</form>
<!-- 修改 -->
<form action="/c7/put" method="post">
<input type="hidden" name="_method" value="PUT">
<input type="submit" value="修改">
</form>
</body>
</html>
4.4?測(cè)試結(jié)果
OK,我們?nèi)ピL問上面那個(gè)jsp:http://localhost:8080/delete-put.jsp
OK,我們點(diǎn)擊刪除時(shí):?
點(diǎn)擊修改時(shí):
可以看得到都是成功請(qǐng)求的了。?文章來源:http://www.zghlxwxcb.cn/news/detail-517695.html
往期專欄&文章相關(guān)導(dǎo)讀?
?????大家如果對(duì)于本期內(nèi)容有什么不了解的話也可以去看看往期的內(nèi)容,下面列出了博主往期精心制作的Maven,Mybatis等專欄系列文章,走過路過不要錯(cuò)過哎!如果對(duì)您有所幫助的話就點(diǎn)點(diǎn)贊,收藏一下啪。其中Spring專欄有些正在更,所以無法查看,但是當(dāng)博主全部更完之后就可以看啦。文章來源地址http://www.zghlxwxcb.cn/news/detail-517695.html
1. Maven系列專欄文章
Maven系列專欄 | Maven工程開發(fā) |
Maven聚合開發(fā)【實(shí)例詳解---5555字】 |
2. Mybatis系列專欄文章
Mybatis系列專欄 | MyBatis入門配置 |
Mybatis入門案例【超詳細(xì)】 | |
MyBatis配置文件 —— 相關(guān)標(biāo)簽詳解 | |
Mybatis模糊查詢——三種定義參數(shù)方法和聚合查詢、主鍵回填 | |
Mybatis動(dòng)態(tài)SQL查詢 --(附實(shí)戰(zhàn)案例--8888個(gè)字--88質(zhì)量分) | |
Mybatis分頁查詢——四種傳參方式 | |
Mybatis一級(jí)緩存和二級(jí)緩存(帶測(cè)試方法) | |
Mybatis分解式查詢 | |
Mybatis關(guān)聯(lián)查詢【附實(shí)戰(zhàn)案例】 | |
MyBatis注解開發(fā)---實(shí)現(xiàn)增刪查改和動(dòng)態(tài)SQL | |
MyBatis注解開發(fā)---實(shí)現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢 |
3. Spring系列專欄文章
Spring系列專欄 | Spring IOC 入門簡(jiǎn)介【自定義容器實(shí)例】 |
IOC使用Spring實(shí)現(xiàn)附實(shí)例詳解 | |
Spring IOC之對(duì)象的創(chuàng)建方式、策略及銷毀時(shí)機(jī)和生命周期且獲取方式 | |
Spring DI簡(jiǎn)介及依賴注入方式和依賴注入類型 | |
Spring IOC相關(guān)注解運(yùn)用——上篇 | |
Spring IOC相關(guān)注解運(yùn)用——下篇 | |
Spring AOP簡(jiǎn)介及相關(guān)案例 | |
注解、原生Spring、SchemaBased三種方式實(shí)現(xiàn)AOP【附詳細(xì)案例】 | |
Spring事務(wù)簡(jiǎn)介及相關(guān)案例 | |
Spring 事務(wù)管理方案和事務(wù)管理器及事務(wù)控制的API | |
Spring 事務(wù)的相關(guān)配置、傳播行為、隔離級(jí)別及注解配置聲明式事務(wù) |
4. Spring MVC系列專欄文章?
SpringMVC系列專欄 | Spring MVC簡(jiǎn)介附入門案例 |
Spring MVC各種參數(shù)獲取及獲取方式自定義類型轉(zhuǎn)換器和編碼過濾器 | |
Spring MVC獲取參數(shù)和自定義參數(shù)類型轉(zhuǎn)換器及編碼過濾器 | |
Spring MVC處理響應(yīng)附案例詳解 | |
Spring MVC相關(guān)注解運(yùn)用 —— 上篇 | |
Spring MVC相關(guān)注解運(yùn)用 —— 中篇 | |
Spring MVC相關(guān)注解運(yùn)用 —— 下篇 | |
Spring MVC多種情況下的文件上傳 | |
Spring MVC異步上傳、跨服務(wù)器上傳和文件下載 | |
Spring MVC異常處理【單個(gè)控制異常處理器、全局異常處理器、自定義異常處理器】 | |
Spring MVC攔截器和跨域請(qǐng)求 | |
SSM整合案例【C站講解最詳細(xì)流程的案例】 |
到了這里,關(guān)于Spring MVC相關(guān)注解運(yùn)用 —— 中篇的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!