Skip to content

5. 映射请求

使用@RequestMapping注解用于在类或者方法上进行声明,类上面可以没有。如果没有那么我们请求路径:url的值即为@RequestMapping注解中的路径

http://ip:port/context/url

5.1. 使用

java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

/**
 * 项目    : spring-mvc-java1
 * 创建时间 :2020/3/26  15:37 26
 * author  :jshand-root
 * site    :  http://314649444.iteye.com
 * 描述     : 测试@RequestMapping注解
 */
@Controller //让IOC容器管理组件
public class RequestController {

    //http://localhost:8080/springmvc/req1
    //http://192.168.81.3:8080/springmvc/req1
    @RequestMapping("/req1")
    public void req1(HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("测试在方法中定义@RequestMapping注解");

        PrintWriter out = response.getWriter();
        out.println("req1:"+new Date().getTime());
        out.flush();
        out.close();
    }

5.2. 在类和方法中同时存在@RequestMapping注解

java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

/**
 * 项目    : spring-mvc-java1
 * 创建时间 :2020/3/26  15:47 26
 * author  :jshand-root
 * site    :  http://314649444.iteye.com
 * 描述     : 账户的控制器
 */
@Controller
@RequestMapping("/account")
public class AccountController {

//    http://localhost:8080/springmvc/account/insert
    @RequestMapping("/insert")
    public void insert(HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("账户的插入");


        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("账户的插入:"+new Date().getTime());
        out.flush();
        out.close();
    }

    //http://localhost:8080/springmvc/account/update
    @RequestMapping("/update")
    public void update(HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("账户的修改");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("账户的修改:"+new Date().getTime());
        out.flush();
        out.close();
    }
}

5.3. @RequestMapping的其他属性

通过value匹配url,还可以配合着method、params、headers属性一起精细化的匹配

5.3.1. value

5.3.2. Method

用于匹配不同的http请求方法(POST、GET、DELETE、PUSH...7)

java
//http://localhost:8080/springmvc/req2  方法是 POST
    //http://localhost:8080/springmvc/index.jsp 上的按钮触发此次请求  方法是 POST
    @RequestMapping(value = "/req2",method ={RequestMethod.POST})
//    @RequestMapping(value = "/req2",method ={RequestMethod.POST, RequestMethod.GET})
    public void req2(HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("用于支持post请求");

        PrintWriter out = response.getWriter();
        out.println("POST request :"+new Date().getTime());
        out.flush();
        out.close();
    }
html
<form method="post" action="req2">
    <input type="submit" value="请求后端的post方法"/>
</form>

出现如下问题需要考虑方法上的RequestMapping注解是否指定了method属性

5.3.3. params

用于区分是否携带对应参数,对参数名字、值的匹配

param1: 表示请求必须包含名为 param1 的请求参数

!param1: 表示请求不能包含名为 param1 的请求参数

param1 != value1: 表示请求包含名为 param1 的请求参数,但其值不能为 value1

{“param1=value1”, “param2”}: 请求必须包含名为 param1 和param2 的两个请求参数,且 param1 参数的值必须为 value1

5.3.3.1. param1: 表示请求必须包含名为 param1 的请求参数

java
//请求路径中必须包含参数名:name
//http://127.0.0.1:8080/springmvc/req3?name=jshand
@RequestMapping(value = "/req3",params ={"name"} )
public void req3(HttpServletRequest request, HttpServletResponse response) throws IOException {
    String name = request.getParameter("name");
    System.out.println("用于支持post请求"+name);

    PrintWriter out = response.getWriter();
    out.println("name request :"+new Date().getTime()+" "+name);
    out.flush();
    out.close();
}

正确的情况:

如果不包含name参数:HTTP 400(参数、请求的问题):

5.3.3.2. !param1: 表示请求不能包含名为 param1 的请求参数

java
//请求路径中不能出现name参数
//http://127.0.0.1:8080/springmvc/req4?name=jshand   错误
//http://127.0.0.1:8080/springmvc/req4?p1=va1        √
@RequestMapping(value = "/req4",params ={"!name"} )
public void req4(HttpServletRequest request, HttpServletResponse response) throws IOException {

    System.out.println("用于支持post请求");

    PrintWriter out = response.getWriter();
    out.println("name request :"+new Date().getTime());
    out.flush();
    out.close();
}

5.3.3.3. param1=value1: 表示请求包含名为 param1 的请求参数且值等于value1;参数必须传

java
//请求路径中必须传递参数name并且值需要跟jshand一直
//http://127.0.0.1:8080/springmvc/req5?name=jshand
@RequestMapping(value = "/req5",params ={"name=jshand"} )
public void req5(HttpServletRequest request, HttpServletResponse response) throws IOException {

    System.out.println("用于支持post请求");

    PrintWriter out = response.getWriter();
    out.println("name request :"+new Date().getTime());
    out.flush();
    out.close();
}

5.3.3.4. param1!=value1: 表示请求如果包含名为 param1 的请求参数且值不能等于value1;参数可以不传

java
//请求路径中如果传递参数name并且值不等于jshand,可以不传name参数
//http://127.0.0.1:8080/springmvc/req6?name=jshand      错误
//http://127.0.0.1:8080/springmvc/req6?name=jshand112   正确
//http://127.0.0.1:8080/springmvc/req6?                  正确
@RequestMapping(value = "/req6",params ={"name!=jshand"} )
public void req6(HttpServletRequest request, HttpServletResponse response) throws IOException {

    System.out.println("用于支持post请求");

    PrintWriter out = response.getWriter();
    out.println("name request :"+new Date().getTime());
    out.flush();
    out.close();
}

5.3.4. headers

java
  //http://127.0.0.1:8080/springmvc/req7    火狐浏览器(演示机器)
//    @RequestMapping(value = "/req7" )
   @RequestMapping(value = "/req7",headers ={"User-Agent=Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:74.0) Gecko/20100101 Firefox/73.0" } )
   public void req7(HttpServletRequest request, HttpServletResponse response) throws IOException {

       System.out.println("用于支持火狐请求");

       PrintWriter out = response.getWriter();
       out.println("FireFox request :"+new Date().getTime());
       out.flush();
       out.close();
}

5.4. RequestMapping的变种

@PostMapping 相当于是 @RequestMapping(method = {RequestMethod.POST})

@GetMapping 相当于是 @RequestMapping(method = {RequestMethod.GET})

java
@GetMapping(value = "/get_mapping" )
public void getMapping(HttpServletRequest request, HttpServletResponse response) throws IOException {

    System.out.println("doGet 请求成功 ");

    PrintWriter out = response.getWriter();
    out.println("Get request :"+new Date().getTime());
    out.flush();
    out.close();
}

@PostMapping(value = "/post_mapping" )
public void postMapping(HttpServletRequest request, HttpServletResponse response) throws IOException {

    System.out.println("doPost 请求成功 ");

    PrintWriter out = response.getWriter();
    out.println("Post request :"+new Date().getTime());
    out.flush();
    out.close();
}

Released under the MIT License.