1. 程式人生 > >【學習】springmvc之@RequestMapping對映請求

【學習】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