第二章:@RequestMapping注解參數method和params


  • 項目結構:

 

  •  配置文件及其他初始代碼

    • web.xml
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
 5          version="4.0">
 6     <servlet>
 7         <servlet-name>springMVC</servlet-name>
 8         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 9     </servlet>
10     <servlet-mapping>
11         <servlet-name>springMVC</servlet-name>
12         <url-pattern>/</url-pattern>
13     </servlet-mapping>
14 </web-app>
    • springMVC-servlet.xml
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 6 
 7     <context:component-scan base-package="com.iwakan.controller"/>
 8     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 9         <!--
10         /WEB-INF下的東西不能直接訪問,只能通過轉發進行訪問。
11         轉發和重定向的區別在於,地址發布發生變化,重定向地址發生變化,
12         如果用重定向訪問的化話,又相當於直接訪問WEB-INF下的頁面了
13         -->
14         <property name="prefix" value="/WEB-INF/view/"/>
15         <property name="suffix" value=".jsp"></property>
16     </bean>
17 </beans>
    • TestController.java
 1 package com.iwakan.controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5 
 6 @Controller
 7 public class TestController {
 8     /**
 9      * /test中的‘/’加不加都可以:
10      * 加上【/】代表訪問當前項目下
11      * 不加【/】代表訪問當前目錄下
12      * 因為src和web的訪問級別是一樣的
13      */
14 
15     @RequestMapping("/test")
16     public String test(){
17         return "success";
18     }
19 }
    • index.jsp
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
2 <html>
3   <head>
4     <title>init</title>
5   </head>
6   <body>
7   <a href="/test">測試springMVC</a>
8   </body>
9 </html>

 

  • 內容講解

  • @RequestMapping

    • 作用:設置請求映射,把請求和控制層中的方法設置映射關系,當請求路徑和@RequestMapping的value屬性一致時,即注解所標注的方法即為處理請求的方法
    • 下面為@RequestMapping的源碼:
 1 @Target({ElementType.METHOD, ElementType.TYPE})
 2 @Retention(RetentionPolicy.RUNTIME)
 3 @Documented
 4 @Mapping
 5 public @interface RequestMapping {
 6     String name() default "";
 7 
 8     @AliasFor("path")
 9     String[] value() default {};
10 
11     @AliasFor("value")
12     String[] path() default {};
13 
14     RequestMethod[] method() default {};
15 
16     String[] params() default {};
17 
18     String[] headers() default {};
19 
20     String[] consumes() default {};
21 
22     String[] produces() default {};
23 }
    •  參數:

      • method:
        • 用來設置請求方式,只有客戶端發送的請求的方式和method的值一致時,才能處理請求
        • 請求方式:GET(查詢),POST(添加),DELETE(刪除),PUT(修改)
      • value:
        • 用來設置請求路徑,當請求路徑和@RequestMapping的value屬性一致時,才能處理請求
      • params:
        • 用來設置客戶端傳到服務端的參數,支持表達式
        • 例如:params="username":表示發送過來的請求參數中要包含username
          params="!username":表示發送過來的請求參數中不能包含username
          params="username=admin":表示發送過來的請求參數中要包含username=admin
          params="username=admin":表示發送過來的請求參數中要包含username=admin
          params={"username","age!=12"}:表示發送過來的請求參數中要包含username並且age不等12的參數
      • heards:
        • headers:用來設置請求頭信息,所發送的請求的請求頭信息一定要和headers屬性中設置的一致

 

關於上面參數的代碼案例:

index.jsp

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3   <head>
 4     <title>init</title>
 5   </head>
 6   <body>
 7   <a href="/test">測試GET</a>
 8   <form action="/test" method="post">
 9       <input type="submit" value="測試POST">
10   </form>
11   </body>
12 </html>

 

TestController.java

 1 package com.iwakan.controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5 import org.springframework.web.bind.annotation.RequestMethod;
 6 
 7 @Controller
 8 public class TestController {
 9     /**
10      * /test中的‘/’加不加都可以:
11      * 加上【/】代表訪問當前項目下
12      * 不加【/】代表訪問當前目錄下
13      * 因為src和web的訪問級別是一樣的
14      *
15      *@RequestMapping:
16      * 設置請求映射,把請求和控制層中的方法設置映射關系,
17      * 當請求路徑和@RequestMapping的value屬性一致時,
18      * 即注解所標注的方法即為處理請求的方法
19      *
20      * method:用來設置請求方式,只有客戶端發送請求的方式和method的值一致時,才能處理請求
21      * 請求方式:GET(查詢),POST(添加),DELETE(刪除),PUT(修改)
22      *
23      *
24      */
25 
26     @RequestMapping(value = "/test",method = RequestMethod.GET)
27     public String testGet(){
28         System.out.println("GET請求的方法");
29         return "success";
30     }
31 
32     @RequestMapping(value = "/test",method = RequestMethod.POST)
33     public String testPost(){
34         System.out.println("POST請求的方法");
35         return "success";
36     }
37 }

 

    •  客戶端發出請求,相同的請求路徑,服務端會根據請求方法的不同選擇不同的處理方法,
    •  例如當客戶端以GET方式發出請求時,控制層會以testGet()進行處理,客戶端以POST方式發出請求時,控制層會用testPost()放到進行處理。

 

 

 

 

 

 

 

 

 

 

 

 

  • 根據傳遞的參數的不同映射不同處理方法
  • 需求發送過來的請求參數中要包含username並且age不等12時才進行處理

TestController.java

 

 1 package com.iwakan.controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5 import org.springframework.web.bind.annotation.RequestMethod;
 6 
 7 @Controller
 8 public class TestController {
 9     /**
10      * /test中的‘/’加不加都可以:
11      * 加上【/】代表訪問當前項目下
12      * 不加【/】代表訪問當前目錄下
13      * 因為src和web的訪問級別是一樣的
14      *
15      *@RequestMapping:
16      * 設置請求映射,把請求和控制層中的方法設置映射關系,
17      * 當請求路徑和@RequestMapping的value屬性一致時,
18      * 即注解所標注的方法即為處理請求的方法
19      *
20      * method:用來設置請求方式,只有客戶端發送請求的方式和method的值一致時,才能處理請求
21      * 請求方式:GET(查詢),POST(添加),DELETE(刪除),PUT(修改)
22      *
23      * params:用來設置客戶端傳到服務器的參數,支持表達式
24      * 例如:params="username":表示發送過來的請求參數中要包含username
25      *      params="!username":表示發送過來的請求參數中不能包含username
26      *      params="username=admin":表示發送過來的請求參數中要包含username=admin
27      *      params="username!=admin":表示發送過來的請求參數中要包含username!=admin
28      *      params={"username","age!=12"}:表示發送過來的請求參數中要包含username並且age不等12的參數
29      *
30      *
31      */
32 
33     @RequestMapping(value = "/test",method = RequestMethod.GET,params = {"username","age=12"})
34     public String testGet(String username,int age){
35         System.out.println("GET請求的方法");
36         System.out.println("username=="+username+",age=="+age);
37         return "success";
38     }
39 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 根據請求頭的不同映射不同的處理方法

TestController.java

 1 package com.iwakan.controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5 import org.springframework.web.bind.annotation.RequestMethod;
 6 
 7 @Controller
 8 public class TestController {
 9     /**
10      * /test中的‘/’加不加都可以:
11      * 加上【/】代表訪問當前項目下
12      * 不加【/】代表訪問當前目錄下
13      * 因為src和web的訪問級別是一樣的
14      *
15      * @RequestMapping: 設置請求映射,把請求和控制層中的方法設置映射關系,
16      * 當請求路徑和@RequestMapping的value屬性一致時,
17      * 即注解所標注的方法即為處理請求的方法
18      * <p>
19      * method:用來設置請求方式,只有客戶端發送請求的方式和method的值一致時,才能處理請求
20      * 請求方式:GET(查詢),POST(添加),DELETE(刪除),PUT(修改)
21      * <p>
22      * params:用來設置客戶端傳到服務器的參數,支持表達式
23      * 例如:params="username":表示發送過來的請求參數中要包含username
24      * params="!username":表示發送過來的請求參數中不能包含username
25      * params="username=admin":表示發送過來的請求參數中要包含username=admin
26      * params="username!=admin":表示發送過來的請求參數中要包含username!=admin
27      * params={"username","age!=12"}:表示發送過來的請求參數中要包含username並且age不等12的參數
28      * <p>
29      * headers:用來設置請求頭信息,所發送的請求的請求頭信息一定要和headers屬性中設置的一致
30      */
31     @RequestMapping(value = "/test", method = RequestMethod.POST, params = {"username", "age=13"},headers = {"Accept-Language=zh-CN,zh;q=0.9"})
32     public String testPost(String username, int age) {
33         System.out.println("POST請求的方法");
34         System.out.println("username==" + username + ",age==" + age);
35         return "success";
36     }
37 }

 

 

 

 

 

 

    •  @RequestMapping作用位置

      • @Target({ElementType.METHOD, ElementType.TYPE}):既可以加在類上也可以加在方法上
      • 訪問:若類上和方法上都加有,應該一層一層的訪問,先訪問類再訪問方法

      

 1 package com.iwakan.controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5 import org.springframework.web.bind.annotation.RequestMethod;
 6 
 7 @Controller
 8 @RequestMapping("/mvc")
 9 public class TestController {
10     /**
11      * /test中的‘/’加不加都可以:
12      * 加上【/】代表訪問當前項目下
13      * 不加【/】代表訪問當前目錄下
14      * 因為src和web的訪問級別是一樣的
15      *
16      * @RequestMapping: 設置請求映射,把請求和控制層中的方法設置映射關系,
17      * 當請求路徑和@RequestMapping的value屬性一致時,
18      * 即注解所標注的方法即為處理請求的方法
19      * @RequestMapping位置: 既可以放在類上,也可以放在方法上
20      * 訪問時應該一層一層進行訪問,先訪問類在訪問方法
21      *
22      * <p>
23      * method:用來設置請求方式,只有客戶端發送請求的方式和method的值一致時,才能處理請求
24      * 請求方式:GET(查詢),POST(添加),DELETE(刪除),PUT(修改)
25      * <p>
26      * params:用來設置客戶端傳到服務器的參數,支持表達式
27      * 例如:params="username":表示發送過來的請求參數中要包含username
28      * params="!username":表示發送過來的請求參數中不能包含username
29      * params="username=admin":表示發送過來的請求參數中要包含username=admin
30      * params="username!=admin":表示發送過來的請求參數中要包含username!=admin
31      * params={"username","age!=12"}:表示發送過來的請求參數中要包含username並且age不等12的參數
32      * <p>
33      * headers:用來設置請求頭信息,所發送的請求的請求頭信息一定要和headers屬性中設置的一致
34      */
35 
36     @RequestMapping(value = "/test")
37     public String testPost(String username, int age) {
38         System.out.println("POST請求的方法");
39         System.out.println("username==" + username + ",age==" + age);
40         return "success";
41     }
42 }

訪問路徑為:http://localhost:8080/mvc/test

index.jsp

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3   <head>
 4     <title>init</title>
 5   </head>
 6   <body>
 7   <a href="/mvc/test">測試GET</a>
 8   <form action="/mvc/test" method="post">
 9       用戶名:<input name="username" ><br>
10       年  齡:<input name="age" ><br>
11       <input type="submit" value="測試POST">
12   </form>
13   </body>
14 </html>

 

 

 

 

 

 

    •  RequestMapping支持Ant路徑風格

      • Ant風格資源地址支持3中匹配符

匹配文件名中的一個字符

*:匹配文件名中的任意字符

**匹配多層路徑

 

      • @RequestMapping還支持Ant風格的URL

/user/*/createUser

匹配/user/aaa/createUser,/user/bbb/createUser等URL

/user/**/createUser

匹配/user/createUser,/user/aaa/bbb/creatUser等URL

/user/createUser??

匹配/user/createUseraa/user/createUserbb等URL

TestController.java

 1 package com.iwakan.controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5 import org.springframework.web.bind.annotation.RequestMethod;
 6 
 7 @Controller
 8 @RequestMapping("/user")
 9 public class TestController {
10 
11     /**
12      * SpringMVC支持Ant方式的請求路徑
13      * 在Ant中,有三種匹配符
14      * 【*】:任意字符
15      * 【?】:任意一個字符
16      * 【**】:任意多層目錄
17      */
18     @RequestMapping("/*/createUser??")
19     public String createUser(){
20         return "success";
21     }
22 }

 

 

 

 

 TestController.java

 

 1 package com.iwakan.controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5 import org.springframework.web.bind.annotation.RequestMethod;
 6 
 7 @Controller
 8 @RequestMapping("/user")
 9 public class TestController {
10 
11     /**
12      * SpringMVC支持Ant方式的請求路徑
13      * 在Ant中,有三種匹配符
14      * 【*】:任意字符
15      * 【?】:任意一個字符
16      * 【**】:任意多層目錄
17      */
18     @RequestMapping("/**/createUser")
19     public String createUser(){
20         return "success";
21     }
22 }

 

 

 

 

 

 

    •  springMVC映射請求占位符@PathVariable注解

      @PathVariable:帶占位符的URL是spring3.0新增的功能,該功能在springMVC向Rest目標挺進發展過程中具有里程牌的意義。

      通過@PathVariable可以將URL中占位符參數綁定到控制器處理方法的入參中

      例如:@RequestMapping("/testRest/{id}/{username}")

         public String testRest(@PathVariable("id") Integer id, @PathVariable("username") String username){

      URL中的{id},{username}占位符可以通過@PathVariable("id"),@PathVariable("username")綁定到操作方法的入參 Integer idString username

 1 package com.iwakan.controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.PathVariable;
 5 import org.springframework.web.bind.annotation.RequestMapping;
 6 import org.springframework.web.bind.annotation.RequestMethod;
 7 
 8 @Controller
 9 @RequestMapping("/user")
10 public class TestController {
11 
12     /**
13      * 以前:localhost:8080/user/testRest?id=1001&username=admin
14      * 現在:localhost:8080/user/testRest/1001/admin
15      *
16      * @PathVariable: 可以將請求url中的請求參數傳遞到請求方法的入參中
17      */
18     @RequestMapping("/testRest/{id}/{username}")
19     public String testRest(@PathVariable("id") Integer id, @PathVariable("username") String username) {
20         System.out.println("id==" + id + ",username==" + username);
21         return "success";
22     }
23 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM