@RequestMapping是Spring Web应用程序中最常被用到的注解之一。这个注解会将HTTP请求映射到MVC和REST控制器的处理方法上。

在这篇文章中,你将会看到@RequestMapping注解在被用来进行Spring MVC控制器方法的映射可以如何发挥其多才多艺的功能的。

一、Request Mapping基础用法

在 Spring MVC 应用程序中,RequestDispatcher (在 Front Controller 之下) 这个 servlet 负责将进入的 HTTP 请求路由到控制器的处理方法。

在对 Spring MVC 进行的配置的时候, 你需要指定请求与处理方法之间的映射关系。

要配置Web请求的映射,就需要你用上@RequestMapping注解。

@RequestMapping注解可以在控制器类的级别和/或其中的方法的级别上使用。

在类的级别上的注解会将一个特定请求或者请求模式映射到一个控制器之上。之后你还可以另外添加方法级别的注解来进一步指定到处理方法的映射关系。

下面是一个同时在类和方法上应用了@RequestMapping注解的示例:

如上述代码所示,到/home的请求会由get()方法来处理,而到/home/index的请求会由index()来处理。

二、@RequestMapping来处理多个URI

你可以将多个请求映射到一个方法上去,只需要添加一个带有请求路径值列表的@RequestMapping注解就行了。

如你在这段代码中所看到的,@RequestMapping支持统配符以及ANT风格的路径。前面这段代码中,如下的这些URL都会由indexMultipleMapping()来处理:

  • localhost:8080/home

  • localhost:8080/home/

  • localhost:8080/home/page

  • localhost:8080/home/pageabc

  • localhost:8080/home/view/

  • localhost:8080/home/view/view

三、带有@RequestParam的@RequestMapping

@RequestParam注解配合@RequestMapping 一起使用,可以将请求的参数同处理方法的参数绑定在一起。

@RequestParam注解使用的时候可以有一个值,也可以没有值。这个值指定了需要被映射到处理方法参数的请求参数, 代码如下所示:

在代码的第6行,id 这个请求参数被映射到了thegetIdByValue()这个处理方法的参数personId上。

如果请求参数和处理方法参数的名称一样的话,@RequestParam注解的value这个参数就可省掉了, 如代码的第11行所示。

@RequestParam注解的required这个参数定义了参数值是否是必须要传的。

在这段代码中,因为required被指定为false,所以getName()处理方法对于如下两个 URL 都会进行处理:

  • /home/name?person=xyz

  • /home/name

@RequestParam的defaultValue取值就是用来给取值为空的请求参数提供一个默认值的。

在这段代码中,如果person这个请求参数为空,那么getName()处理方法就会接收John这个默认值作为其参数。

四、用@RequestMapping处理HTTP的各种方法

Spring MVC的@RequestMapping注解能够处理HTTP请求的方法,比如GET, PUT, POST, DELETE以及PATCH。

所有的请求默认都会是HTTP GET类型的。

为了能降一个请求映射到一个特定的HTTP方法,你需要在@RequestMapping中使用method来声明HTTP请求所使用的方法类型,如下所示:

在上述这段代码中,@RequestMapping注解中的method元素声明了HTTP请求的HTTP方法的类型。

所有的处理处理方法会处理从这同一个URL( /home)进来的请求, 但要看指定的HTTP方法是什么来决定用哪个方法来处理。

例如,一个POST类型的请求/home会交给post()方法来处理,而一个DELETE类型的请求/home则会由delete()方法来处理。

你会看到Spring MVC将使用这样相同的逻辑来映射其它的方法。

用@RequestMapping来处理生产和消费对象

可以使用@RequestMapping注解的produces和consumes这两个元素来缩小请求映射类型的范围。

为了能用请求的媒体类型来产生对象, 你要用到@RequestMapping的produces元素再结合着@ResponseBody注解。

你也可以利用@RequestMapping的comsumes元素再结合着@RequestBody注解用请求的媒体类型来消费对象。

下面这段代码就用到的@RequestMapping的生产和消费对象元素:

在这段代码中,getProduces()处理方法会产生一个JSON响应,getConsumes()处理方法可以同时处理请求中的JSON和XML内容。

五、使用@RequestMapping来处理消息头

@RequestMapping注解提供了一个header元素来根据请求中的消息头内容缩小请求映射的范围。

在可以指定header元素的值,用myHeader = myValue这样的格式:

在上面这段代码中,@RequestMapping注解的headers属性将映射范围缩小到了post()方法。有了这个,post()方法就只会处理到/home/head并且content-typeheader被指定为text/plain这个值的请求。

你也可以像下面这样指定多个消息头:

这样,post()方法就能同时接受text/plain还有text/html的请求了。

五、使用@RequestMapping来处理请求参数

@RequestMapping直接的params元素可以进一步帮助我们缩小请求映射的定位范围。使用params元素,你可以让多个处理方法处理到同一个URL的请求, 而这些请求的参数是不一样的。

你可以用myParams = myValue这种格式来定义参数,也可以使用通配符来指定特定的参数值在请求中是不受支持的。

在这段代码中,getParams()和getParamsDifferent()两个方法都能处理相同的一个URL (/home/fetch) ,但是会根据params元素的配置不同而决定具体来执行哪一个方法。

例如,当URL是/home/fetch?id=10的时候, getParams()会执行,因为id的值是10,。对于localhost:8080/home/fetch?personId=20这个URL,getParamsDifferent()处理方法会得到执行,因为id值是 20。

六、使用@RequestMapping处理动态URI

@RequestMapping注解可以同@PathVaraible注解一起使用,用来处理动态的URI,URI的值可以作为控制器中处理方法的参数。你也可以使用正则表达式来只处理可以匹配到正则表达式的动态URI。

在这段代码中,方法getDynamicUriValue()会在发起到localhost:8080/home/fetch/10的请求时执行。这里getDynamicUriValue()方法id参数也会动态地被填充为10这个值。

方法getDynamicUriValueRegex()会在发起到localhost:8080/home/fetch/category/shirt的请求时执行。不过,如果发起的请求是/home/fetch/10/shirt的话,会抛出异常,因为这个URI并不能匹配正则表达式。

@PathVariable同@RequestParam的运行方式不同。你使用@PathVariable是为了从URI里取到查询参数值。换言之,你使用@RequestParam是为了从URI模板中获取参数值。

七、@RequestMapping默认的处理方法

在控制器类中,你可以有一个默认的处理方法,它可以在有一个向默认URI发起的请求时被执行。

下面是默认处理方法的示例:

在这段代码中,向/home发起的一个请求将会由default()来处理,因为注解并没有指定任何值。

八、@RequestMapping快捷方式

Spring 4.3引入了方法级注解的变体,也被叫做@RequestMapping的组合注解。组合注解可以更好的表达被注解方法的语义。它们所扮演的角色就是针对@RequestMapping的封装,而且成了定义端点的标准方法。

例如,@GetMapping是一个组合注解,它所扮演的是@RequestMapping(method =RequestMethod.GET)的一个快捷方式。

方法级别的注解变体有如下几个:

  • @GetMapping

  • @PostMapping

  • @PutMapping

  • @DeleteMapping

  • @PatchMapping

如下代码展示了如何使用组合注解:

在这段代码中,每一个处理方法都使用@RequestMapping的组合变体进行了注解。尽管每个变体都可以使用带有方法属性的@RequestMapping注解来互换实现, 但组合变体仍然是一种最佳的实践 — 这主要是因为组合注解减少了在应用程序上要配置的元数据,并且代码也更易读。

九、@RequestMapping总结

如你在本文中所看到的,@RequestMapping注解是非常灵活的。你可以使用该注解配置Spring MVC来处理大量的场景用例。它可以被用来在Spring MVC中配置传统的网页请求,也可以是REST风格的Web服务。

参考:

https://mp.weixin.qq.com/s?__biz=MjM5NzM0MjcyMQ==&mid=2650074354&idx=1&sn=16fc1e700b5c412a7477d1638b252e3d&chksm=bedb379c89acbe8a90e6de5b7e63ecc45d70c222bbf26be781e07b765c545f0fc2f9d30542d6&mpshare=1&scene=1&srcid=0915PidJFdVy9BiD3vhzfuH6#rd(以上内容转自此篇文章)

Spring MVC中@RequestMapping注解使用技巧(转)的更多相关文章

  1. Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法

    Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法 在Action中方法的返回值都是字符串行,一般情况是返回某个JSP,如: return "xx" ...

  2. Spring MVC 中 @ModelAttribute 注解的妙用

    Spring MVC 中 @ModelAttribute 注解的妙用 Spring MVC 提供的这种基于注释的编程模型,极大的简化了 web 应用的开发.其中 @Controller 和 @Rest ...

  3. spring 以及 spring mvc 中常用注解整理

    spring 以及 spring mvc 中常用注解整理 @RequestMapping(映射路径) @Autowired(注入 bean 对象) 例如: @Autowired private Bas ...

  4. Spring mvc中@RequestMapping 6个基本用法

    Spring mvc中@RequestMapping 6个基本用法 spring mvc中的@RequestMapping的用法.  1)最基本的,方法级别上应用,例如: Java代码 @Reques ...

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

    Spring mvc中@RequestMapping 6个基本用法小结 小结下spring mvc中的@RequestMapping的用法. 1)最基本的,方法级别上应用,例如: @RequestMa ...

  6. 转:Spring mvc中@RequestMapping 6个基本用法小结

    Spring mvc中@RequestMapping 6个基本用法小结 发表于3年前(2013-02-17 19:58)   阅读(11698) | 评论(1) 13人收藏此文章, 我要收藏 赞3 4 ...

  7. Spring MVC中基于注解的 Controller

         终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响 ...

  8. 0001 - Spring MVC中的注解

    1.概述 Spring MVC框架提供了功能强大的注解,大大简化了代码开发的同时也提升了程序的可扩展性 2.注解 2.1.@RequestMapping Spring MVC通过@RequestMap ...

  9. Spring mvc中@RequestMapping 6个基本用法小结(转载)

    小结下spring mvc中的@RequestMapping的用法. 1)最基本的,方法级别上应用,例如: @RequestMapping(value="/departments" ...

随机推荐

  1. C#与C++的区别(三) 委托与事件

    在C#中没有C++中的函数指针的概念,但是有委托的概念,功能与函数指针类似. C# 委托(Delegate) C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托(Delega ...

  2. 题解报告:poj 1321 棋盘问题(dfs)

    Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...

  3. HTML DOM getElementById() 方法

    定义和用法 getElementById() 方法可返回对拥有指定 ID 的第一个对象的引用. 语法 document.getElementById(id) 说明 HTML DOM 定义了多种查找元素 ...

  4. [转]T4系列文章之3:T4语法的介绍

    本文转自:http://www.cnblogs.com/damonlan/archive/2012/03/06/2382724.html 因为这段时间一直都没空,我也不知道有没有对人T4感兴趣,但不管 ...

  5. Windows下重置MySQL密码【MYSQL】

    使用环境:win10 x64企业版 关闭正在运行的MySQL服务. 打开DOS窗口,转到mysqlbin目录. 输入mysqld --skip-grant-tables回车.如果没有出现提示信息,那就 ...

  6. hibernate--级联添加

    级联添加操作值操作当前数据时.将关联数据也进行操作,就是保存当前数据的同事也将保存和修改关联的数据 首先绑定对象间的关系; `将多方对象添加到一方对象的集合中 tm.getStudents().add ...

  7. 关于使用Axis2 webservice 处理Fault响应时抛org.apache.axis2.AxisFault的分析

    使用Axis2这个框架进行webservice协议通讯,期间出了个问题,我(CLIENT)请求后,当服务端返回符合协议的SOAP异常报文,例如<soap:fault> ... 我的程序直接 ...

  8. python学习笔记- 补遗

    1.extend 和 append区别 extend 和 append区别 #extend接受list参数,添加每个元素至原list尾端 >>> l=[1,2,3] >> ...

  9. python学习笔记(4)——list[ ]

    发现个问题,python与C.JAVA等语言相比学习障碍最大差别居然在于版本更迭!这是python官方造的虐啊... 有时针对某问题去google答案,或者自己去博客找共性解答,会出现相互矛盾或者与你 ...

  10. RabbitMQ系列(六)--面试官问为什么要使用MQ,应该怎么回答

    如果简历中有写到使用过RabbitMQ或者其他的消息中间件,可能在MQ方面的第一个问题就是问:为什么要使用MQ 面试官期望的回答 1.项目中有什么业务场景需要用到MQ 2.但是用了MQ,会带来很多问题 ...