1. 程式人生 > >Spring MVC - 02 RequestMapping對映請求

Spring MVC - 02 RequestMapping對映請求

使用 @RequestMapping 對映請求

1.SpringMVC 使用@RequestMapping 註解為 控制器 指定可以處理哪些URL 請求

2. 在控制器的 類定義 及 方法定義處 都可以標註@RequestMapping

類定義處: 提供初步的請求對映資訊。 相對於 WEB 應用的根目錄

方法處: 提供進一步的細分對映資訊。相對於類定義處的URL。若類定義處未標註 @RequestMapping,則方法

處標記的URL 相對於WEB 應用的根目錄

 

3.DispatcherServlet擷取請求後,就通過控制器上@RequestMapping 提供的對映資訊確定請求所對應的處理方法。

 

 

@Controller
public class SpringMVCTest {
    public static final String SUCCESS = "success";

    @RequestMapping("/testRequestMapping")
    public String testRequestMapping(){
        System.out.println("testRequestMapping");
        return SUCCESS;
    }
}

<a href="testRequestMapping">Test RequestMapping</a>

http://localhost:8080/testRequestMapping    

 

@Controller
@RequestMapping("springmvc")
public class SpringMVCTest {
    public static final String SUCCESS = "success";

    @RequestMapping("/testRequestMapping")
    public String testRequestMapping(){
        System.out.println(
"testRequestMapping"); return SUCCESS; } }

<a href="springmvc/testRequestMapping">Test RequestMapping</a>

http://localhost:8080/springmvc/testRequestMapping  

 

對映請求引數、請求方法或請求頭

 

@RequestMapping 除了可以使用 請求URL 對映請求 外,還可以使用 請求方法、請求引數 及 請求頭對映請求

 

@ RequestMapping 的 value、method、params及 headers 分別表示 請求 URL、 請求方法、請求引數及請求頭的對映條件,它們之間是的關係。聯合使用多個條件可讓請求對映更加精確化。

 

params 和 headers 支援簡單的表示式

- param1:表示請求必須包含名為 param1的請求引數

- !param1:表示請求不能包含名為 param1的請求引數

- param1!=value1:表示請求包含名為 param1的請求引數,但其值不能為 value1

- {“param1=value1”,”param2”}:表示請求必須包含名為 param1 和 param2的兩個請求引數,且param1引數的值必須為 value1

 

    /**
     * 使用 method 屬性來指定請求方式
     * @return
     */
    @RequestMapping(value = "/testMethod", method = RequestMethod.POST)
    public String testMethod(){
        System.out.println("testMethod");
        return SUCCESS;
    }

 

<a href="springmvc/testMethod">Test Method</a><br/>

 

 

<form action="springmvc/testMethod" method="POST">
<input type="submit" value="submit"/>
</form>

    @RequestMapping(value = "/testParamsAndHeaders", params = {"username", "age!=10"})
    public String testParamsAndHeaders(){
        System.out.println("testParamsAndHeaders");
        return SUCCESS;
    }

 

<a href="springmvc/testParamsAndHeaders?username=sun&age=10">Test ParamsAndHeaders</a><br/>

報錯:
20-Oct-2018 16:39:22.796 警告 [catalina-exec-1] org.springframework.web.servlet.PageNotFound.handleNoSuchRequestHandlingMethod No matching handler method found for servlet request:
path '/springmvc/testParamsAndHeaders', method 'GET', parameters map['username' -> array<String>['sun'], 'age' -> array<String>['10']]

修改age=11 後訪問正常

 

設定 headers 

HTTP 協議報文格式

 

    @RequestMapping(value = "/testParamsAndHeaders", params = {"username", "age!=10"}, headers = {"Accept-Language=zh-CN,zh;q=0.9"})
    public String testParamsAndHeaders(){
        System.out.println("testParamsAndHeaders");
        return SUCCESS;
    }

IE 無法訪問, Chrome 可以訪問

 

 

Ant 風格資源地址

Ant 風格資源地址 支援 3種匹配符:

? : 匹配檔名中的一個字元

* : 匹配檔名中的任意字元

**: ** 匹配多層路徑

 

@RequestMapping 支援 Ant 風格的URL:

/user/*/createUser: 匹配 /user/aaa/createUser 、 /user/bbb/createUser等URL

/user/**/createUser: 匹配 /user/createUser 、 /user/aaa/bbb/createUser等URL

/user/createUser??: 匹配 /user/createUserAA 、 /user/createUserBB等URL

@RequestMapping("/testAntPath/*/abc")
public String testAntPath(){
  System.out.println("testAntPath");
  return SUCCESS;
}
<a href="/springmvc/testAntPath/mmm/abc">Test AntPath</a><br/><br/>

 

 

@ PathVariable 對映 URL 繫結的佔位符

帶佔位符的 URL 是 Spring 3.0 新增的功能,該功能在SpringMVC 向 REST 目標挺進發展過程中具有里程碑式的意義。

 

通過 @ PathVariable 可以將URL 中佔位符 引數繫結到 控制器 處理方法的入參中:

URL 中的 {xxx} 佔位符可以通過 @ PathVariable(“xxx”) 繫結到操作方法的入參中。

 

    @RequestMapping("/testPathVariable/{id}")
    public String testPathVariable(@PathVariable("id") Integer id){
        System.out.println("testPathVariable: " + id);
        return SUCCESS;
    }

 

<a href="/springmvc/testPathVariable/1">Test PathVariable</a><br/><br/>

Console:   testPathVariable: 1