@RequestMappingde的用法

摘要: 主要介绍注解@RequestMapping的用法

一、@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注解类的源码:

@Target({ElementType.METHOD, ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Mapping

public @interface RequestMapping {

        String name() default "";

        String[] value() default {};

        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请求

二、示例

1)新建一个 Web 工程,取名为 SpringMVC

2)新建一个的控制器类:UserController

package cn.slm.controller;

import org.springframework.stereotype.Controller;

@Controller

public class UserController {

        public String login() {

                 return "success";

        }

}

  

3)新建和配置 web.xml 以及 spring-mvc.xml 文件

略(具体参见 前一章:学习笔记_J2EE_SpringMVC_02_注解配置

4)新建一个测试的 JSP 页面 index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Spring MVC</title>

</head>

<body>

        <p> <a href="#">User Login</a>

</body>

</html>

  

5)新建一个成功跳转的页面 JSP 页面 welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Spring MVC</title>

</head>

<body>

        <h1>Welcome</h1>

</body>

</html>

  

三、测试 @RequestMapping 中的 value 和 path 属性(这两个属性作用相同,可以互换,如果仅有这一个属性,则可以省略,下面两个例子均采用省略的方式)

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

@Controller

public class UserController {

        @RequestMapping("/login")

        public String login() {

                 return "success";

        }

}

  

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

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

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

@Controller

@RequestMapping("/user")

public class UserController {

        @RequestMapping("/login")

        public String login() {

                 return "success";

        }

}

  

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

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

  

四、测试 @RequestMapping 的 method 属性

1)简介:

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

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

      Http规范定义了多种请求资源的方式,最基本的有四种,分别为:GET(查)、POST(增)、PUT(改)、DELETE(删),而URL则用于定位网络上的资源相当于地址的作用,配合四种请求方式,可以实现对URL对应的资源的增删改查操作。

      在实际应用中,很多人并没有按照这个规范做,因为使用GET/POST同样可以完成PUT和DELETE操作,甚至GET也可以完成POST操作,因为GET不需要用到表单,而POST却需要通过表单来发送。

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

@Controller

@RequestMapping(path = "/user")

public class UserController {

        @RequestMapping(path = "/login", method=RequestMethod.GET)

        public String login() {

                 return "success";

        }

}

  

这时,如果浏览器发来的请求不是GET的话,将收到浏览器返回的错误提示,也就是得通过链接的方式而不是表单的方式:

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

  

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

@Controller

@RequestMapping(path = "/user")

public class UserController {

        @RequestMapping(path = "/login", method=RequestMethod.POST)

        public String login() {

                 return "success";

        }

}

  

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

<form action="user/login" method="post">

    <input type="submit" value="使用Post发送请求"/>

</form>

  

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

@Controller

@RequestMapping(path = "/user")

public class UserController {

        // 该方法将同时接收通过GET和POST方式发来的请求

@RequestMapping(path = "/login", method={RequestMethod.POST,RequestMethod.GET})

        public String login() {

                 return "success";

        }

}

  

五、测试 @RequestMapping 的 params 属性

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

http://localhost/SpringMVC/user/login?username=kolbe&password=123456

  

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

@Controller

@RequestMapping(path = "/user")

public class UserController {

        // 该方法将接收 /user/login 发来的请求,且请求参数必须为 username=kolbe&password=123456

@RequestMapping(path = "/login", params={"username=kolbe","password=123456"})

        public String login() {

                 return "success";

        }

}

  

该例中则表示 UserController 中的 login() 方法仅处理 /user/login 发来的请求,且必须带有 username=kolbe&password=123456 的请求参数,否则浏览器将返回HTTP 404的错误, 对应 index.jsp 中的键接地址为:

<a href="user/login?username=kolbe&password=123456">User Login</a>

六、测试 @RequestMapping 的 headers 属性

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

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

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

如果你安装的是Chrome浏览器,可以通过在网页中  右击鼠标---->审查元素---->Network---->Name中点击网页---->右侧查看Headers即可,如果Name中没有出现网页,可以刷新一下即可,下边是我电脑中的一个请求头部示例:

Request Headers

    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

    Accept-Encoding:gzip, deflate, sdch

    Accept-Language:zh-CN,zh;q=0.8

    Cache-Control:max-age=0

    Connection:keep-alive

    Cookie:JSESSIONID=234615EE3431CWE3CD45B2376295A41A

    Host:localhost:8080

    Upgrade-Insecure-Requests:1

    User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36

  

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

@Controller

@RequestMapping(path = "/user")

public class UserController {

        // 表示只接收本机发来的请求

        @RequestMapping(path = "/login", headers="Host=localhost:8080")

        public String login() {

                 return "success";

        }

}

  

七、带占位符的URL

(一)带占位符的URL是Spring 3.0 新增的功能,可以通过 @PathVariable 将 URL 中的占位符绑定到控制器的处理方法的参数中,占位符使用{}括起来

(二)使用方法:

1)带占位符的URL示例:

@Controller

@RequestMapping(path = "/user")

public class UserController {

        @RequestMapping(value="/{id}", method=RequestMethod.GET)

        public String show(@PathVariable("id") Integer id) {

                 return "success";

        }

}

  

在这个控制器中 show() 方法将可以接收 user/1、user/2、user/3等等的路径请求,请求的方法必须为GET,使用 @PathVariable 为应用实现 REST 规范提供了具大的便利条件。

八、采用 REST 风格的 URL 请求

1)简介:REST(Representational State Transfer):(资源)表现层状态转化,它是目前最流行的一种软件架构,其结构清晰、易于理解、扩展方便且符合标准,正在越来越多的被实践到应用中。

2)REST 风格的 URL 请求

请求路径 请求方法   作用
-/user/1  HTTP GET 得到id为1的user
-/user/1   HTTP DELETE  删除id为1的user
-/user/1  HTTP PUT  更新id为1的user
-/user  HTTP POST 新增user

3)由于浏览器表单只支持 GET 和 POST 请求,为了实现 DELETE 和 PUT 请求,Spring 为我们提供了一个过滤器org.springframework.web.filter.HiddenHttpMethodFilter,可以为我们将 GET 和 POST 请求通过过滤器转化成 DELETE 和 PUT 请求。

4)在 web.xml 中配置过滤器

<!-- 配置 org.springframework.web.filter.HiddenHttpMethodFilter 过滤器 -->

<filter>

    <filter-name>hiddenHttpMethodFilter</filter-name>

    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>

</filter>    

<filter-mapping>

    <filter-name>hiddenHttpMethodFilter</filter-name>

    <!-- 拦截所有请求 -->

    <url-pattern>/*</url-pattern>

</filter-mapping>

  

5)由于浏览器表单无法发送 DELETE 和 PUT 请求,所以为了让 HiddenHttpMethodFilter 识别请求的方法,需要在表单中添加一个隐藏域,名字为 _method 值为 DELETE 或 POST 或PUT,修改后 index.jsp 页面代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Spring MVC</title>

</head>

<body>

<p>

        <!-- 得到id为1的user -->

        <a href="user/1">Test Rest GET</a>

        <!-- 新建id为1的user -->

        <form action="user" method="post">

                <input type="hidden" name="_method" value="POST"/>

                 <input type="submit" value="Test Rest POST"/>

        </form>

        <!-- 删除id为1的user -->

        <form action="user/1" method="post">

                 <input type="hidden" name="_method" value="DELETE"/>

                 <input type="submit" value="Test Rest DELETE"/>

        </form>

        <!-- 更新id为1的user -->

        <form action="user/1" method="post">

                 <input type="hidden" name="_method" value="PUT"/>

                 <input type="submit" value="Test Rest PUT"/>

        </form>

</body>

</html>

  

6)修改后的UserController代码

package cn.slm.controller;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

@Controller

@RequestMapping(path = "/user")

public class UserController {

        @RequestMapping(value="/{id}", method=RequestMethod.GET)

        public String show(@PathVariable("id") Integer id) {

                 System.out.println("查看id为:" + id + "的user");

                 return "success";

        }

        @RequestMapping(value="/{id}", method=RequestMethod.PUT)

        public String update(@PathVariable("id") Integer id) {

                 System.out.println("更新id为:" + id + "的user");

                 return "success";

        }

        @RequestMapping(value="/{id}", method=RequestMethod.DELETE)

        public String destroy(@PathVariable("id") Integer id) {

                 System.out.println("删除id为:" + id + "的user");

                 return "success";

        }

        @RequestMapping(value="", method=RequestMethod.POST)

        public String create() {

                 System.out.println("新建user");

                 return "success";

        }

}

学习笔记_J2EE_SpringMVC_03_注解配置_@RequestMapping用法的更多相关文章

  1. 学习笔记_J2EE_SpringMVC_02_注解配置

    SpringMVC注解配置 1.测试环境: 名称 版本 备注 操作系统 Windows10 专业版1809X64   WEB服务器 Tomcat 8.5 X64   浏览器 Google Chrome ...

  2. 学习笔记_J2EE_Mybatis_02_mybatis注解配置入门

    mybatis入门示例 声明式 1.概述 mybatis的注解配置版,为了偷懒,直接在之前xml版本的文件上修改的:同样为了偷懒,今天只写示例V1.0版基础配置版 ,后面再更新细节.    一个不偷懒 ...

  3. springmvc学习笔记(常用注解)

    springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...

  4. 【Ext.Net学习笔记】02:Ext.Net用法概览、Ext.Net MessageBus用法、Ext.Net布局

    Ext.Net用法概览 Ext.Net还是很强大,如果运用熟练可以极大的提高编程效率.如果你也要学习Ext.Net,原文博主推荐书籍:<Ext.Net Web 应用程序开发教程>,是英文的 ...

  5. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    Ext.Net学习笔记22:Ext.Net Tree 用法详解 上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat=&q ...

  6. Ext.Net学习笔记23:Ext.Net TabPanel用法详解

    Ext.Net学习笔记23:Ext.Net TabPanel用法详解 上面的图片中给出了TabPanel的一个效果图,我们来看一下代码: <ext:TabPanel runat="se ...

  7. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  8. go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])

    目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...

  9. Qt5学习笔记(1)-环境配置(win+64bit+VS2013)

    Qt5学习笔记(1)-环境配置 工欲善其事必先-不装-所以装软件 久不露面,赶紧打下酱油. 下载 地址:http://download.qt.io/ 这个小网页就可以下载到跟Qt有关的几乎所有大部分东 ...

随机推荐

  1. [ffmpeg] 多输入滤波同步方式(framesync)

    滤波也不总是单一的输入,也存在对多个输入流进行滤波的需求,最常见的就是对视频添加可视水印,水印的组成通常为原视频以及作为水印的图片或者小动画,在ffmpeg中可以使用overlay滤波器进行水印添加. ...

  2. [ffmpeg] 定制滤波器

    如果有定制ffmpeg滤波器的需求,有两个结构体是必须要了解的:AVFilter.AVFilterPad,所定制的滤波器主要就是通过填充这两个结构体来实现的.我们下面将详细解析这两个结构体,并通过对滤 ...

  3. BZOJ3032 七夕祭

    https://remmina.github.io/BZPRO/JudgeOnline/3032.html 题目 背景 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是TYVJ 今年举办了一次线 ...

  4. C语言函数-strcat

    strcat: 将两个char类型连接. char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s); 结果放 ...

  5. [BJOI2019]排兵布阵(动态规划)

    [BJOI2019]排兵布阵(动态规划) 题面 洛谷 题解 暴力dp: 设\(f[i][j]\)表示考虑到了第\(i\)座城市用了\(j\)人的最大收益,枚举在这个城市用多少人就可以了. 优化: 发现 ...

  6. JavaScript千分符---正则实现

    一般在JavaScript中实现千分符,是使用切割+连接一顿操作 这里尝试一下使用正则快速实现千分符 let num0 = '12' let num1 = '123' let num2 = '1234 ...

  7. 转载:curl 模拟请求

    一般情况下我们会在网页上请求后台接口,但是对于需要进行多次测试的人来说,每一次都要在网页上模拟请求,是存在很大局限性的.因此,我们需要学会模拟请求,以达到跟实际请求一样的效果. 1. curl的用法 ...

  8. 编写高质量的Python代码系列(七)之协作开发

    如果多个人要开发同一个Python程序,那就得仔细商量代码的写法了.即使你是一个人开发,也需要理解其他人所写的模块.本节讲解多人协作开发Python程序时所用的标准工具及最佳做法. 第四十九条:为每个 ...

  9. 【JS】前端文件下载(无刷新)方法总结

    #传统方法 利用iframe 或 form.submit 或 windows.open直接向后端发请求,后端返回文件流,后端处理成功后会直接返回到页面,浏览器会整理并打开自己的保存下载文件机制 . 1 ...

  10. web故障排查常用命令

    整理总结了一些常用分析网站的命令方便大家快速定位故障所在排除故障,最小化的减少故障给业务带来的影响. 端口连接类 1.查看TCP连接状态 netstat -nat |awk '{print $6}'| ...