【學習】springmvc之@RequestMapping對映請求
1、使用簡單的@RequestMapping對映請求
使用@RequestMapping註釋來將URL對映/appointments到整個類或特定的處理程式方法。通常,類級註釋將特定的請求路徑(或路徑模式)對映到表單控制器上,其他方法級註釋縮小了特定HTTP方法請求方法(“GET”,“POST”等)的主對映,或HTTP請求引數條件。@RequestMapping一般都與@Controller配合使用
先看看下面的一個簡單的控制器
package com.spring.mvc; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping(value="front") public class FrontController { @RequestMapping(value="index") public String index(){ System.out.println("index......."); return "index"; } @RequestMapping(value="welcom") public String welcom(){ System.out.println("welcom.........."); return "welcom"; } }
上面的控制器有三處@RequestMapping,他們的value分別為front,index,welcom
首先看看value=front的@RequestMapping標籤,其作用在類名上面,表明訪問此控制的父級路徑為front,相對而言訪問其他的@RequestMapping是訪問對應方法的路徑
比如訪問index()方法的路徑為:/front/index
2、使用@RequestMapping處理POST、GET、PUT請求;
示例一、每一個請求都設定相應的請求方式
package com.spring.mvc; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping(value="front") public class FrontController { @RequestMapping(value="get",method=RequestMethod.GET) public String get(){ System.out.println("index......."); return "index"; } @RequestMapping(value="post",method=RequestMethod.POST) public String post(){ System.out.println("welcom.........."); return "index"; } @RequestMapping(value="put",method=RequestMethod.PUT) public String put(){ System.out.println("put............"); return "index"; } }
示例二、一個請求對應多個請求方式
或者這樣package com.spring.mvc; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping(value="front") public class FrontController { @RequestMapping(method=RequestMethod.GET) public String get(){ System.out.println("index......."); return "index"; } @RequestMapping(method=RequestMethod.POST) public String post(){ System.out.println("welcom.........."); return "index"; } @RequestMapping(method=RequestMethod.PUT) public String put(){ System.out.println("put............"); return "index"; } }
package com.spring.mvc;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping(value="front")
public class FrontController {
@RequestMapping(value="index",method=RequestMethod.GET)
public String get(){
System.out.println("get.......");
return "index";
}
@RequestMapping(value="index",method=RequestMethod.POST)
public String post(){
System.out.println("post..........");
return "index";
}
}
3、同一個方法對映多個請求
示例一、@RequestMapping中value引數可以是一個固定的String型別陣列
package com.spring.mvc;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value="front")
public class FrontController {
@RequestMapping(value={"/","post","get","put"})
public String index(){
System.out.println("Hello Word!");
return "index";
}
}
4、帶有@RequestParam的@RequestMapping
@RequestParam 註解配合 @RequestMapping 一起使用,可以將請求的引數同處理方法的引數繫結在一起。
@RequestParam 註解使用的時候可以有一個值,也可以沒有值。這個值指定了需要被對映到處理方法引數的請求引數,
示例一、
package com.spring.mvc;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping(value="front")
public class FrontController {
@RequestMapping(value="index")
public String index(@RequestParam(value="str") String message){
System.out.println("str:"+message);
return "index";
}
}
如果@RequestParam的value值與引數名稱一致可以省略不寫,如上面示例的程式碼只接受的請求中帶有str引數的請求
如果想要不帶引數的也訪問那麼就得使用引數required
示例二、
package com.spring.mvc;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping(value="front")
public class FrontController {
@RequestMapping(value="index")
public String index(@RequestParam(value="str",required=false) String message){
System.out.println("str:"+message);
return "index";
}
}
如果沒帶引數str或者引數str為空讓其有預設值怎麼辦,使用@RequestParam的defaultValue屬性給其加上預設值
package com.spring.mvc;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping(value="front")
public class FrontController {
@RequestMapping(value="index")
public String index(@RequestParam(value="str",required=false,defaultValue="Hi!") String message){
System.out.println("str:"+message);
return "index";
}
}
5、@RequestMapping元素之produces和consumes(很少用)
可以使用 @RequestMapping 註解的 produces 和 consumes 這兩個元素來縮小請求對映型別的範圍
為了能用請求的媒體型別來產生物件, 你要用到 @RequestMapping 的 produces 元素再結合著 @ResponseBody 註解。
你也可以利用 @RequestMapping 的 comsumes 元素再結合著 @RequestBody 註解用請求的媒體型別來消費物件。
示例一、
package com.spring.mvc;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value="frontIndex")
public class FrontIndexController {
@RequestMapping(value="index",produces={"application/JSON"})
public String index(){
return "index";
}
@RequestMapping(value="welcom",consumes={"application/JSON","application/XML"})
public String welcom(){
return "index";
}
}
在這段程式碼中,
getProduces() 處理方法會產生一個 JSON 響應, getConsumes() 處理方法可以同時處理請求中的 JSON 和 XML 內容。6、帶有訊息頭(header)的@RequestMapping請求
用@ReauestMapping只接收帶有某種或某些header的請求,引數headers是一個String型別的陣列
示例:
@RequestMapping(value="welcom",headers={"content-type=text/plain"})
public String welcom(){
System.out.println("welcom...............");
return "index";
}
7、@RequestMapping對映動態請求
什麼是動態請求:舉個例子,一個WEB網站儲存使用者的圖片的路徑是:img/id/upload,其中id是使用者的唯一標識,那麼就會產生以下資料:img/10001/upload、img/10002/upload、img/10003/upload...怎樣用請求來對映這個路徑、將id作為引數傳過來組合使用的請路過。。
使用@RequestMapping可以動態的接收請求
示例一、
@RequestMapping(value="img/{id}/upload")
public String go(){
System.out.println("Hello Word!");
return "index";
}
使用上面方法可能還不能滿足我們開發需求,比如:我們要知道是誰訪問了這個路徑該怎麼辦,那麼我就必須要獲取這個id的值了,springmvc給我們提供了@PathVariable註解
示例二、
@RequestMapping(value="img/{id}/upload")
public String go(@PathVariable String id){
System.out.println("id="+id);
return "index";
}
使用上面兩個例子可能還不能解決我們的開發需求,比如:有一些VIP使用者的id是UUID,普通使用者是純數字id,這個請求只能處理vip使用者的該怎麼,@RequestMapping註解
可以和正則表示式一起使用
示例三、
@RequestMapping(value="img/{id:[0-9a-z]{32}}/upload")
public String go(@PathVariable String id){
System.out.println("id="+id);
return "index";
}
UUID生成的方法:
/**
* 封裝JDK自帶的UUID, 通過Random數字生成, 中間無-分割.
*/
public static String uuid() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
8、@RequestMapping預設處理方法
示例一、
package com.spring.mvc;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value="img")
public class ImgController {
/**
* 預設處理方法
* */
@RequestMapping()
public String index(){
System.out.println("預設處理方法");
return "index";
}
/**
* 進入使用者首頁
**/
@RequestMapping(value = "userIndex")
public String userIndex(){
System.out.println("進入使用者首頁");
return "index";
}
}
9、@RequestMapping與@ResponseBody搭配使用
使用@RequestMapping註解方法時,返回String型別,檢視解析器(後面學習)會幫你找到相應的頁面,但是有時候不需要返回到頁面,只是返回String型別的資料到頁面。如:使用者在
修改密碼的時候,提示其與原密碼不符合;這個時候就需要@ResponseBody幫助我們,不讓檢視解析器解析這個String型別;
示例一、
@ResponseBody
@RequestMapping(value="welcom")
public String welcom(){
System.out.println("welcom...............");
return "[{flag:'success',message:'原密碼不匹配'}]";
}
Ajax提交資料一般都會與@ResponseBody一起使用,大多數返回型別都是json字串,或者是物件
示例二、
@ResponseBody
@RequestMapping(value="welcom")
public JsonResult welcom(){
JsonResult jr = new JsonResult();
jr.setFlag("success");
jr.setMessage("原密碼不符合");
return jr;
}
JsonResult
package com.spring.mvc;
public class JsonResult {
private String flag;
private String message;
private Object data;
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
10、spring4.3以上的@RequestMaping的快捷方式
Spring 4.3 引入了方法級註解的變體,也被叫做 @RequestMapping 的組合註解。組合註解可以更好的表達被註解方法的語義。它們所扮演的角色就是針對 @RequestMapping 的封裝,而且成了定義端點的標準方法。
例如,@GetMapping 是一個組合註解,它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一個快捷方式。
方法級別的註解變體有如下幾個:
-
@GetMapping
-
@PostMapping
-
@PutMapping
-
@DeleteMapping
-
@PatchMapping
如下程式碼展示瞭如何使用組合註解:
package com.spring.mvc;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value="index")
public class IndexController {
@PostMapping(value="index")
public String post(){
System.out.println("post");
return "index";
}
@GetMapping(value="index")
public String get(){
System.out.println("get");
return "index";
}
@PutMapping(value="index")
public String put(){
System.out.println("put");
return "index";
}
}
總結(重要):此篇文章是我結合spring的官方API文件和開源中國微信公眾號釋出的一篇文章整理出來的,如有不對請指出。
微信文章地址:https://mp.weixin.qq.com/s/uZzwmJb5ewukkawi0UIzYw