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. OAF 开发TAB页

    TAB页 2013年1月17日 21:31 当查询结果列数比较多的时候,往往一页显示不下,在FORM的情况下,我们往往会用Tab页的方法解决.那么在OAF如何制作TAB页呢?下面的教程将介绍如何制作一 ...

  2. objc直接通过指针访问对象实例变量

    我们现在来做一件被认为是very bad的事情,如题所示:无论实例变量是私有的.保护的都可以通过地址访问到,并且还可以修改之.这可以称之为所谓的"超级键值编码". 首先上代码: # ...

  3. SharePoint 2010 电子书下载网站推荐

    最近一直搜集SharePoint2010的资料,偶尔发现一个网站还不错,推荐给大家,皮皮书屋http://www.ppurl.com/tag/sharepoint,里面有很多SharePoint201 ...

  4. Mina源码阅读笔记(三)-Mina的连接IoAccpetor

    其实在mina的源码中,IoService可以总结成五部分service责任.Processor线程处理.handler处理器.接收器和连接器,分别对应着IoService.IoProcessor.I ...

  5. Java Socket:Java-NIO-Selector

    Selector 的出现,大大改善了多个 Java Socket的效率.在没有NIO的时候,轮询多个socket是通过read阻塞来完成,即使是非阻塞模式,我们在轮询socket是否就绪的时候依然需要 ...

  6. html5中新增的非主体结构的元素

    html5中出了新增了article.section.nav.aside.time主要结构元素外,还增加了一些表示逻辑结构或附加信息的非主体结构元素. 一.header元素 header元素是一种具有 ...

  7. 《转》优化UITableViewCell高度计算的那些事

    我是前言 这篇文章是我和我们团队最近对 UITableViewCell 利用 AutoLayout 自动高度计算和 UITableView 滑动优化的一个总结.我们也在维护一个开源的扩展,UITabl ...

  8. index() checkbox单选问题

    index() 只对兄弟节点有用 如果这种结构要选择checkbox 时用prop附加属性 removeAttr清楚属性 $('.checkbox').prop('checked',true) $(' ...

  9. log4j日志的配置

    在项目开发中,记录错误日志方便调试.便于发现系统运行过程中的错误.便于后期分析, 在java中,记录日志有很多种方式,比如说log4j log4j需要导入的包: commons-loggin.jar ...

  10. oracle 查看表的索引信息

    1.select * from user_indexes where table_name='PAMSODT0P02' 2.select * from user_ind_columns  where ...