目錄
springmvc處理請求映射路徑
案例:訪問 OrderController類的pirntUser方法報錯:java.lang.IllegalStateException:映射不明確
核心錯誤信息
springmvc接收參數
一 ,常見的字符串和數字類型的參數接收方式
1.1?請求路徑的參數名和業務方法中的參數名保持一致的情況
1.2?請求路徑參數名和業務方法中參數不同名的情況
二,請求路徑傳參是實體對象時
三,請求路徑傳參的實體對象中還有實體對象
四,接收數組類型的參數
五,接收集合類型的參數
六,接收json格式的參數
6.1,json轉成實體對象
6.2,json轉成集合對象
6.3,json轉成集合對象,集合中存放的是實體對象
七,日期類型參數傳遞
springmvc處理請求映射路徑
場景:在實際的應用開發中,需要寫不同的模塊,在這些模塊中,不同的方法可能具有相同的映射路徑如 訂單模塊,用戶登錄模塊,他們在方法上映射路徑都是/user。 這就會導致無法準確找到目標方法報錯。
案例:訪問 OrderController類的pirntUser方法報錯:java.lang.IllegalStateException:映射不明確
UserController類
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class UserController {/*在Java的Spring MVC中,如果返回的字符串在瀏覽器中顯示為亂碼(如三個問號),通常是因為響應內容的字符編碼設置不正確。設為utf-81 在@RequestMapping中指定produces屬性 設置為utf-82 使用@RestController注解 默認使用utf-8編碼*/@RequestMapping(value = "/user",produces = "text/plain;charset=utf-8")@ResponseBodypublic String printloginInfo(){System.out.println("打印登錄用戶信息。。。。");return "打印登錄用戶信息。。。。。";}
}
OrderController類
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class OrderController {@RequestMapping(value = "/user", produces = "text/plain;charset=utf-8")@ResponseBodypublic String pirntUser(){System.out.println("打印訂單中顧客信息。。。。");return "正在打印訂單中顧客信息....";}
}
測試:報500服務器內部錯誤!
核心錯誤信息
/*
原因:java.lang.IllegalStateException:映射不明確。無法映射“userController”方法
控制器。用戶控制器#登錄(字符串,String)
對于{[/user],生成[text/plain;charset=utf-8]}:已經存在'orderController'bean方法
*/
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'userController' method?
controller.UserController#login(String, String)
to { [/user], produces [text/plain;charset=utf-8]}: There is already 'orderController' bean method
解決辦法:在controller類上使用@RequestMapping("類路徑"),進一步區分不同模塊的方法
這里在OrderController類上,添加一級目錄,進一步完善對方法的訪問
注意:我把寫在類上的@RequestMapping 稱為 “一級目錄”;寫在方法上的稱為“二級目錄”
測試:
訪問OrderController類的方法成功!
訪問UserController類方法成功!
springmvc接收參數
一下案例,皆使用Apifox,模擬請求發送
一 ,常見的字符串和數字類型的參數接收方式
1.1?請求路徑的參數名和業務方法中的參數名保持一致的情況
案例
測試結果
1.2?請求路徑參數名和業務方法中參數不同名的情況
大家,請看,如果修改請求參數名,當請求參數與映射參數不一致時,就會報錯!
測試
解決辦法:使用@RequestParam 注解,寫在參數上
@RequestParam:給映射參數寫別名
測試
二,請求路徑傳參是實體對象時
場景1?:訪問printUser1方法返回user對象
在這一個過程中,我出現的問題(可選):
1 一直無法將user對象轉成json格式
1.1 添加json格式依賴
1.2 springmvc 消息轉成器 配置類
1.3 在springmvc配置類中加載config所在包
1.4 在RequestMapping注解 要求user對象使用json格式
----------解決:springmvc工程 響應時,將實體類對象 轉換成json格式數據-CSDN博客
User實體類
使用Apifox發送請求
//傳遞對象@RequestMapping(value = "/user2", produces = "application/json")public User printUser1(User user) {System.out.println(user);return user;}
測試
三,請求路徑傳參的實體對象中還有實體對象
// 傳遞 對象嵌套@RequestMapping("/user3")public User printUser2(User user) {System.out.println(user);return user;}
測試
四,接收數組類型的參數
// 傳遞數組@RequestMapping("/user4")public String printUser3(String[] name) {for (String s : name) {System.out.println(s);}return "success";}
測試
五,接收集合類型的參數
//傳遞集合@RequestMapping("/user5")public String printUser4(@RequestParam List<String> name){for (String s : name) {System.out.println(s);}return "success";}
測試
六,接收json格式的參數
須知:客戶端向服務器,發送數據都是以json格式傳遞的
如果要使用json格式接收請求參數要求:
1 引用json格式依賴
<!-- Jackson核心庫 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.13.0</version></dependency><!-- Jackson數據綁定庫 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.4.2</version></dependency>
2 使用@EnableWebMvc 注解,開啟json?
3在controller類方法上使用@RequestBody注解
@RequestBody注解作用
1 將json數據實現對實體類對象的轉換
6.1,json轉成實體對象
//json格式傳遞對象@RequestMapping("/user6")public User printUser5(@RequestBody User user){System.out.println(user);return user;}
測試
6.2,json轉成集合對象
//json格式傳遞集合@RequestMapping("/user7")public String printUser6(@RequestBody List<String> name){for (String s : name) {System.out.println(s);}return "success";}
測試
6.3,json轉成集合對象,集合中存放的是實體對象
//json格式對象嵌套傳遞@RequestMapping("/user8")public User printUser7(@RequestBody User user) {System.out.println(user);return user;}
七,日期類型參數傳遞
當日期類型的格式是年/月/日這種時,只需要用Date類對象接收就可以了,
但是當格式是年-月-日這種時,就需要用注解@DateTimeFormat(pattern = "yyyy-MM-dd")來進行處理才不會報錯。具體案例看下圖:
總結
@DateTimeFormat注解作用:將傳入的字符串參數轉換為 Date 類型
按照指定格式輸出 Date 對象,就得運用 SimpleDateFormat 類來進行格式化
@RequestMapping("/user9")public String printUser8(Date date1,@DateTimeFormat(pattern = "yyyy-MM-dd")Date date2, @DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") Date date3) {System.out.println("date1"+date1);System.out.println("date2"+date2);System.out.println("date3"+date3);return "success"+date1+date2+date3;
測試
控制臺輸出: