RequestMapping屬性詳解 - SpringMVC高手進階

文章來源:https://blog.csdn.net/qq_39390545/article/details/105206988

原文作者:陳哈哈

前言

在日常java面試中springMVC已經是必不可少的一環了,昨天與幾位朋友交流了一下面試SpringMVC框架時的心得。

我們發現大部分面試者僅瞭解SpringMVC的執行流程和組件這第一層,有些確實說的有模有樣,也有些比較糊弄,但當追問到SpringMVC註解(Annotation)具體實現部分時,多顯得異常狼狽。

因此,我在這記錄一下我們常考查的註解實戰性問題之一:

@RequestMapping註解的屬性有哪些?分別都是幹什麼用的?

設想:如果是你回答這個問題,你有幾成把握

RequestMapping接口源碼解析

RequestMapping接口的源碼如下,裡面定義了八個屬性(Spring4.3.8)。

注:SpringMVC在4.1版本對RequestMapping屬性做了相應調整,去掉了path屬性。

<code>@Target({ElementType.METHOD, ElementType.TYPE}) // 可以在方法和類的聲明中使用 @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping { String name() default "";// 指定映射的名稱 @AliasFor("path") String[] value() default {}; // 指定請求路徑的地址 @AliasFor("value") String[] path() default {}; // 指定請求路徑的地址 // 指定請求的方式,是一個RequsetMethod數組,可以配置多個方法 RequestMethod[] method() default {}; // 指定參數的類型 String[] params() default {}; // 指定請求頭內容 String[] headers() default {}; // 指定數據請求的格式 String[] consumes() default {}; // 指定返回的內容類型 String[] produces() default {}; } /<code>如上源碼所示,在@Target中有兩個屬性,分別為 ElementType.METHOD 和 ElementType.TYPE ,也就是說@RequestMapping 可以在方法和類的聲明中使用可以看到註解中的屬性除了 name() 返回的字符串,其它的方法均返回數組,也就是可以定義多個屬性值,例如 value() 和 path() 都可以同時定義多個字符串值來接收多個URL請求

RequestMapping屬性介紹

1、name

此處name屬性,相當於方法的註釋,使方法更易理解

<code>@RequestMapping(value = "login",name = "用戶登錄") @ResponseBody public String login() { return "success"; } /<code>

官方文檔說:它能讓你非常方便的在JSP頁面上使用它,形如這樣子可以直接通過靜態頁面調用:

2、value

<code>@Controller @RequestMapping("user") //此處如果不省略,則為@RequestMapping(value="user") public class UserController { @RequestMapping("login") @ResponseBody public String login() { return "success"; } } /<code>

指定請求的實際地址,指定的地址可以是URI 模板模式(Template Pattern);

由於value屬性是@RequestMapping註釋的默認屬性,因此如果只有唯一的屬性,則可以省略該屬性名,如果有超過一個屬性,則必須寫上value屬性名稱。即如下兩個標註含義一樣

<code>@RequestMapping(value="login") @RequestMapping("login")/<code>

value屬性支持通配符匹配:

<code>@RequestMapping(value="login/*"); /<code>

即:http://localhost:8080/login/1或者http://localhost:8080/login/hahaha都能夠正常訪問該接口

此處通過URL:http://localhost:8080/user/login進行訪問,將由login()方法進行處理

3、path

與value同義,path(value)(path 和 value 互相引用,參見RequestMapping接口源碼)

path屬性,和1中的value屬性使用一致,兩者都是用來作為映射使用的。

@RequestMapping(value=“login”)、@RequestMapping(path=“login”),這兩種情況都能對login()方法進行訪問

path屬性支持通配符匹配:

<code>@RequestMapping(path="login/*"); /<code>

即:http://localhost:8080/login/1或者http://localhost:8080/login/abc都能夠正常訪問

4、method

指定請求類型, 如GET、POST、PUT、DELETE等;

<code>@RequestMapping(value = "login",method = RequestMethod.GET) @ResponseBody public String login() { return "success"; }/<code>

以上方法表示,該方法只支持GET請求。

此處也可以為

<code>@RequestMapping(value = "login",method = {RequestMethod.GET,RequestMethod.POST}) /<code>

說明該方法可以同時支持GET和POST請求。

如果沒有method屬性,則說明該方法支持全部的HTTP請求。

5、params

該屬性指定,請求中必須包含params屬性規定的參數時,才能執行該請求

<code>@RequestMapping(value = "login",params = "flag") @ResponseBody public String login() { return "success"; }/<code>

以上方法,說明請求中必須包含flag參數才能執行該請求,flag參數值不做要求

http://localhost:8080/login?flag=xxx // 正常訪問

http://localhost:8080/login // 無法訪問

<code>@RequestMapping(value = "login",params = "flag=true") @ResponseBody public String login() { return "success"; }/<code>

以上方法,說明請求中必須包含flag參數,而且參數值必須為true才能執行該請求

http://localhost:8080/login?flag=true // 正常訪問

http://localhost:8080/login?flag=false // 無法訪問

http://localhost:8080/login // 無法訪問

6、headers

用於HTTP協義交互的信息被稱為HTTP報文,客戶端發送的HTTP報文被稱為請求報文,服務器發回給客戶端的HTTP報文稱為響應報文,報文由報文頭部和報文體組成。

請求頭部(Request

Headers):請求頭包含許多有關客戶端環境和請求正文的信息,例如瀏覽器支持的語言、請求的服務器地址、客戶端的操作系統等。

響應頭部(Rsponse Headers):響應頭也包含許多有用的信息,包括服務器類型、日期、響應內容的類型及編碼,響應內容的長度等等。

該屬性指定,請求中必須包含某些指定的header值,才能夠讓該方法處理請求

如Chrome瀏覽器:

可以通過點擊F12(進入開發者模式)---->Network---->Name中點擊網頁---->右側查看Headers即可,下邊是我電腦中的一個請求頭部示例:

<code>Request Headers Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding:gzip, deflate, sdch Accept-Language:zh-CN,zh;q=0.8 Cache-Control:max-age=0 Connection:keep-alive Cookie:JSESSIONID=210075B5E521CWE3CDE938076295A57A Host:localhost:8080 Upgrade-Insecure-Requests:1 User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 /<code>

<code>// 表示只接收本機發來的請求 @RequestMapping(path = "/login", headers="Referer=http://localhost:8080") public String login() { return "success"; /<code>

以上方法 ,必須滿足請求的header中包含了指定的"Referer"請求頭和值為"http://localhost:8080"時,才能執行該請求

7、consumes

指定處理請求的提交內容類型(Content-Type),例如:application/json、text/html時,才能夠讓該方法處理請求

<code>@RequestMapping(value = "login",consumes = "application/json") @ResponseBody public String login() { return "success"; }/<code>

8、produces

指定返回的內容類型,返回的內容類型必須是request請求頭(Accept)中所包含的類型

<code>@RequestMapping(value = "login",produces = "application/json") @ResponseBody public String login() { return "success"; }/<code>

此外,produces屬性還可以指定返回值的編碼

<code>@RequestMapping(value = "login",produces = "application/json,charset=utf-8") /<code>

如上,則指明返回utf-8編碼


目前在職Java開發,如果你現在也在學習Java,在入門學習Java的過程當中缺乏基礎入門的視頻教程, 可以關注並私信我:01。免費領取2020年最新Java基礎精講視頻教程,學習手冊,面試題,開發工具,PDF文檔書籍教程,以下資料截圖:

關注並私信我:01。即可領取以上學習資料。