您好,登錄后才能下訂單哦!
這篇文章主要介紹“SpringMVC @RequestMapping注解怎么使用”,在日常操作中,相信很多人在SpringMVC @RequestMapping注解怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”SpringMVC @RequestMapping注解怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
@RequestMapping注解的作用,就是將請求和處理請求的控制器方法關聯起來,建立映射關系。
SpringMVC接收到一個請求,就會在映射關系中找到對應的控制器方法來處理這個請求。
@RequestMapping有很多屬性,設置得越多,匹配的請求越精確。
控制器中有多個方法對應同一個請求,怎么處理?
編譯前正常,運行時報錯。說對于這個請求,已經存在對應的控制器方法了
多個控制器,對于同一個請求配置了不同的控制器方法,怎么處理?
編譯前正常,運行時報錯。說對于這個請求,已經存在對應的控制器方法了
也就是說,請求和它的處理器方法必須是一一對應的關系
。
查看@RequestMapping注解的源碼
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping { ... }
從@Target可以看出
ElementType.TYPE:可以標記類
ElementType.METHOD:可以標記方法
有兩種情況,標記在類上和標記在方法上
@RequestMapping標識一個類:設置映射請求的請求路徑的
初始信息
@RequestMapping標識一個方法:設置映射請求請求路徑的
具體信息
@Controller @RequestMapping("/test") public class RequestMappingController { //此時請求映射所映射的請求的請求路徑為:/test/testRequestMapping @RequestMapping("/testRequestMapping") public String testRequestMapping(){ return "success"; } }
使用場景
常用于區分不同模塊的相同功能
比如用戶模塊和訂單模塊都有展示數據功能,請求路徑都是/list。
如果單純在兩個控制器中配置兩個針對/list的方法,則一個請求對應了兩個控制方法,運行時會報錯。
而為了功能命名的統一,也不希望設置不同的名稱,比如/user_list 與 /order_list ,這樣雖然可以解決問題,但不合理。
可以使用在類上配置@RequestMapping的方式,來區分用戶和訂單的 /list。
比如
@Controller @RequestMapping("/user") public class UserController { //此時請求映射所映射的請求的請求路徑為:/user/list @RequestMapping("/list") public String getUserList(){ return "userList"; } } @Controller @RequestMapping("/order") public class OrderController { //此時請求映射所映射的請求的請求路徑為:/order/list @RequestMapping("/list") public String getOrderList(){ return "orderList"; } }
在訪問時,可以指定"/user/list" 和"/order/list"
閱讀源碼
public @interface RequestMapping { ... @AliasFor("path") String[] value() default {}; ... }
@RequestMapping中value屬性的作用
value屬性必須配置!
@RequestMapping注解的value屬性
通過請求的請求地址匹配請求映射
。它是一個字符串類型的數組,表示該請求映射
能夠匹配多個請求地址
所對應的請求
@RequestMapping(value={"/text1", "/text2"}) public String toTarget(){ System.out.println("請求收到"); //返回視圖名稱 return "text"; }
通過/text1和/text2,都能匹配到這個控制器方法,跳轉到text對應的視圖頁面
注意
有些特殊字符不能被匹配,例如 ? 或 / 或 空格
SpringMVC支持路徑中的占位符,在restful風格中會用到
什么是restful風格
通過拼接請求路徑的方式,傳遞請求參數
原始方式:/deleteUser?id=1
rest方式:/deleteUser/1
服務器如何知道哪個/是目錄,哪個/是參數?
參數部分,用{}占位符來填充。
例如 /test/{} 就可以匹配/test/1 ,而/test/test/1這樣的更深目錄,就不會被錯誤匹配到
但要注意,此時 /test 請求不能被 /test/{}匹配到。 /test/ 也不行。
如何使用restful風格傳參
當請求路徑中,將某些數據通過路徑的方式傳輸到服務器中后;
就可以在相應的@RequestMapping注解的value屬性中,通過占位符{自定義名稱}表示傳輸的數據;
在控制器方法的參數部分添加@PathVariable注解,將占位符所表示的數據賦值給控制器方法的形參;
這樣就實現了從前端頁面傳參給后端控制器方法。
總結:
占位符{}告訴控制方法,此處是一個rest風格的參數;
@PathVariable用于將這個參數與控制器方法的形參進行綁定,使之可以在方法中使用。
示例
單個參數
模擬傳參
<a th:href="@{/testPath/3}" rel="external nofollow" >rest風格</a>
控制器方法
@RequestMapping("/testPath/{id}") public String testPath(@PathVariable String id){ System.out.println("id = " + id); return "target"; }
閱讀源碼
public @interface RequestMapping { ... RequestMethod[] method() default {}; ... }
可以看出,method是一個RequestMethod類型的數組(RequestMethod就是請求方法)
RequestMethod是一個枚舉類,包括:GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
@RequestMapping中method屬性的作用
@RequestMapping注解的method屬性通過請求的請求方式(get或post)匹配請求映射。
它是一個RequestMethod類型的數組,表示該請求映射能夠匹配多種請求方式的請求
如果不設置method,默認是任何請求方式都能匹配(因為此時不以請求方式為條件)
使用場景
后續CRUD時,可以根據請求方式的不同,在同一個請求路徑下,匹配不同的控制方法,執行不同的SQL語句。
示例
由于value屬性必須設置,所以設置method屬性后,意思是既要滿足請求地址,又要滿足請求方法
。
@RequestMapping(value="/target", method = {RequestMethod.GET, RequestMethod.POST}) public String toTarget(){ System.out.println("請求收到"); //返回視圖名稱 return "target"; }
注意
如果當前請求的請求地址滿足請求映射的value屬性,但是請求方式不滿足method屬性,則瀏覽器報錯405:Request Method 'POST' not supported,請求方式不被支持。
派生注解
1、對于處理指定請求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解:
處理get請求的映射 --> @GetMapping
處理post請求的映射 --> @PostMapping
處理put請求的映射 --> @PutMapping
處理delete請求的映射 --> @DeleteMapping
派生注解的作用使用這些派生注解,就不用去指定請求方法了。
例如@GetMapping("/test")相當于@RequestMapping(value="/test", method=RequestMethod.GET)
示例
@GetMapping("/get") public String getMapping(){ return "get"; }
意思是,匹配 請求名稱為get,請求方法為get的請求。
2、常用的請求方式有get、post、put、delete
get:查詢
post:修改
put:增加
delete:刪除
但目前瀏覽器只支持get和post,如何發送其他類型的請求?
若在form表單提交時,為method設置了其他請求方式的字符串(put或delete),則會按照默認的請求方式get處理。
若要發送put和delete請求,需要通過Spring提供的過濾器HiddenHttpMethodFilter。是restful的內容
閱讀源碼
String[] params() default {};
params是一個字符串類型的數組
params屬性的作用
@RequestMapping注解的params屬性通過請求的請求參數 匹配請求映射
它是一個字符串類型的數組,可以通過四種表達式設置請求參數和請求映射的匹配關系:
"param":要求請求映射所匹配的請求必須攜帶param請求參數
"!param":要求請求映射所匹配的請求必須不能攜帶param請求參數
"param=value":要求請求映射所匹配的請求必須攜帶param請求參數且param=value
"param!=value":要求請求映射所匹配的請求必須攜帶param請求參數但是param!=value
如果設置了多個參數匹配,則必須同時滿足,請求才能映射到。
示例
@RequestMapping( value = "/test" ,params = {"username","password!=123456"} ) public String testRequestMapping(){ return "success"; }
意思是匹配 請求名稱為test,請求參數包括username,且請求參數中password不等于123456的請求
注意
若當前請求滿足@RequestMapping注解的value和method屬性,但是不滿足params屬性,此時頁面會報錯400:Parameter conditions "username, password!=123456" not met for actual request parameters: username={admin}, password={123456}
閱讀源碼
String[] headers() default {};
headers屬性的作用
@RequestMapping注解的headers屬性通過請求的請求頭信息匹配請求映射
性是一個字符串類型的數組,可以通過四種表達式設置請求頭信息和請求映射的匹配關系
"header":要求請求映射所匹配的請求必須攜帶header請求頭信息
"!header":要求請求映射所匹配的請求必須不能攜帶header請求頭信息
"header=value":要求請求映射所匹配的請求必須攜帶header請求頭信息且header=value
"header!=value":要求請求映射所匹配的請求必須攜帶header請求頭信息且header!=value
注意
若當前請求滿足@RequestMapping注解的value和method屬性,但是不滿足headers屬性,此時頁面 顯示404錯誤,即資源未找到
到此,關于“SpringMVC @RequestMapping注解怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。