胖哥學SpringMVC:RequestMapping註解之其它屬性

@RequestMapping

我的建議從新練習一遍搭建的過程,若是感受麻煩你能夠直接複製上一個工程,可是須要修改pom.xml中的一點信息java

<groupId>com.hanpang.springmvc</groupId>
<artifactId>springmvc-demo02</artifactId>
<version>0.0.1-SNAPSHOT</version>
複製代碼

這章的內容簡單瞭解就好web

1.請求參數與請求頭的值

能夠篩選請求參數的條件來縮小請求匹配範圍,好比"myParam"、"!myParam"及"myParam=myValue"等。前兩個條件用於篩選存在/不存在某些請求參數的請求,第三個條件篩選具備特定參數值的請求。下面的例子展現瞭如何使用請求參數值的篩選條件:spring

請求參數paramsjson

package com.hanpang.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller//告知其是一個控制器
@RequestMapping("/book")
public class Demo04Controller {
	@RequestMapping(value="/xiyouji",params="!myParam" )
	public ModelAndView test01() {
		System.out.println("不容許出現參數名myParam的名稱");
		return null;
	}

	@RequestMapping(value="/shuihu",params="myParam")
	public ModelAndView test02() {
		System.out.println("路徑傳遞的參數必須有名字叫myParam");
		return null;
	}
	@RequestMapping(value="/sanguo",params="myParam=shxt")
	public ModelAndView test03() {
		System.out.println("路徑傳遞的參數必須有名字叫myParam,而且傳遞的值必須爲shxt");
		return null;
	}
	@RequestMapping(value="/honglou",params="myParam!=shxt")
	public ModelAndView test04() {
		System.out.println("路徑傳遞的參數必須有名字叫myParam,而且傳遞的值不能是shxt");
		return null;
	}

}
複製代碼

NOTE: 我的在實際開發中不多使用params屬性,請看代碼中的輸出語句就是說明服務器

請求頭headersmvc

package com.hanpang.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller//告知其是一個控制器
@RequestMapping("/book")
public class Demo04Controller {
	@RequestMapping(value="/sanguo",headers="myParam=shxt")
	public ModelAndView test03() {
		System.out.println("headers中須要傳遞參數myParam,而且值必須爲shxt");
		return null;
	}
	@RequestMapping(value="/honglou",headers="myParam!=shxt")
	public ModelAndView test04() {
		System.out.println("headers中須要傳遞參數myParam,而且傳遞的值不能是shxt");
		return null;
	}
}
複製代碼

這裏使用PostMan進行了簡單測試app

訪問路徑無錯誤,可是沒有設置請求頭,會報錯誤404測試

設置請求頭能正常訪問了,可是注意若是不是shxt的值,依舊會報錯誤404ui

2.消費的媒體類型

能夠指定一組可消費的媒體類型,縮小映射的範圍。這樣只有當請求頭中 Content-Type 的值與指定可消費的媒體類型中有相同的時候,請求才會被匹配。好比:(官網代碼)spa

@Controller
@RequestMapping(path = "/pets", consumes="application/json")
public void addPet(@RequestBody Pet pet, Model model) {
    // ......
}
複製代碼

在後面的課程咱們再來介紹,客戶端傳遞數據到服務器獲取,通常用於客戶端傳遞JSON數據使用

3.生產的媒體類型

能夠指定一組生產的媒體類型,縮小映射的範圍。這樣只有當請求頭中Accept的值與指定可生產的媒體類型中有相同的時候,請求才會被匹配。並且,使用produces條件能夠確保用於生成響應的內容與指定的可生產的媒體類型是相同的。好比:(官網代碼)

@Controller
@RequestMapping(path = "/pets/{petId}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public Pet getPet(@PathVariable String petId, Model model) {
    // ......
}
複製代碼

在後面咱們研究控制器返回類型,咱們再來講明

須要注意的是經過condition條件指定的媒體類型也能夠指定字符集。好比在上面的小段代碼中,仍是覆寫了MappingJackson2HttpMessageConverter類中默認配置的媒體類型,同時還指定了使用UTF-8的字符集。

consumes條件相似,可生產的媒體類型表達式也可使用否認。好比,可使用!text/plain來匹配全部請求頭Accept中不含text/plain的請求。同時,在MediaType類中還定義了一些常量,好比APPLICATION_JSON_VALUEAPPLICATION_JSON_UTF8_VALUE等,推薦更多地使用它們

produces屬性提供的是方法級的類型支持。與其餘屬性不一樣,當在類型級使用時,方法級的消費類型將覆蓋類型級的配置,而非繼承關係。

相關文章
相關標籤/搜索