@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. hdu6198 number number number(递推公式黑科技)

    number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. lower_bound和upper_bound函数

    lower_bound(ForwardIter first,ForwardIter last,const_TP & val) upper_bound(ForwardIter first,For ...

  3. 二分图判定+点染色/并查集 BestCoder Round #48 ($) 1002 wyh2000 and pupil

    题目传送门 /* 二分图判定+点染色:因为有很多联通块,要对所有点二分图匹配,若不能,存在点是无法分配的,no 每一次二分图匹配时,将点多的集合加大最后第一个集合去 注意:n <= 1,no,两 ...

  4. HTML基础2——综合案例3——创建考试报名表格

    <html> <head> <title></title> </head> <body> <table width=&qu ...

  5. LN : leetcode 263 Ugly Number

    lc 263 Ugly Number lc 263 Ugly Number Write a program to check whether a given number is an ugly num ...

  6. JAVA使用Ldap操作AD域

    项目上遇到的需要在集成 操作域用户的信息的功能,第一次接触ad域,因为不了解而且网上其他介绍不明确,比较费时,这里记录下. 说明: (1). 特别注意:Java操作查询域用户信息获取到的数据和域管理员 ...

  7. Scala-基础-流程控制语句

    import junit.framework.TestCase import scala.util.control.Breaks._ //流程控制语句 //关键字 if else match clas ...

  8. servU服务器连接不上问题的解决

    在服务器上安装了servU64位版,建立了用户,设置了防火墙,正常启动. 但在客户端发出FTP://服务器IP 命令后,弹出输入用户名和密码的对话框,输入正确的用户名和密码后,却始终连接不上. ftp ...

  9. jq微信分享

    (function() { var weChat = { init: function() { this.getData(); }, getData: function() { $.ajax({ ty ...

  10. acedssget

    大多数ObjectARX函数在处理选择集和实体时,都用名字来识别选择集或实体,该名字用一个长整型对来表示的,并对AutoCAD来维护.在ObjectARX中,该名字的类型为ads_name.在对选择集 ...