2.2. 数据的绑定
前面说过了,SpringMVC是方法级的映射,那么Spring是如何处理方法签名的,又是如何将表单数据绑定到方法参数中的?下面我们就来讨论这个问题。
2.2.1. 处理方法签名
首先,我们可以在方法签名中放入@CookieValue注解参数,Spring自动将Cookie值绑定到参数中;
同理@RequestHeader可 以绑定报文头的属性值;
同时我们还可以将Servlet API如HttpServletRequest、HttpServletResponse、HttpSession、WebRequest直接作为方法参 数,Spring负责绑定;
Spring MVC还允许控制器的处理方法使用java.io.InputStream/java.io.Reader及java.io.OutputStream /java.io.Writer作为方法的入参,SpringMVC将获取ServletRequest的InputStream/Reader或 ServletResponse的OutputStream/Writer,然后按类型匹配的方式,传递给控制器的处理方法入参;
控制器处理方法的入参除 支持以上类型的参数以外,还支持java.util.Locale、java.security.Principal,可以通过Servlet的 HttpServletRequest的getLocale()及getUserPrincipal()得到相应的值。
如果处理方法的入参类型为 Locale或Principal,Spring MVC自动从请求对象中获取相应的对象并传递给处理方法的入参。
2.2.1. 表单数据绑定到方法参数
再有,表单的数据只要名称相同就可以往方法参数中放,或者是级联的可以封装成对象置于参数中,Spring会自动绑定,如下图所示,极其地方便简单:

2.2.3. HttpMessageConverter<T>
最后,还有一类处理方法入参的形式,即使用HttpMessageConverter<T>,这个非常强大。它提供了两种途径:
1)使用@RequestBody/@ResponseBody对处理方法进行标注;
2)使用HttpEntity<T>/ResponseEntity<T>作为处理方法的入参或返回值。
HttpMessageConverter顾名思义,它负责将请求信息转换为一个对象,或者将对象输出为响应信息。前面说过,当请求映射到具体的处理方法后,DispatcherServlet调用HandlerAdapter来封装并执行处理方法。
DispatcherServlet默认已经安装了AnnotationMethodHandlerAdapter作为HandlerAdapter的组件实现类,
HttpMessageConverter即由AnnotationMethodHandlerAdapter使用,将请求信息转换为对象,或者将对象转换为响应信息。

先看几个示例:
将报文体转换为字符串绑定到方法入参中

@RequestMapping(value= "/handle41")
publicString handle41(@RequestBody StringrequestBody ) {
System.out.println(requestBody);
return "success";
}

读取一张图片,并将图片数据输出到响应流中,客户端将显示这张图片

@ResponseBody
@RequestMapping(value= "/handle42/{imageId}")
public byte[]handle42(@PathVariable("imageId") String imageId) throwsIOException {
System.out.println("load image of"+imageId);
Resource res = newClassPathResource("/image.jpg");
byte[] fileData=FileCopyUtils.copyToByteArray(res.getInputStream());
return fileData;
}
@RequestMapping(value= "/handle43")
publicString handle43(HttpEntity<String> httpEntity){
long contentLen = httpEntity.getHeaders().getContentLength();
System.out.println(httpEntity.getBody());
return "success";
}
@RequestMapping(params= "method=login")
public ResponseEntity<String>doFirst(){
HttpHeaders headers = new HttpHeaders();
MediaType mt=newMediaType("text","html",Charset.forName(“UTF-8"));
headers.setContentType(mt);
ResponseEntity<String> re=null;
String return = newString("test");
re=newResponseEntity<String>(return,headers, HttpStatus.OK);
return re;
}

这里讲一下HttpMessageConverter中的重点@ResponseBody,我们用它来处理XML和JSON非常之方便。只要在 SpringWeb容器中为AnnotationMethodHandlerAdapter装配好相应的处理XML、JSON的 HttpMessageConverter(AnnotationMethodHandlerAdapter默认只装配部分转换器),并在交互中通过请求 的Accept指定MIME类型,Spring MVC就可以使服务端的处理方法和客户端透明地通过XML或JSON格式的消息进行通信了。

http://blog.csdn.net/z69183787/article/details/41654039

http://blog.csdn.net/renhui999/article/details/9837897

Spring mvc 原理浅析的更多相关文章

  1. spring MVC原理

    spring MVC原理   Spring MVC工作流程图   图一   图二    Spring工作流程描述       1. 用户向服务器发送请求,请求被Spring 前端控制Servelt D ...

  2. Spring MVC 原理探秘 - 容器的创建过程

    1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的.Spring MVC 可对外提供服务时,说明其已经处于了就绪状态.再次之前,Spring MVC 需要进行 ...

  3. Spring MVC 原理探秘 - 一个请求的旅行过程

    1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章.为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一 ...

  4. Spring学习 6- Spring MVC (Spring MVC原理及配置详解)

    百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...

  5. Spring MVC原理及配置

    Spring MVC原理及配置 1. Spring MVC概述 Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得 ...

  6. Spring MVC原理及配置详解

    Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单.这些控制 ...

  7. 0000 - Spring MVC 原理以及helloworld

    1.概述 Spring MVC是目前最好的实现MVC设计模式的框架,是Spring框架的一个分支产品.以Spring IOC容器为基础,并利用容易的特性来简化它的配置.Spring MVC相当于Spr ...

  8. Spring MVC架构浅析

    阅读目录 Spring MVC概述 Spring MVC框架的特点 Spring MVC工作原理 Spring MVC概述 Spring的web框架围绕DispatcherServlet设计,Disp ...

  9. Spring MVC原理及实例基础扫盲篇

    近期 项目中刚接触了SpringMVC,就把这几天看的跟实践的东西写出来吧. 一.首先,先来了解一下SpringMVC究竟是个什么样的框架? Spring Web MVC是一种基于Java的实现了We ...

随机推荐

  1. windows linux—unix 跨平台通信集成控制系统

    首先,我们可以用到这个开源的开发包: mdk(Micro-Development-Kit)微量级软件开发包,提供几个常用类,主要实现了一个高性能的并发服务器引擎 使用c++开发,是一个跨平台的开发包, ...

  2. 根据Facebook内存的管理使用,浅谈在iOS上自动检测内存泄漏问题

    分装库下载:https://github.com/facebook/FBMemoryProfiler FBMemoryProfiler类库使用教程:http://ifujun.com/fbmemory ...

  3. Gradle 1.12用户指南翻译——第四十二章. Announce插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  4. OpenCV——PS 图层混合算法 (二)

    具体的算法原理可以参考 PS图层混合算法之二(线性加深,线性减淡,变亮,变暗) // PS_Algorithm.h #ifndef PS_ALGORITHM_H_INCLUDED #define PS ...

  5. Hadoop Bloom Filter 使用

    1.Bloom Filter  默认的 BloomFilter filter =new BloomFilter(10,2,1); // 过滤器长度为10 ,用2哈希函数,MURMUR_HASH (1) ...

  6. Log4j运用于代码中

    在JAVA代码中,我们要打印输出语句的时候,我们经常会使用System.out.print(),但是在项目开发完后,这些代码就会影响项目的运行效率,所以Log4j就派上用场了.话不多说,直接上代码. ...

  7. obj-c编程12:复制对象

    好吧,上一篇我怎么也没想到会写那么多字那么少的代码,希望这一篇不会如此哦. 言归正传,对象的复制分为浅复制和深复制,前者只是复制对象的引用,当原对象的内容发生变化时,复制对象的内容也会发生变化,毕竟他 ...

  8. 面向对象(this的问题一)

    <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...

  9. Django(一)入门基础——hello world

    环境配置 windows7 python3.6 Django 2.0 PyCharm 2018.1 专业版(PS:不建议社区版,因为被"阉割"了很多功能,比如cmd的Termina ...

  10. 玩转Git入门篇

    最近项目使用到Git管理项目,所以就学习了一番,随然网上关于 Git的文章铺天盖地,我还是整理下总结下自己学习Git相关笔记,希望也能帮助到需要他的小伙伴们,O(∩_∩)O~ 简介 Git 是分布式版 ...