Spring MVC學習路(五)RequestMapping

@Controller  
@RequestMapping("/user")                 //1處理器的通用映射前綴  
public class HelloWorldController2 {  
    @RequestMapping("/hello2")        //2相對於1處的映射進行窄化  
    public ModelAndView helloWorld() {  
         System.out.print("hello!");
         ..如下省略
    }  
}

此時訪問localhost:8888/demo/hello2 在控制檯內是沒法打印出「hello!」的java

值能訪問localhost:8888/demo/user/hello2 才能訪問次方法,堪稱方法級別的RequestMappingweb

同時也叫窄化請求映射正則表達式

多個URL路徑能夠映射到同一個處理器的功能處理方法

@Controller  
public class HelloWorldController2 {  
    @RequestMapping("/hello2","/testhello")        //多URL映射同一處理方法
    public ModelAndView helloWorld() {  
         System.out.print("hello!");
         ..如下省略
    }  
}

URI模板模式映射

@Controller  
public class HelloWorldController2 {  
    @RequestMapping("/hello2/{fid}")   //fid是佔位符        
    public ModelAndView helloWorld() {  
         System.out.print("hello!");
         ..如下省略
    }  
}

經過這種佔位符的方式能夠經過/hello2/123444或者/hello/abc的映射訪問該處理器,經過@PathVariable能夠提取URI模板模式中的{×××}中的×××變量。固然修改/hello2/{fid}爲/hello2/{fid}/test同理瀏覽器

Ant風格的URL路徑映射


@RequestMapping("/users/**"):能夠匹配「/users/abc/abc」,但「/users/123」將會被【URI模板模式映射中的「/users/{userId}」模式優先映射到session

 @RequestMapping("/product?"):可匹配「/product1」或「/producta」,但不匹配「/product」或「/productaa」;app

@RequestMapping("/product*"):可匹配「/productabc」或「/product」,但不匹配「/productabc/abc」;測試

@RequestMapping("/product/*"):可匹配「/product/abc」,但不匹配「/productabc」;ui

@RequestMapping("/products/**/{productId}"):可匹配「/products/abc/abc/123」或「/products/123」url

也就是Ant風格和URI模板變量風格可混用;spa


經過@PathVariable取值

使用@PathVariable取值時,必須使用基本類型定義變量

@Controller
public class Test {
	@RequestMapping("test/{fid}")
	public void test1(@PathVariable("fid") String fid,
			@RequestParam("a")String a,HttpServletResponse res) throws IOException{
		System.out.println(fid);
		System.out.println(a);
		res.getWriter().print(a);
	}
}

此時訪問http://localhost:8888/SpringMVCTest/test/12334?a=333

在控制檯會打印出12334和333兩個參數

但若是訪問http://localhost:8888/SpringMVCTest/test?a=333

則會報404錯誤

正則表達式風格的URL路徑映射

@RequestMapping(value="/products/{categoryCode:\\d+}-{pageNumber:\\d+}"):能夠匹配「/products/123-1」,但不能匹配「/products/abc-1」,這樣能夠設計更加嚴格的規則。

規定請求的方法指定映射

@Controller
public class Test {
	@RequestMapping(value="test/{fid}",method = RequestMethod.POST)
	public void test1(@PathVariable("fid") String fid,
			@RequestParam("a")String a,HttpServletResponse res) throws IOException{
		System.out.println(fid);
		System.out.println(a);
		res.getWriter().print(a);
	}
}

若是此時直接經過瀏覽器訪問http://localhost:8888/SpringMVCTest/test/12334?a=333則會報

HTTP Status 405 - Request method 'GET' not supported

錯誤,必須使用POST請求才能指定到該映射,而將

method = RequestMethod.POST

改成

method = RequestMethod.GET

便可直接經過網頁訪問

注意:此時由於@requestMapping內存在多個參數,

@RequestMapping(value="test/{fid}",method = RequestMethod.POST)

因此不可再簡寫爲

@RequestMapping("test/{fid}")

除了GET、POST,還有HEAD、OPTIONS、PUT、DELETE、TRACE。

DispatcherServlet默認開啓對 GET、POST、PUT、DELETE、HEAD的支持

若是須要支持OPTIONS、TRACE,請添加DispatcherServlet在web.xml的初始化參數:dispatchOptionsRequest 和 dispatchTraceRequest 爲true。

@RequestMappings屬性之params

@Controller
public class Test {
	@RequestMapping(value="test/{fid}",method = RequestMethod.GET,params="dai")
	public void test1(@PathVariable("fid") String fid,
			@RequestParam("a")String a,HttpServletResponse res) throws IOException{
		System.out.println(fid);
		System.out.println(a);
		res.getWriter().print(a);
	}
}

此時經過訪問:http://localhost:8888/SpringMVCTest/test/12334?a=333  會出現404錯誤

須要經過訪問:http://localhost:8888/SpringMVCTest/test/12334?dai&a=333正常

若是將

params="dai"

改成

params="!dai"  訪問時參數名不帶dai便可訪問


訪問時參數名dai的值爲123時可訪問
params="dai=123"
訪問時參數名dai的值不爲123時可訪問
params="dai!=123"


方法內@解釋 

如下信息來源:http://jinnianshilongnian.iteye.com/blog/1705701

一、@RequestParam綁定單個請求參數值;

參數:

value:參數名字,即入參的請求參數名字,如username表示請求的參數區中的名字爲username的參數的值將傳入;

required:是否必須,默認是true,表示請求中必定要有相應的參數,不然將報404錯誤碼;

defaultValue:默認值,表示若是請求中沒有同名參數時的默認值,默認值能夠是SpEL表達式,如「#

若是請求中有多個同名的應該如何接收呢?如給用戶受權時,可能授予多個權限,首先看下以下代碼:

public String test(@RequestParam(value="role") String roleList)

若是請求參數相似於url?role=admin&role=user,則實際roleList參數入參的數據爲「admin,user」,即多個數據之間使用「,」分割;咱們應該使用以下方式來接收多個請求參數:

public String test(@RequestParam(value="role") String[] roleList)

或者

public String test(@RequestParam(value="list") List<String> list)

二、@PathVariable綁定URI模板變量值

@PathVariable用於將請求URL中的模板變量映射到功能處理方法的參數上。

@RequestMapping(value="/users/{userId}/topics/{topicId}")  
public String test(  
       @PathVariable(value="userId") int userId,   
       @PathVariable(value="topicId") int topicId)

如請求的URL爲「控制器URL/users/123/topics/456」,則自動將URL中模板變量{userId}和{topicId}綁定到經過@PathVariable註解的同名參數上,即入參後userId=12三、topicId=456。代碼在PathVariableTypeController中。

三、@CookieValue綁定Cookie數據值

@CookieValue用於將請求的Cookie數據映射到功能處理方法的參數上。

public String test(@CookieValue(value="JSESSIONID", defaultValue="") String sessionId)

如上配置將自動將JSESSIONID值入參到sessionId參數上,defaultValue表示Cookie中沒有JSESSIONID時默認爲空。

傳入參數類型也能夠是javax.servlet.http.Cookie類型。

 

測試代碼在CookieValueTypeController中。@CookieValue也擁有和@RequestParam相同的三個參數,含義同樣。

四、@RequestHeader綁定請求頭數據

@RequestHeader用於將請求的頭信息區數據映射到功能處理方法的參數上。

@RequestMapping(value="/header")  
public String test(  
       @RequestHeader("User-Agent") String userAgent,  
       @RequestHeader(value="Accept") String[] accepts)

如上配置將自動將請求頭「User-Agent」值入參到userAgent參數上,並將「Accept」請求頭值入參到accepts參數上。測試代碼在HeaderValueTypeController中。

 

@RequestHeader也擁有和@RequestParam相同的三個參數,含義同樣。

五、@ModelAttribute綁定參數到命令對象

@ModelAttribute一個具備以下三個做用:

①綁定請求參數到命令對象:放在功能處理方法的入參上時,用於將多個請求參數綁定到一個命令對象,從而簡化綁定流程,並且自動暴露爲模型數據用於視圖頁面展現時使用;

②暴露表單引用對象爲模型數據:放在處理器的通常方法(非功能處理方法)上時,是爲表單準備要展現的表單引用對象,如註冊時須要選擇的所在城市等,並且在執行功能處理方法(@RequestMapping註解的方法)以前,自動添加到模型對象中,用於視圖頁面展現時使用;

③暴露@RequestMapping方法返回值爲模型數據:放在功能處理方法的返回值上時,是暴露功能處理方法的返回值爲模型數據,用於視圖頁面展現時使用。


六、@SessionAttributes綁定命令對象到session

有時候咱們須要在屢次請求之間保持數據,通常狀況須要咱們明確的調用HttpSession的API來存取會話數據,如多步驟提交的表單。Spring Web MVC提供了@SessionAttributes進行請求間透明的存取會話數據。

七、@RequestBody綁定請求的內容區數據並能進行自動類型轉換等。

八、@RequestPart綁定「multipart/data」數據,除了能綁定@RequestParam能作到的請求參數外,還能綁定上傳的文件等。

相關文章
相關標籤/搜索