RequestMapping屬性詳解 - SpringMVC高手進階

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

原文作者:陳哈哈

RequestMapping屬性詳解 - SpringMVC高手進階

前言

在日常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文檔書籍教程,以下資料截圖:

RequestMapping屬性詳解 - SpringMVC高手進階

RequestMapping屬性詳解 - SpringMVC高手進階

RequestMapping屬性詳解 - SpringMVC高手進階

RequestMapping屬性詳解 - SpringMVC高手進階

RequestMapping屬性詳解 - SpringMVC高手進階

RequestMapping屬性詳解 - SpringMVC高手進階

RequestMapping屬性詳解 - SpringMVC高手進階

RequestMapping屬性詳解 - SpringMVC高手進階

RequestMapping屬性詳解 - SpringMVC高手進階

RequestMapping屬性詳解 - SpringMVC高手進階

RequestMapping屬性詳解 - SpringMVC高手進階

RequestMapping屬性詳解 - SpringMVC高手進階

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


分享到:


相關文章: