@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. Windows平台下Oracle实例启动过程中日志输出

    Windows平台下Oracle实例启动过程中日志输出记录. 路径:D:\app\Administrator\diag\rdbms\orcl\orcl\trace\alert_orcl.log 输出内 ...

  2. Android 性能优化(26)*性能工具之「Batterystats,Battery Historian」Batterystats & Battery Historian Walkthrough

    Batterystats & Battery Historian Walkthrough Working with Batterystats & Battery Historian B ...

  3. Modbus消息帧

    两种传输模式中(ASCII和RTU),传输设备以将Modbus消息转为有起点和终点的帧,这就允许接收的设备在消息起始处开始工作,读地址分配信息,判断哪一个设备被选中(广播方式则传给所以设备),判知何时 ...

  4. shell编程中一个空格引起的异常

    最近使用shell编写一个备份和替换f服务器程序的脚本replace.sh,初衷是为了节约人力的重复机械的劳动.在脚本编写过程中,由于疏忽多打了一个空格,出现了一个不符合预期的情况. 1.先看一下出问 ...

  5. POJ_1083_(思维)

    Moving Tables Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31511   Accepted: 10528 D ...

  6. 怎么忽略ESLint校验

    方法一: 打开eslint的配置文件.eslintrc.js rules: { // allow async-await 'generator-star-spacing': 'off', // all ...

  7. CAD从二制流数据中加载图形(com接口Delphi语言)

    主要用到函数说明: _DMxDrawX::ReadBinStream 从二制流数据中加载图形,详细说明如下: 参数 说明 VARIANT varBinArray 二制流数据,是个byte数组 BSTR ...

  8. CAD如何直接打印,不出现打印对话框?

    主要用到函数说明: MxDrawXCustomFunction::Mx_Print 直接打印,不出现打印对话框,详细说明如下: 参数 说明 double ptLBx 打印的范围左下角x double ...

  9. java虚拟机(三)--HotSpot 对象

    普通对象的创建(不包括数组和class对象): 当虚拟机遇到new指令时,会在常量池中检查是否包含这个类的符号引用(全限定名),通过这个确定是否经过类加载的过程,如果true,为该 对象分配内存,对象 ...

  10. iOS-关于一些手势冲突问题(scrollView 嵌套 tableView)

    简单说下关于开发中容易遇到的父试图添加手势与子试图点击事件冲突,UIScrollView 嵌套 UIScrollView . UIScrollView 嵌套 UITableView的情况手势冲突问题: ...