@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
同時也叫窄化請求映射正則表達式
@Controller public class HelloWorldController2 { @RequestMapping("/hello2","/testhello") //多URL映射同一處理方法 public ModelAndView helloWorld() { System.out.print("hello!"); ..如下省略 } }
@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同理瀏覽器
@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取值時,必須使用基本類型定義變量
@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錯誤
@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。
@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
參數:
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用於將請求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數據映射到功能處理方法的參數上。
public String test(@CookieValue(value="JSESSIONID", defaultValue="") String sessionId)
如上配置將自動將JSESSIONID值入參到sessionId參數上,defaultValue表示Cookie中沒有JSESSIONID時默認爲空。
傳入參數類型也能夠是javax.servlet.http.Cookie類型。
測試代碼在CookieValueTypeController中。@CookieValue也擁有和@RequestParam相同的三個參數,含義同樣。
@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一個具備以下三個做用:
①綁定請求參數到命令對象:放在功能處理方法的入參上時,用於將多個請求參數綁定到一個命令對象,從而簡化綁定流程,並且自動暴露爲模型數據用於視圖頁面展現時使用;
②暴露表單引用對象爲模型數據:放在處理器的通常方法(非功能處理方法)上時,是爲表單準備要展現的表單引用對象,如註冊時須要選擇的所在城市等,並且在執行功能處理方法(@RequestMapping註解的方法)以前,自動添加到模型對象中,用於視圖頁面展現時使用;
③暴露@RequestMapping方法返回值爲模型數據:放在功能處理方法的返回值上時,是暴露功能處理方法的返回值爲模型數據,用於視圖頁面展現時使用。
有時候咱們須要在屢次請求之間保持數據,通常狀況須要咱們明確的調用HttpSession的API來存取會話數據,如多步驟提交的表單。Spring Web MVC提供了@SessionAttributes進行請求間透明的存取會話數據。
七、@RequestBody綁定請求的內容區數據並能進行自動類型轉換等。
八、@RequestPart綁定「multipart/data」數據,除了能綁定@RequestParam能作到的請求參數外,還能綁定上傳的文件等。