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

5人阅读 评论(0) 收藏 举报
分类:

一、@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";
    }
}

查看评论

springmvc常用注解之@Controller和@RequestMapping

http://my.oschina.net/zhdkn/blog/316530 文章出处,翻译过来,然后建立mvc 工程尝试
  • beibei0921
  • beibei0921
  • 2015-04-16 14:20:37
  • 1245

Spring mvc中 RequestMapping 6个基本用法小结

  • 2014年01月02日 09:24
  • 48KB
  • 下载

Spring MVC的@RequestMapping注解类的params参数用法示例

例子如下: 1、前端请求(extjs3的写法): Ext.Ajax.request({ url: 'changeResidenceServlet?action=zhifa',  method:...
  • suyu_yuan
  • suyu_yuan
  • 2017-01-11 14:33:52
  • 3528

Spring MVC 入门指南(一):HelloWorld

转帖自https://my.oschina.net/kolbe/blog/509686 spring Boot 的创建已经不需要以下某些步骤了,尤其是配置Web.xml文件的方式。这里引用只是为了弥...
  • worrydog
  • worrydog
  • 2016-12-22 09:08:49
  • 241

springMVC@RequestMapping注解详细

@RequestMapping注解详细
  • cx361006796
  • cx361006796
  • 2016-10-16 10:08:43
  • 683

springMVc @RequestMapping正则表达式模式的url

公司最近最近忙,好一些时间没有写了。今天写一个springMVC的一个很普遍的知识。有时候大家可能会遇到如下问题; @RequestMapping(method = RequestMethod....
  • qq_18416057
  • qq_18416057
  • 2017-04-08 22:12:18
  • 5228

springmvc@RequestMapping-params参数规则

@RequestMapping(value="/handle03",params="stu") public String handle03(){ return "succes...
  • qq_33439525
  • qq_33439525
  • 2017-10-10 15:29:54
  • 567

Spring MVC中常用注解之RequestMapping详解

SpringMVC和Struts2最大区别可能就是注解的使用。因为SpringMVC中可以实现在类这个层面上面配置信息,也可以在方法层面上面配置信息,既灵活又方便,不需要写大量的配置文件,也不需要写大...
  • linzhiqiang0316
  • linzhiqiang0316
  • 2016-08-25 18:15:55
  • 6288

springmvc之@Controller、@RequestMapping等注解讲解

springmvc中@Controller、@RequestMapping、@RequestParam、@RequestHeader 、@CookieValue 、@RequestBody注解的简单介...
  • zwz568017880
  • zwz568017880
  • 2015-07-12 16:10:56
  • 6964

springMVC笔记系列(4)——RequestMapping映射特定params和headers

说明:本文章的内容转载至:https://my.oschina.net/happyBKs/blog/411547 如有侵权的地方,请联系本人,本人将会立即删除!RequestMapping除了可以...
  • xinghuo0007
  • xinghuo0007
  • 2016-12-02 11:35:51
  • 2309
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 7708
    积分: 1839
    排名: 2万+