文章來源: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。即可領取以上學習資料。