Spring MVC 入门指南(二):@RequestMapping用法详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q343509740/article/details/79979588

一、@RequestMapping 简介

    在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置

<servlet>
    <servlet-name>servletName</servlet-name>
    <servlet-class>ServletClass</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>servletName</servlet-name>
    <url-pattern>url</url-pattern>
</servlet-mapping>

的映射作用一致。让我们先看一下RequestMapping注解类的源码:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.web.bind.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    String name() default "";

    @AliasFor("path")
    String[] value() default {};

    @AliasFor("value")
    String[] path() default {};

    RequestMethod[] method() default {};

    String[] params() default {};

    String[] headers() default {};

    String[] consumes() default {};

    String[] produces() default {};
}

1)在@Target中有两个属性,分别为 ElementType.METHOD 和 ElementType.TYPE ,也就是说 @RequestMapping 可以在方法和类的声明中使用

2)可以看到注解中的属性除了 name() 返回的字符串,其它的方法均返回数组,也就是可以定义多个属性值,例如 value() 和 path() 都可以同时定义多个字符串值来接收多个URL请求


二、准备工作:(注:部分步骤请参考Spring MVC 入门指南(一)


三、测试 @RequestMapping 中的 value 和 path 属性(这两个属性作用相同,可以互换)

1)将 @RequestMapping 注解在 login 方法上,而UserController上不添加 @RequestMapping 注解,这时的请求 URL 是相对于 Web 根目录

/**
 * Created by Ray on 2018/4/17 0017.
 */
@Controller
public class UserController {
    @RequestMapping("/login")
    public String login(){
        return "success";
    }
}

这时的方法 login() 能处理的 URL 请求路径是基于 Web 应用的,也就是 http://localhost/SpringMVC/login,也就是 views/success.jsp 页面中的 User Login 链接地址应该是:

<a href="login">User Login</a>

2)将 @RequestMapping 注解在 UserController 类上,这时类的注解是相对于 Web 根目录,而方法上的是相对于类上的路径

/**
 * Created by Ray on 2018/4/17 0017.
 */
@Controller
@RequestMapping(value = "/user")
public class UserController {
    @RequestMapping("/login")
    public String login(){
        return "success";
    }
}

这时的方法login()能处理的 URL 请求路径则是 http://localhost/SpringMVC/user/login,也就是 views/success.jsp 页面中的 User Login 链接地址应该是:

<a href="user/login">User Login</a>

四、测试 @RequestMapping 的 method 属性(默认GET)

1)简介:@RequestMapping 中的 method 主要用来定义接收浏览器发来的何种请求。在Spring中,使用枚举类

org.springframework.web.bind.annotation.RequestMethod来定义浏览器请求的方式。

2)通过 @RequestMapping(value="/login",method=RequestMethod.GET) 来指定 login()方法 仅处理通过 GET 方式发来的请求

/**
 * Created by Ray on 2018/4/17 0017.
 */
@Controller
@RequestMapping(value = "/user")
public class UserController {

    @RequestMapping(value = "/login",method = RequestMethod.GET)
    public String login(){
        return "success";
    }
}

这时,如果浏览器发来的请求不是GET的话,将收到浏览器返回的错误提示(405)


3)通过 @RequestMapping(value="/login",method=RequestMethod.POST) 来指定 login()方法 仅处理通过 POST 方式发来的请求

/**
 * Created by Ray on 2018/4/17 0017.
 */
@Controller
@RequestMapping(value = "/user")
public class UserController {

    @RequestMapping(value = "/login",method = RequestMethod.POST)
    public String login(){
        return "success";
    }
}

这时,必须通过表单的方式发送请求,否则将收到浏览器返回的错误提示(405)

4)由于在 RequestMapping 注解类中 method() 方法返回的是 RequestMethod 数组,所以可以给 method 同时指定多个请求方式

/**
 * Created by Ray on 2018/4/17 0017.
 */
@Controller
@RequestMapping(value = "/user")
public class UserController {

    @RequestMapping(value = "/login",method = {RequestMethod.POST,RequestMethod.GET})
    public String login(){
        return "success";
    }
}


五、测试 @RequestMapping 的 params 属性,该属性表示请求参数,也就是追加在URL上的键值对,多个请求参数以&隔开,例如:

http://localhost:8080/StringMVC/user/login?username=Ray&password=20180417

则这个请求的参数为username=Ray以及password=20180417,@RequestMapping 中可以使用 params 来限制请求参数,来实现进一步的过滤请求

1)@RequestMapping 的 method 属性为 GET(默认) :

/**
 * Created by Ray on 2018/4/17 0017.
 */
@Controller
@RequestMapping(value = "/user")
public class UserController {

      //参数必须为 username=Ray&password=20180417,否则出错
      @RequestMapping(value = "/login",params = {"username=Ray","password=20180417"})
    public String login(){
        return "success";
    }
}

该例中则表示 UserController 中的 login() 方法仅处理 /user/login 发来的请求,且必须带有 username=Ray&password=20180417 的请求参数,否则浏览器将返回HTTP 404的错误



2)@RequestMapping 的 method 属性为 POST :

/**
 * Created by Ray on 2018/4/17 0017.
 */
@Controller
@RequestMapping(value = "/user")
public class UserController {

      // 必须通过表单的方式发送请求且参数为"username=Ray","password=20180417" ,否则出错
      @RequestMapping(value = "/login",params = {"username=Ray","password=20180417"},method = RequestMethod.POST)
    public String login(){
        return "success";
    }
}

methodPOST.jsp

<body>

    <form action="/StringMVC/user/login" method="post">
        用户名:<input type="text" name="username"><br>
        密码:<input type="text" name="password"><br>
        <input type="submit" value="使用Post发送请求">
    </form>

</body>

success.jsp

<body>
    <%
        String username = request.getParameter("username");
        String password = request.getParameter("password");
    %>

    <h1>Welcome,<%=username %></h1>
    <h2>您的密码:<%=password %></h2>

</body>

测试:

1)参数不正确



2)参数正确




六、测试 @RequestMapping 的 headers 属性,该属性表示请求头

引用:

用于HTTP协义交互的信息被称为HTTP报文,客户端发送的HTTP报文被称为请求报文,服务器发回给客户端的HTTP报文称为响应报文,报文由报文头部和报文体组成。

请求头部(Request Headers):请求头包含许多有关客户端环境和请求正文的信息,例如浏览器支持的语言、请求的服务器地址、客户端的操作系统等。

响应头部(Rsponse Headers):响应头也包含许多有用的信息,包括服务器类型、日期、响应内容的类型及编码,响应内容的长度等等。

如果你安装的是Chrome浏览器,可以通过在网页中  右击鼠标---->检查---->Network---->F5刷新---->点击login -> Headers即可,下边是我电脑中的一个请求头部示例:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Content-Length: 30
Content-Type: application/x-www-form-urlencoded
Cookie: JSESSIONID=E4DF74783B6C64932E29B6D941980D48
Host: localhost:8080
Origin: http://localhost:8080
Referer: http://localhost:8080/StringMVC/methodGET.jsp
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36

回规正题,通过 @RequestMapping 中的 headers 属性,可以限制客户端发来的请求

/**
 * Created by Ray on 2018/4/17 0017.
 */
@Controller
@RequestMapping(path = "/user")
public class UserController {

    //表示只接收本机发来的请求
    @RequestMapping(path = "/login",headers = "Host=localhost:8080")
    public String login(){
        return "success";
    }
}

阅读更多

扫码向博主提问

Remember_Ray

有天你会让我妒忌的
  • 擅长领域:
  • SSM
去开通我的Chat快问
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页