spring mvc常用注解的说明
spring mvc常用注解的说明
最近一段时间学习了springboot,所以熟悉一下mvc中常用的注解,这样可以方便开发
简介:
@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的值;
1 @Controller 2 @RequestMapping("/appointments") 3 public class AppointmentsController { 4 5 private AppointmentBook appointmentBook; 6 7 @Autowired 8 public AppointmentsController(AppointmentBook appointmentBook) { 9 this.appointmentBook = appointmentBook; 10 } 11 12 @RequestMapping(method = RequestMethod.GET) 13 public Map<String, Appointment> get() { 14 return appointmentBook.getAppointmentsForToday(); 15 } 16 17 @RequestMapping(value="/{day}", method = RequestMethod.GET) 18 public Map<String, Appointment> getForDay(@PathVariable @DateTimeFormat(iso=ISO.DATE) Date day, Model model) { 19 return appointmentBook.getAppointmentsForDay(day); 20 } 21 22 @RequestMapping(value="/new", method = RequestMethod.GET) 23 public AppointmentForm getNewForm() { 24 return new AppointmentForm(); 25 } 26 27 @RequestMapping(method = RequestMethod.POST) 28 public String add(@Valid AppointmentForm appointment, BindingResult result) { 29 if (result.hasErrors()) { 30 return "appointments/new"; 31 } 32 appointmentBook.addAppointment(appointment); 33 return "redirect:/appointments"; 34 } 35 }
value的uri值为以下三类:
A) 可以指定为普通的具体值;
B) 可以指定为含有某变量的一类值(URI Template Patterns with Path Variables);
C) 可以指定为含正则表达式的一类值( URI Template Patterns with Regular Expressions);
example B)
@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)
@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的样例:
@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的样例:
@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的样例:
![](/assets/blank.gif)
@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} }
![](/assets/blank.gif)
仅处理请求中包含了名为“myParam”,值为“myValue”的请求;
headers的样例:
![](/assets/blank.gif)
@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} }
![](/assets/blank.gif)
@RequestBody
作用:
i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
使用时机:
A) GET、POST方式提时, 根据request header Content-Type的值来判断:
- application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
- multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
- 其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);
B) PUT方式提交时, 根据request header Content-Type的值来判断:
- application/x-www-form-urlencoded, 必须;
- multipart/form-data, 不能处理;
- 其他格式, 必须;
说明:request的body部分的数据编码格式由header部分的Content-Type指定;
@ResponseBody
作用:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
HttpMessageConverter
![](/assets/blank.gif)
<span style="font-family:Microsoft YaHei;">/*** Strategy interface that specifies a converter that can convert from and to HTTP requests and responses.** @author Arjen Poutsma* @author Juergen Hoeller* @since 3.0*/ public interface HttpMessageConverter<T> {/*** Indicates whether the given class can be read by this converter.* @param clazz the class to test for readability* @param mediaType the media type to read, can be {@code null} if not specified.* Typically the value of a {@code Content-Type} header.* @return {@code true} if readable; {@code false} otherwise*/boolean canRead(Class<?> clazz, MediaType mediaType);/*** Indicates whether the given class can be written by this converter.* @param clazz the class to test for writability* @param mediaType the media type to write, can be {@code null} if not specified.* Typically the value of an {@code Accept} header.* @return {@code true} if writable; {@code false} otherwise*/boolean canWrite(Class<?> clazz, MediaType mediaType);/*** Return the list of {@link MediaType} objects supported by this converter.* @return the list of supported media types*/List<MediaType> getSupportedMediaTypes();/*** Read an object of the given type form the given input message, and returns it.* @param clazz the type of object to return. This type must have previously been passed to the* {@link #canRead canRead} method of this interface, which must have returned {@code true}.* @param inputMessage the HTTP input message to read from* @return the converted object* @throws IOException in case of I/O errors* @throws HttpMessageNotReadableException in case of conversion errors*/T read(Class<? extends T> clazz, HttpInputMessage inputMessage)throws IOException, HttpMessageNotReadableException;/*** Write an given object to the given output message.* @param t the object to write to the output message. The type of this object must have previously been* passed to the {@link #canWrite canWrite} method of this interface, which must have returned {@code true}.* @param contentType the content type to use when writing. May be {@code null} to indicate that the* default content type of the converter must be used. If not {@code null}, this media type must have* previously been passed to the {@link #canWrite canWrite} method of this interface, which must have* returned {@code true}.* @param outputMessage the message to write to* @throws IOException in case of I/O errors* @throws HttpMessageNotWritableException in case of conversion errors*/void write(T t, MediaType contentType, HttpOutputMessage outputMessage)throws IOException, HttpMessageNotWritableException;} </span>
![](/assets/blank.gif)
该接口定义了四个方法,分别是读取数据时的 canRead(), read() 和 写入数据时的canWrite(), write()方法。
在使用 <mvc:annotation-driven />标签配置时,默认配置了RequestMappingHandlerAdapter(注意是
RequestMappingHandlerAdapter不是AnnotationMethodHandlerAdapter,详情查看Spring 3.1 document “16.14 Configuring Spring MVC”章节),并为他配置了一下默认的HttpMessageConverter:
![](/assets/blank.gif)
ByteArrayHttpMessageConverter converts byte arrays.StringHttpMessageConverter converts strings.ResourceHttpMessageConverter converts to/from org.springframework.core.io.Resource for all media types.SourceHttpMessageConverter converts to/from a javax.xml.transform.Source.FormHttpMessageConverter converts form data to/from a MultiValueMap<String, String>.Jaxb2RootElementHttpMessageConverter converts Java objects to/from XML — added if JAXB2 is present on the classpath.MappingJacksonHttpMessageConverter converts to/from JSON — added if Jackson is present on the classpath.AtomFeedHttpMessageConverter converts Atom feeds — added if Rome is present on the classpath.RssChannelHttpMessageConverter converts RSS feeds — added if Rome is present on the classpath.
![](/assets/blank.gif)
ByteArrayHttpMessageConverter: 负责读取二进制格式的数据和写出二进制格式的数据;
StringHttpMessageConverter: 负责读取字符串格式的数据和写出二进制格式的数据;
ResourceHttpMessageConverter:负责读取资源文件和写出资源文件数据;
FormHttpMessageConverter: 负责读取form提交的数据(能读取的数据格式为 application/x-www-form-urlencoded,不能读取multipart/form-data格式数据);负责写入application/x-www-from-urlencoded和multipart/form-data格式的数据;
MappingJacksonHttpMessageConverter: 负责读取和写入json格式的数据;
SouceHttpMessageConverter: 负责读取和写入 xml 中javax.xml.transform.Source定义的数据;
Jaxb2RootElementHttpMessageConverter: 负责读取和写入xml 标签格式的数据;
AtomFeedHttpMessageConverter: 负责读取和写入Atom格式的数据;
RssChannelHttpMessageConverter: 负责读取和写入RSS格式的数据;
当使用@RequestBody和@ResponseBody注解时,
RequestMappingHandlerAdapter就使用它们来进行读取或者写入相应格式的数据。
HttpMessageConverter匹配过程:
@RequestBody注解时: 根据Request对象header部分的Content-Type类型,逐一匹配合适的HttpMessageConverter来读取数据;
spring 3.1源代码如下:
![](/assets/blank.gif)
private Object readWithMessageConverters(MethodParameter methodParam, HttpInputMessage inputMessage, Class paramType)throws Exception {MediaType contentType = inputMessage.getHeaders().getContentType();if (contentType == null) {StringBuilder builder = new StringBuilder(ClassUtils.getShortName(methodParam.getParameterType()));String paramName = methodParam.getParameterName();if (paramName != null) {builder.append(' ');builder.append(paramName);}throw new HttpMediaTypeNotSupportedException("Cannot extract parameter (" + builder.toString() + "): no Content-Type found");}List<MediaType> allSupportedMediaTypes = new ArrayList<MediaType>();if (this.messageConverters != null) {for (HttpMessageConverter<?> messageConverter : this.messageConverters) {allSupportedMediaTypes.addAll(messageConverter.getSupportedMediaTypes());if (messageConverter.canRead(paramType, contentType)) {if (logger.isDebugEnabled()) {logger.debug("Reading [" + paramType.getName() + "] as \"" + contentType+"\" using [" + messageConverter + "]");}return messageConverter.read(paramType, inputMessage);}}}throw new HttpMediaTypeNotSupportedException(contentType, allSupportedMediaTypes);}
![](/assets/blank.gif)
@ResponseBody注解时: 根据Request对象header部分的Accept属性(逗号分隔),逐一按accept中的类型,去遍历找到能处理的HttpMessageConverter;
源代码如下:
![](/assets/blank.gif)
private void writeWithMessageConverters(Object returnValue,HttpInputMessage inputMessage, HttpOutputMessage outputMessage)throws IOException, HttpMediaTypeNotAcceptableException {List<MediaType> acceptedMediaTypes = inputMessage.getHeaders().getAccept();if (acceptedMediaTypes.isEmpty()) {acceptedMediaTypes = Collections.singletonList(MediaType.ALL);}MediaType.sortByQualityValue(acceptedMediaTypes);Class<?> returnValueType = returnValue.getClass();List<MediaType> allSupportedMediaTypes = new ArrayList<MediaType>();if (getMessageConverters() != null) {for (MediaType acceptedMediaType : acceptedMediaTypes) {for (HttpMessageConverter messageConverter : getMessageConverters()) {if (messageConverter.canWrite(returnValueType, acceptedMediaType)) {messageConverter.write(returnValue, acceptedMediaType, outputMessage);if (logger.isDebugEnabled()) {MediaType contentType = outputMessage.getHeaders().getContentType();if (contentType == null) {contentType = acceptedMediaType;}logger.debug("Written [" + returnValue + "] as \"" + contentType +"\" using [" + messageConverter + "]");}this.responseArgumentUsed = true;return;}}}for (HttpMessageConverter messageConverter : messageConverters) {allSupportedMediaTypes.addAll(messageConverter.getSupportedMediaTypes());}}throw new HttpMediaTypeNotAcceptableException(allSupportedMediaTypes);}
![](/assets/blank.gif)
补充:
MappingJacksonHttpMessageConverter 调用了 objectMapper.writeValue(OutputStream stream, Object)方法,使用@ResponseBody注解返回的对象就传入Object参数内。若返回的对象为已经格式化好的json串时,不使用@RequestBody注解,而应该这样处理:
1、response.setContentType("application/json; charset=UTF-8");
2、response.getWriter().print(jsonStr);
直接输出到body区,然后的视图为void。
spring mvc常用注解的说明相关推荐
- Spring MVC常用注解说明
2019独角兽企业重金招聘Python工程师标准>>> 使用Spring MVC的注解及其用法和其它相关知识来实现控制器功能. 02 之前在使用Struts2实现MV ...
- Spring MVC常用注解,你会几个?
转载自 Spring MVC常用注解,你会几个? 常用注解 Controller 注解一个类表示控制器,Spring MVC会自动扫描标注了这个注解的类. RequestMapping 请求路径映射, ...
- Spring MVC常用注解--“姐妹花”@RequestBody和@ResponseBody
1. 引言 在这篇短文中,我们简要地介绍了Spring MVC中常用的注解 @RequestBody和@ResponseBody. 2. @RequestBody 简单地说,在@RequestBody ...
- Spring MVC 常用注解之 Controller 篇
Shopping Without Vision 的 project 终于告一段落,teamwork 非常给力,中间也遇到很多困难,还好都一起克服了.这是做的第二个 Spring MVC 项目了,对这 ...
- Spring MVC常用注解汇总
@Controller @Controller注解在类上,表明这个类是Spring MVC里的Controller,将其声明为Spring的一个Bean,Dispatch Servlet会自动扫描注解 ...
- spring mvc 常用注解详解
@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model , ...
- 40 个 Spring Boot 常用注解
以下文章来源方志朋的博客,回复"666"获面试宝典 作者 | 谭朝红 链接 | ramostear.com 一.Spring Web MVC 与 Spring Bean 注解 Sp ...
- 近100个Spring/SpringBoot常用注解汇总!
作者 | Guide 来源 | JavaGuide(微信公众号) 毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我 ...
- 接近8000字的Spring/SpringBoot常用注解总结!安排!
文章目录 0.前言 1. `@SpringBootApplication` 2. Spring Bean 相关 2.1. `@Autowired` 2.2. `Component`,`@Reposit ...
最新文章
- Unity3d创建注册登录页面(1)
- 进阶学习(4.4) JVM GC Root 判定, 垃圾的判定
- Android 计步功能-简单实现
- server新手引导 sql_Web SQL初体验之新手指导(全功能解析)
- Scaffolding Template on Asp.Net Core Razor Page
- [html] 怎样避免让用户看到长时间的白屏?
- 计算机网络 --- 网络层路由算法与路由协议
- Linux创建anaconda-navigator快捷图标并固定在dock上
- 1tensorflow 实现端到端的OCR:二代身份证号识别 + 2tensorflow LSTM+CTC实现端到端的不定长数字串识别
- secoclient 主机检查失败_SecoClient在win10系统中连接失败解决方案
- iphone 3G 刷机到3.12
- 设计模式之适配器模式
- 2021机器学习面试必考100题最新汇总(附答案详解)
- iOS 获取设备UDID
- 办公未来已来,金山WPS如何从“追随者”到“领跑者”
- 创业路上之谢谢周爱民
- 大数据比较 同比与环比的区别
- 怎样给win7系统硬盘分区
- 2021年高教杯数学建模国赛C题思路详解
- 【论文夜读】陈天琦神作Neural Ordinary Differential Equations(NuerIPS2018最佳paper)