1.1 訪問路徑設置
@RequestMapping注解的作用就是將請求的 URL 地址和處理請求的方式(handler方法)關聯(lián)起來,建立映射關系。
SpringMVC 接收到指定的請求,就會來找到在映射關系中對應的方法來處理這個請求。
1.1.1 精準路徑匹配
@Controller
public class UserController {
/**
* 精準設置訪問地址 /user/login
*/
@RequestMapping(value = {"/user/login"})
@ResponseBody
public String login(){
System.out.println("UserController.login");
return "login success!!";
}
1.1.2 模糊路徑匹配
在@RequestMapping注解指定 URL 地址時,通過使用通配符,匹配多個類似的地址。
@Controller
public class ProductController {
/**
* 路徑設置為 /product/*
* /* 為單層任意字符串 /product/a /product/aaa 可以訪問此handler
* /product/a/a 不可以
* 路徑設置為 /product/**
* /** 為任意層任意字符串 /product/a /product/aaa 可以訪問此handler
* /product/a/a 也可以訪問, /product/a/a/a還可以訪問
*
* 將來的配置攔截器也遵循這個規(guī)則
*/
@RequestMapping("/product/*")
@ResponseBody
public String show(){
System.out.println("ProductController.show");
return "product show!";
}
}
1.1.3 類和方法級的@RequestMapping
- 設置到類級別:
@RequestMapping
注解可以設置在控制器類上,用于映射整個控制器的通用請求路徑。這樣,如果控制器中的多個方法都需要映射同一請求路徑,就不需要在每個方法上都添加映射路徑。 - 設置到方法級別:
@RequestMapping
注解也可以單獨設置在控制器方法上,用于更細粒度地映射請求路徑和處理方法。當多個方法處理同一個路徑的不同操作時,可以使用方法級別的@RequestMapping
注解進行更精細的映射。 - 并且, 可以將兩者結合優(yōu)化代碼的實現(xiàn) :
//1.標記到handler方法
@Controller
public class UserController {
@RequestMapping(value = {"/user/login"})
@ResponseBody
public String login(){
System.out.println("UserController.login");
return "login success!!";
}
@RequestMapping(value = {"/user/register"})
@ResponseBody
public String register(){
System.out.println("UserController.register");
return "register success!!";
}
}
//2.優(yōu)化標記類+handler方法
//類上定位到/user
@RequestMapping("/user")
@Controller
public class UserController {
//handler方法上再進一步指明
@RequestMapping(value = {"/login"})
@ResponseBody
public String login(){
System.out.println("UserController.login");
return "login success!!";
}
@RequestMapping(value = {"/register"})
@ResponseBody
public String register(){
System.out.println("UserController.register");
return "register success!!";
}
}
1.1.4 請求方法限制
HTTP 協(xié)議定義了八種請求方式,在 SpringMVC 中封裝到了下面這個枚舉類:
public enum RequestMethod {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}
- 默認情況下:@RequestMapping所注解的方法/類, 任何請求方式都可以對接過來!
- 可以在在@RequestMapping中增加一個字段method=RequestMethod.xxx來指定請求方式 ,
- 可同時指定多種請求方式 :
- 違背請求方式,會出現(xiàn)405異常!!
@Controller
public class UserController {
/**
* 精準設置訪問地址 /user/login
* method = RequestMethod.POST 可以指定單個或者多個請求方式!
* 注意:違背請求方式會出現(xiàn)405異常!
*/
@RequestMapping(value = {"/user/login"} , method = RequestMethod.POST)
@ResponseBody
public String login(){
System.out.println("UserController.login");
return "login success!!";
}
/**
* 指定多種請求方式
*/
@RequestMapping(value = {"/user/register"},method = {RequestMethod.POST,RequestMethod.GET})
@ResponseBody
public String register(){
System.out.println("UserController.register");
return "register success!!";
}
}
1.1.5 優(yōu)化請求方法限制的代碼 :
@RequestMapping
的 HTTP 方法特定快捷方式變體:
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
注意:進階注解只能添加到handler方法上,無法添加到類上!
@RequestMapping(value="/login",method=RequestMethod.GET)
||
@GetMapping(value="/login")
1.1.7 @GetMapping和@PostMapping :
-
安全性:
涉及敏感數(shù)據(jù)或操作時,使用POST請求可能更安全。因為GET請求的參數(shù)直接暴露在URL中,可能會被記錄在服務器日志或瀏覽器歷史記錄中,而POST請求的參數(shù)通常在請求體中,相對更安全。 -
請求體:
如果操作需要接收復雜的請求體,例如JSON或表單數(shù)據(jù),使用POST請求更為合適。POST請求的請求體可以用于傳遞較大或復雜的數(shù)據(jù)。 -
RESTful設計原則:
根據(jù)RESTful原則,GET請求用于讀取資源,而POST請求用于創(chuàng)建或修改資源。
1.1.6常見問題 :
出現(xiàn)原因:多個 handler 方法映射了同一個地址,導致 SpringMVC 在接收到這個地址的請求時該找哪個 handler 方法處理。
There is already ‘demo03MappingMethodHandler’ bean method com.atguigu.mvc.handler.Demo03MappingMethodHandler#empGet() mapped.
1.2 接收參數(shù)
1.2.1 param和json參數(shù)比較
在 HTTP 請求中,我們可以選擇不同的參數(shù)類型,如 param 類型和 JSON 類型。下面對這兩種參數(shù)類型進行區(qū)別和對比:
-
參數(shù)編碼:
param 類型的參數(shù)會被編碼為 ASCII 碼。例如,假設
name=john doe
,則會被編碼為name=john%20doe
。而 JSON 類型的參數(shù)會被編碼為 UTF-8。 -
參數(shù)順序:
param 類型的參數(shù)沒有順序限制。但是,JSON 類型的參數(shù)是有序的。JSON 采用鍵值對的形式進行傳遞,其中鍵值對是有序排列的。
-
數(shù)據(jù)類型:
param 類型的參數(shù)僅支持字符串類型、數(shù)值類型和布爾類型等簡單數(shù)據(jù)類型。而 JSON 類型的參數(shù)則支持更復雜的數(shù)據(jù)類型,如數(shù)組、對象等。
-
嵌套性:
param 類型的參數(shù)不支持嵌套。但是,JSON 類型的參數(shù)支持嵌套,可以傳遞更為復雜的數(shù)據(jù)結構。
-
可讀性:
param 類型的參數(shù)格式比 JSON 類型的參數(shù)更加簡單、易讀。但是,JSON 格式在傳遞嵌套數(shù)據(jù)結構時更加清晰易懂。
總的來說,param 類型的參數(shù)適用于單一的數(shù)據(jù)傳遞,而 JSON 類型的參數(shù)則更適用于更復雜的數(shù)據(jù)結構傳遞。根據(jù)具體的業(yè)務需求,需要選擇合適的參數(shù)類型。在實際開發(fā)中,常見的做法是:在 GET 請求中采用 param 類型的參數(shù),而在 POST 請求中采用 JSON 類型的參數(shù)傳遞。
1.2.2 param參數(shù)接收
- 直接傳值
例如客戶填寫表單后 , 參數(shù)直接放在鏈接中傳遞:
此時在handler中 , 只要形參名和類型都與傳遞參數(shù)一一對應.即可自動接收 :
@Controller
@RequestMapping("param")
public class ParamController {
/**
* 前端請求鏈接 : localhost:8080/param/value?name=你好age=18
* 利用形參列表,直接接收前端傳遞的param參數(shù)!
* 要求: 參數(shù)名 = 形參名
*
* 類型相同
* 出現(xiàn)亂碼正常,json接收具體解決!!
* @return 返回前端數(shù)據(jù)
*/
@GetMapping(value="/value")
@ResponseBody
public String setupForm(String name,int age){
System.out.println("name = " + name + ", age = " + age);
return name + age;
}
}
直接傳值有一個顯然的缺點 , 形參和傳遞參數(shù)并不一定同名且一一對應(例如用戶干脆就不填age)
- @RequestParam注解傳值 (僅可在形參列表中聲明)
@RequestParam
使用場景:
- 指定綁定的請求參數(shù)名
- 要求請求參數(shù)必須傳遞 (默認為必須傳遞)
- 為請求參數(shù)提供默認值
/**
* 前端請求: http://localhost:8080/param/data?name=xx&stuAge=18
*
* 使用@RequestParam注解標記handler方法的形參
* 指定形參對應的請求參數(shù)@RequestParam(請求參數(shù)名稱)
*/
@GetMapping(value="/data")
@ResponseBody
//通過@RequestPararm注解,指定傳遞參數(shù)name賦給形參name ,
// 指定傳遞參數(shù)stuAge賦給形參age , 且修改為不必須傳遞 , 設定默認值18
public Object paramForm(@RequestParam(value = "name") String name,
@RequestParam(value = "stuAge",required = false,defaultValue = "18") int age){
System.out.println("name = " + name + ", age = " + age);
//
return name+age;
}
默認情況下,使用@RequestPararm注解的方法參數(shù)是必需的,但可以通過將 @RequestParam
注解的 required
標志設置為 false
!
- 特殊場景接值
a. 一名多值
需求 : 多選框,提交的數(shù)據(jù)的時候一個key對應多個值,我們可以使用集合進行接收!
/**
* 前端請求: http://localhost:8080/param/mul?hbs=吃&hbs=喝
* 一名多值,可以使用集合接收即可!但是需要使用@RequestParam注解指定
*/
@GetMapping(value="/mul")
@ResponseBody
public Object mulForm(@RequestParam List<String> hbs){
System.out.println("hbs = " + hbs);
return hbs;
}
b. 實體接收
優(yōu)點 : 可以在方法內(nèi)部直接使用對象的屬性來訪問請求參數(shù),而不需要每個參數(shù)都寫一遍。
缺點 : 由于是通過對象傳值 , 無法采用@RequestParam綁定形參和傳遞參數(shù) , 因此二者的屬性名必須要相同 . 即User類內(nèi)部定義的是name和age,那么傳遞參數(shù)的名也必須是name和age.
定義一個用于接收參數(shù)的實體類:
public class User {
private String name;
private int age = 18;
// getter 和 setter 略
}
在控制器中,使用實體對象接收,示例代碼如下:
@Controller
@RequestMapping("param")
public class ParamController {
@POSTMapping(value = "/user")
@ResponseBody
public String addUser(User user) {
// 在這里可以使用 user 對象的屬性來接收請求參數(shù)
System.out.println("user = " + user);
return "success";
}
}
在上述代碼中,將請求參數(shù)name和age映射到實體類屬性上!要求屬性名必須等于參數(shù)名!否則無法映射!
使用postman傳遞參數(shù)測試:
1.2.3 接收JSON參數(shù)(@RequestBody)
- @RequestBody 注解來將 JSON 數(shù)據(jù)轉(zhuǎn)換為 Java 對象
- @RequestBody 注解表示當前方法參數(shù)的值應該從請求體中獲取,并且需要指定 value 屬性來指示請求體應該映射到哪個參數(shù)上
- 定義一個用來接收json數(shù)據(jù)的實體類
public class Person {
private String name;
private int age;
private String gender;
// getter 和 setter 略
}
- 前端發(fā)送 JSON 數(shù)據(jù)的示例:(使用postman測試)
{
"name": "張三",
"age": 18,
"gender": "男"
}
- 在控制器中,使用 @RequestBody 注解來接收 JSON 數(shù)據(jù),并將其轉(zhuǎn)換為 Java 對象:
@PostMapping("/person")
@ResponseBody
public String addPerson(@RequestBody Person person) {
// 在這里可以使用 person 對象來操作 JSON 數(shù)據(jù)中包含的屬性
return "success";
}
Java原生只支持param傳參和路徑傳參 , json是前端定義的格式 .因此需要做兩件事.
a. 導入json依賴
b.handlerAdapter配置json轉(zhuǎn)化器(即在config類上增加@EnableWebMvc)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.0</version>
</dependency>
此時運行程序 , 可以接收到傳來的json。
插播一條@EnableWebMvc注解:
原本,MvcConfig類中,我們需要重寫handlerMapping,handlerAdapter兩個方法,上例中又加入了一個新需求即配置一個json轉(zhuǎn)化器。然而這一切只需要MvcConfig上聲明一個@EnableWebMvc注解即可實現(xiàn)。
1.2.4 路徑參數(shù)接收(動態(tài)傳參)
先理解是什么:文章來源:http://www.zghlxwxcb.cn/news/detail-792842.html
http://localhost:8080/user/login?account=root&password=12345
||
http://localhost:8080/user/root/12345
即將每個參數(shù)視為路徑 , 這就是路徑傳參
- 路徑傳遞參數(shù)是一種在 URL 路徑中傳遞參數(shù)的方式。在 RESTful 的 Web應用程序中,經(jīng)常使用路徑傳遞參數(shù)來表示資源的唯一標識符或更復雜的表示方式。
- Spring MVC 框架提供了
@PathVariable
注解來處理路徑傳遞參數(shù) , 該注解允許將 URL 中的占位符映射到控制器方法中的參數(shù)。
例如,如果我們想將 /user/{id}
路徑下的 {id}
映射到控制器方法的一個參數(shù)中,則可以使用 @PathVariable
注解來實現(xiàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-792842.html
/**
* 動態(tài)路徑設計: /user/{動態(tài)部分}/{動態(tài)部分} 動態(tài)部分使用{}包含即可! {}內(nèi)部動態(tài)標識!
* 形參列表取值: @PathVariable Long id 如果形參名 = {動態(tài)標識} 自動賦值!
* @PathVariable("動態(tài)標識") Long id 如果形參名 != {動態(tài)標識} 可以通過指定動態(tài)標識賦值!
* 和RequestParama一樣 , 通過value屬性綁定兩個屬性(@PathVariable(value="stuAge") int age)
*/
//動態(tài)路徑設計, 可在形參列表獲取傳入的參數(shù)
@GetMapping("/user/{id}/{name}")
@ResponseBody
//形參列表獲取參數(shù), 分別傳入上頭的GetMapping和下面的方法
public String getUser(@PathVariable Long id,
@PathVariable("name") String uname) {
System.out.println("id = " + id + ", uname = " + uname);
return "user_detail";
}
//訪問測試: /param/user/1/root 可得結果: id = 1 uname = root
到了這里,關于02 SpringMVC接收數(shù)據(jù)之訪問路徑設置+四種接參方式+@EnableWebMvc的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!