格式化数据输入输出

Spring3.0的重要接口:HttpMessageConveter为我们提供了强大的数据转换功能,将我们的请求数据转换为一个java对象,或将java对象转化为特定格式输出等。比如我们常见的从前端注册表单获取json数据并转化为User对象,或前端获取用户信息,后端输出User对象转换为json格式传输给前端等。

spring 为我们提供了众多的HttpMessageConveter实现类,其中我们可能用得最多的三个实现类是:

实现类 功能
FormHttpMessageConverter 从请求和响应读取/编写表单数据。默认情况下,它读取媒体类型 application/x-www-form-urlencoded 并将数据写入MultiValueMap<String,String>
MarshallingHttpMessageConverter 使用 Spring 的 marshaller/un-marshaller 读取/编写 XML 数据。它转换媒体类型为 application/xml
MappingJacksonHttpMessageConverter 使用 Jackson 的 ObjectMapper 读取/编写 JSON 数据。它转换媒体类型为application/json

转换器的装配方式有两种,一种是通过注册org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter来装配messageConverters,如下所示:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"><property name="messageConverters"><!-- 装配数据转换器 --><list><ref bean="jsonConverter" /><!-- 指定装配json格式的数据转换器 --></list></property>
</bean><bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"><!-- 使用MappingJacksonHttpMessageConverter完成json数据转换 --><property name="supportedMediaTypes" value="application/json" /><!-- 设置转换的media类型为application/json -->
</bean>>

另一种是启用注解<mvc:annotation-driven />
该注解会会初始化7个转换器:
- ByteArrayHttpMessageConverter
- StringHttpMessageConverter
- ResourceHttpMessageConverter
- SourceHttpMessageConverter
- XmlAwareFormHttpMessageConverter
- Jaxb2RootElementHttpMessageConverter
- MappingJacksonHttpMessageConverter

通过以上两种方法,我们即可完成我们的转换器注册。
但我们想要在控制层完成数据的输入输出转换,需要通过下列途径:
1. 使用@RequestBody和@ResponseBody对处理方法进行标注。其中@RequestBody通过合适的HttpMessageConverter将HTTP请求正文转换为我们需要的对象内容。而@ResponseBody则将我们的对象内容通过合适的HttpMessageConverter转换后作为HTTP响应的正文输出。
2. 使用HttpEntity、ResponseEntity作为处理方法的入参或返回值

实例分析

通过以上讲解,我们已经有足够的知识准备,来完成我们的实例:将json数据转换为合适的java对象输入,并将java对象转换为符合格式的json字符输出:

1. 导入需要的jar包

装配MappingJacksonHttpMessageConverter需要我们的jackson相关jar包,我们使用maven来管理项目,在pom.xml中配置如下信息:

<dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-core-asl</artifactId><version>1.9.2</version>
</dependency>
<dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.2</version>
</dependency>

2. 装配MappingJacksonHttpMessageConverter

这里我们使用上面提到的方式二更为便利,在spring容器中加入:
<mvc:annotation-driven />

关于springMVC所需的其他配置,可参考我的另一篇文章,或通过文尾的源码下载获取

3. 编写测试文件

  1. 下面是我们的User POJO测试类

    public class User {private Integer id;private String userName;private String password;@Overridepublic String toString() {return "User [id=" + id + ", userName=" + userName + ", password="+ password + "]";}//忽略每个参数的get和set方法
    }
  2. 下面是我们的控制层测试文件:

    @Controller
    @RequestMapping("/user")
    public class UserController {@RequestMapping("getUser")public void getUser( @RequestBody User user){//将输入数据转化为User对象System.out.println(user);}@RequestMapping("getUser1")public void getUser1( HttpEntity<User> userEntity){//将输入数据转化为User对象System.out.println(userEntity.getBody());}@ResponseBody//将输出的java对象转换为合适的相应正文输出@RequestMapping("getUser2")public User getUser2(User user){System.out.println(user);return user;}@RequestMapping("getUser3")public HttpEntity<User> getUser3(User user){System.out.println(user);HttpEntity<User> uEntity = new HttpEntity<User>(user);return uEntity;}
    }

    上面分别展示了注解和HttpEntity的用法。关于HttpResponse只是在HtppEntity的基础上进一步对相应信息进行封装,如修改一些相应头信息等

    1. 关于以上的getUser()getUser1()能将我们的json字符串转换为相应的对象,我们可以任何参数名输入:
      {“id”:10,”password”:”myPassword”,”userName”:”myUserName”}
      在这里我们需要的是需将请求头的contentType设置为”application/json;UTF-8“。这样spring才能找到对应的json解析器对我们的json字符串进行解析。否则会报错误:415 Unsupported Media Type
      程序中方法调用User的toString()在控制台打印字段:
      User [id=10, userName=asd, password=qwe]
    2. 对于以上的getUser2()和getUser3()方法,我们访问如:
      http://localhost:8080/springMVC/user/getUser3?id=10&password=qwe&userName=asd。然后spring会帮我们自动将参数对应User对象的属性名绑定到方法入参的user对象中(关于复杂对象、集合绑定可参考我后面系列的文章)。根据上面url传入的参数,spring自动将我们的User对象转换为json格式字符串输出,内容如下:
      {"id":10,"userName":"asd","password":"qwe"}

选择合适的数据转换器

在前面讲解中,我们通过AnnotationMethodHandlerAdapter注册了众多的数据转换器,而spring会针对不同的请求响应媒体类型,spring会为我们选择最恰当的数据转换器,它是按以下流程进行寻找的:

  1. 首先获取注册的所有HttpMessageConverter集合
  2. 然后客户端的请求header中寻找客户端可接收的类型,比如 Accept application/json,application/xml等,组成一个集合
  3. 所有的HttpMessageConverter 都有canRead和canWrite方法 返回值都是boolean,看这个HttpMessageConverter是否支持当前请求的读与写,读对应@RequestBody注解, 写对应@ResponseBody注解
  4. 遍历HttpMessageConverter集合与前面获取可接受类型进行匹配,如果匹配直接使用当前第一个匹配的HttpMessageConverter,然后return(一般是通过Accept和返回值对象的类型进行匹配)

源码下载

本例的示例代码可到https://github.com/jeanhao/spring的mvc_messageConvertor1文件夹中下载

springMVC4(4)json与对象互转实例解析请求响应数据转换器相关推荐

  1. python json转换字典_Python json转字典字符方法实例解析

    josn基本操作 1.导入import json 2.字典转json:json.dumps(dict,ensure_ascii=False),加,ensure_ascii=False转换之后无中文乱码 ...

  2. java解析json数组对象_JAVA中快速解析JSON对象里包含的JSON数组

    例如现在有这样一个Json String Value =  {"data":[{"school_name":"西北农林科技大学"," ...

  3. java request 原理_JavaWeb response和request对象原理及实例解析

    HttpServletResponse: HttpServletResponse对象服务器的响应.这个对象中封装了向客户端发送数据.发送响应头,发送响应状态码的方法. 字符编码格式: 方法一: // ...

  4. 使用request对象实现注册实例,请求方式编码的问题

    1.注册 register.jsp  ,show.jsp WebContent/register.jsp: WebContent/show.jsp: http://localhost:8888/MyJ ...

  5. java中将json字符串_Java中JSON字符串与java对象的互换实例详解

    在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好, ...

  6. Java中JSON字符串与java对象的互换实例详解

    这篇文章主要介绍了在java中,JSON字符串与java对象的相互转换实例详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JS ...

  7. Java中普通字符串转json_java普通对象和json字符串的互转

    一.java普通对象和json字符串的互转 java对象---->json 首先创建一个java对象: 现在java对象转换为json形式: 定义了一个Student的实体类,然后分别使用了JS ...

  8. JSON 和 JavaScript 对象互转

    JSON 和 JavaScript 对象互转 要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法: var obj = JSON.parse('{" ...

  9. Jackson使用:String 与对象互转、Jackson 从 json 字符串转换出对象

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.从json字符串转换出对象 Pager类: import com.fasterxml.jacks ...

最新文章

  1. lnmp下安装PECL HTTP 扩展
  2. React中跨域问题的完美解决方案
  3. EOS账户系统(5)action分级
  4. tomcat基本知识点与实例
  5. 2009年美国大学计算机专业排名
  6. go语言的计数器iota
  7. python udp编程_Python UDP编程
  8. ASN.1编解码:asn1c的版本分析-诺基亚
  9. 广东省的盆友们,这波退税及时雨你赶上了吗?
  10. JavaScript文档对象模型DOM节点操作之删除节点(6)
  11. 用CentOS 6快速配置一台企业级Web代理服务器
  12. RJ45网线水晶头线序,568A与568B区别,交叉线与直连线区别,10/100M base TX RJ45 接口引脚功能定义
  13. python开发浏览器_Python制作简易浏览器
  14. Ember项目引入js依赖
  15. 【模式识别】信号检测实验及MATLAB仿真
  16. linux 正则匹配文件名,shell 正则表达式与文件名匹配
  17. Android线上轻量级APM性能监测方案
  18. 【C语言】 《狂野打飞机》初步构想以及进阶 以及防止闪屏
  19. 我看无损音频APE和FLAC
  20. python画螺旋_如何用python turtle画斐波那契螺旋曲线?

热门文章

  1. 代码实现:判断101-200之间有多少个素数(质数),并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。...
  2. 关于androidAsyncHttp支持https
  3. 微软职位内部推荐-Software Engineer
  4. Fastreport 分组多列排序问题
  5. 美联社:两家美国域名注册公司退出中国市场
  6. 重点推荐:HP大中华区总裁孙振耀退休感言
  7. Linux搭建NFS文件服务器
  8. hive分析函数取最新_Hive的分析函数的学习
  9. sql 替换字符串函数_你有一份Excel文本函数大全,请注意查收(下)
  10. python里eval和input组合使用_python中eval()函数和input()函数用法解析