引言: 前段时间项目中用到了REST风格来开发程序,但是当用POST、PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request.getReader() 打出的数据里确实存在浏览器提交的数据。为了找出原因,便对参数绑定(@RequestParam、 @RequestBody、 @RequestHeader 、 @PathVariable)进行了研究,同时也看了一下HttpMessageConverter的相关内容,在此一并总结。 简介: @RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。 RequestMapping注解有六个属性,下面我们把她分成三类进行说明。 1、 value, method; value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明); method: 指定请求的method类型, GET、POST、PUT、DELETE等; 2、 consumes,produces; consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html; produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回; 3、 params,headers; params: 指定request中必须包含某些参数值是,才让该方法处理。 headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。 示例: 1、value / method 示例 默认RequestMapping("....str...")即为value的值; [java] view plaincopy @Controller @RequestMapping("/appointments") public class AppointmentsController { private final AppointmentBook appointmentBook; @Autowired public AppointmentsController(AppointmentBook appointmentBook) { this.appointmentBook = appointmentBook; } @RequestMapping(method = RequestMethod.GET) public Mapget() { return appointmentBook.getAppointmentsForToday(); } @RequestMapping(value="/{day}", method = RequestMethod.GET) public MapgetForDay(@PathVariable @DateTimeFormat(iso=ISO.DATE) Date day, Model model) { return appointmentBook.getAppointmentsForDay(day); } @RequestMapping(value="/new", method = RequestMethod.GET) public AppointmentForm getNewForm() { return new AppointmentForm(); } @RequestMapping(method = RequestMethod.POST) public String add(@Valid AppointmentForm appointment, BindingResult result) { if (result.hasErrors()) { return "appointments/new"; } appointmentBook.addAppointment(appointment); return "redirect:/appointments"; } } value的uri值为以下三类: A) 可以指定为普通的具体值; B) 可以指定为含有某变量的一类值(URI Template Patterns with Path Variables); C) 可以指定为含正则表达式的一类值( URI Template Patterns with Regular Expressions); example B) [java] view plaincopy @RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET) public String findOwner(@PathVariable String ownerId, Model model) { Owner owner = ownerService.findOwner(ownerId); model.addAttribute("owner", owner); return "displayOwner"; } example C) [java] view plaincopy @RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}.{extension:\.[a-z]}") public void handle(@PathVariable String version, @PathVariable String extension) { // ... } } 2 consumes、produces 示例 cousumes的样例: [java] view plaincopy @Controller @RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json") public void addPet(@RequestBody Pet pet, Model model) { // implementation omitted } 方法仅处理request Content-Type为“application/json”类型的请求。 produces的样例: [java] view plaincopy @Controller @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json") @ResponseBody public Pet getPet(@PathVariable String petId, Model model) { // implementation omitted } 方法仅处理request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为application/json; 3 params、headers 示例 params的样例: [java] view plaincopy @Controller @RequestMapping("/owners/{ownerId}") public class RelativePathUriTemplateController { @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue") public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) { // implementation omitted } } 仅处理请求中包含了名为“myParam”,值为“myValue”的请求; headers的样例: [java] view plaincopy @Controller @RequestMapping("/owners/{ownerId}") public class RelativePathUriTemplateController { @RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=http://www.ifeng.com/") public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) { // implementation omitted } } 仅处理request的header中包含了指定“Refer”请求头和对应值为“http://www.ifeng.com/”的请求; 上面仅仅介绍了,RequestMapping指定的方法处理哪些请求,下面一篇将讲解怎样处理request提交的数据(数据绑定)和返回的数据。

Spring MVC之@RequestMapping 详解相关推荐

  1. java处理请求的流程_Java Spring mvc请求处理流程详解

    Spring mvc请求处理流程详解 前言 spring mvc框架相信很多人都很熟悉了,关于这方面的资料也是一搜一大把.但是感觉讲的都不是很细致,让很多初学者都云里雾里的.本人也是这样,之前研究过, ...

  2. Spring MVC测试框架详解——服务端测试

    随着RESTful Web Service的流行,测试对外的Service是否满足期望也变的必要的.从Spring 3.2开始Spring了Spring Web测试框架,如果版本低于3.2,请使用sp ...

  3. 【Spring MVC学习】详解spring mvc 3.0常用注解

    Spring mvc的注解功能 1.@Controller--表示控制器 举例: @Controller public class SoftCreateController extendsSimple ...

  4. Spring mvc整合freemarker详解

    1.什么是FreeMarker FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写  FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模 ...

  5. spring mvc 常用注解详解

    @Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model , ...

  6. Spring和Ehcache整合详解

    Spring和Ehcache整合详解 一.官方主页 Spring Cache 二.概述 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点. Spring 提供了对缓存功能的抽象: ...

  7. Spring整合Schedule定时任务详解

    Spring整合Schedule定时任务详解 Spring 定时任务官方网站 一.概述 用Spring,就是为了简单. 但是我还是要总结下java定时任务实现的几种方式. 1.TimerTask,等于 ...

  8. Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解

    Spring MVC 学习总结(二)--控制器定义与@RequestMapping详解 目录 一.控制器定义 1.1.实现接口Controller定义控制器 1.2.使用注解@Controller定义 ...

  9. java 消息队列详解_Java消息队列-Spring整合ActiveMq的详解

    本篇文章主要介绍了详解Java消息队列-Spring整合ActiveMq ,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1.概述 首先和大家一起回顾一下Java 消息服 ...

最新文章

  1. opsforlist 存在贼覆盖_RedisTemplate常用集合使用说明-opsForList(三)
  2. python自定义函数数据分析_Python实现自定义函数的5种常见形式分析
  3. 带圈汉字 在线生成_手写签名在线生成器-手写签名在线生成器可复制
  4. Linux : shell基础(慕课网Linux达人养成计划课程笔记)
  5. stringbuilder删除最后一个字符_Java类-StingBuffer,StringBuilder
  6. 我花了一年时间来学机器学习
  7. php实现栏目三种类型,WordPress后台edit-tags.php里无限栏目分类实现
  8. 2018年全国多校算法寒假训练营练习比赛(第一场)G 圆圈
  9. MySQL Installer 8.0.21安装教程图文详解 转载
  10. 一些在PHPStudy部署中出现的问题解决
  11. 自定义服务器控件的元数据属性(MSDN)
  12. 汉字转拼音(较完整)
  13. zblog博客模板-zblog插件免费-支持PHP以及ASP
  14. VS2019安装和使用教程(超详细)
  15. Linux为硬盘重建MBR,linux重建mbr
  16. thing.js入门学习
  17. 升级bigsur_2年内彻底摆脱英特尔,苹果重磅发布自研Mac芯片,并对“五大系统”再升级...
  18. VGA显示器字符显示
  19. Arduino基础篇(二)-- 常用的基本函数
  20. HDU 5944 Fxx and string BestCoder Round #89 1001(细节)

热门文章

  1. Qt Creator使用自定义字体
  2. C++利用二次探查实现存储机制hash table的算法(附完整源码)
  3. vector和deque的区别?
  4. C++静态多态与动态多态
  5. 经典C语言程序100例之五九
  6. C++11 - sizeof用于类成员
  7. 南卫理公会大学计算机科学,南卫理公会大学哪个专业好?
  8. python网络编程教学_python网络编程学习初步
  9. 安装单机版RabitMQ,java操作rabitmq案例(来自同学给的资料,并做升级到最新版本修改,补充问题修改)
  10. 一文带你了解mysql sql model的only_full_group_by模式含Error 1055问题分析