0059 Spring MVC与浏览器间的JSON数据转换--@RequestBody--@ResponseBody--MappingJacson2HttpMessageConverter
浏览器与服务器之间的数据交换有很多类型,不只是表单提交数据这一种,比如ajax技术就大量使用json、xml等,这时候就涉及到浏览器端和服务器端数据格式转换的问题,服务器端都是Java对象,需要把请求信息转为Java对象,或者把Java对象转换为响应信息,Spring提供了很重要的接口HttpMessageConverter。
这个接口有很多实现类完成信息转换,比如:
----StringHttpMessageConverter----将请求信息转为字符串
----ByteArrayHttpMessageConverter----读写二进制数据
----SourceHttpMessageConverter----读写javax.xml.transform.Source类型的数据
----XmlAwareFormHttpMessageConverter----转换部分表单数据是xml的数据
----MappingJackson2HttpMessageConverter----用Jackson开源类包读写JSON数据
----Jaxb2RootElementHttpMessageConverter----通过JAXB2读写XML数据
。。。。。。还有很多
DispatcerServlet默认装配了RequestMappingHandlerAdapter,而后者默认装配了上面前4个HttpMessageConverter
其实json跟Java对象的转换就三个要素:一个转换器,两个注解(@RequestBody、@ResponseBody)
MappingJackson2HttpMessageConverter转换json数据
这是Spring MVC默认的json转换器,虽然是默认,但还得自己导入jar包。也可以用别的转换器,后面再说
因为Spring MVC默认使用该转换器,因此applicationContext.xml中只需要配置<mvc:annotation-driven />即可
用GET或者POST提交数据的时候,HTTP请求头的Content-Type大概有以下三种:
----application/x-www-form-urlencoded:@RequestParam、@ModelAttribute、@RequestBody都可以处理
----multipart/form-data:@RequestBody没法处理
----application/json、application/xml:必须用@RequestBody处理
@RequestBody将请求信息中的json转为Java对象
@ResonseBody将处理方法返回的Java对象转为json
还以上传书籍信息为例,用ajax将书籍信息以json的格式上传,后端修改数据后转换为json传给浏览器,再显示出来
先写index.html
<!DOCTYPE html>
<html>
<head>
<title>浏览器与服务器间用json传递数据</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="resources/jquery-3.1.0.js"></script>
<script type="text/javascript" src="resources/json2.js"></script><!-- 下面的JSON.stringify()即由此js提供 -->
<script type="text/javascript">
function sendRequest(){
var bookname=$("#bookname").val();
var author=$("#author").val();
var press=$("#press").val();
var isbn=$("#isbn").val();
var douban=$("#douban").val();
$.ajax({ /*用jQuery发送ajax请求*/
url:"addbook",
type:"POST", /*注意下面的data数据部分,JSON.stringify()的作用是把json对象转为json字符串,不能少*/
data:JSON.stringify({"bookname":bookname,"author":author,"press":press,"isbn":isbn,"douban":douban}),
contentType:"application/json", /*将HTTP请求的Content-Type设置为“application/json”*/
dataType:"json",
success:function(result){
alert(result.bookname);
$("#b").html(result.bookname);
$("#a").html(result.author);
$("#p").html(result.press);
$("#i").html(result.isbn);
$("#d").html(result.douban);
}
});
}
$(function(){ /*页面载入完毕后执行这个函数*/
$("#submit").click(sendRequest); /*为“提交”按钮绑定单击事件*/
});
</script>
</head>
<body>
<div>
书名:<input name="bookname" id="bookname" /><br>
作者:<input name="author" id="author" /><br>
出版社:<input name="press" id="press" /><br>
ISBN:<input name="isbn" id="isbn"/><br>
豆瓣评分:<input name="douban" id="douban"/><br>
<button type="button" id="submit">提交</button>
</div>
<h3 style="color:red;">下面是服务器返回的信息</h3>
<p>书名:<span id="b" style="color:red"></span></p>
<p>作者:<span id="a" style="color:red"></span></p>
<p>出版社:<span id="p" style="color:red"></span></p>
<p>ISBN:<span id="i" style="color:red"></span></p>
<p>豆瓣评分:<span id="d" style="color:red"></span></p>
</body>
</html>
写Controller
package net.sonng.mvcdemo.controller;
import javax.servlet.http.HttpServletResponse;
import net.sonng.mvcdemo.entity.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class BookJSONController {
@ResponseBody //该注解将处理方法的返回值转换为json
@RequestMapping("/addbook") //下面的@RequestBody可以将请求内容中的json转为Java对象
public Book editBookInfo(@RequestBody Book book ){
book.setBookname(book.getBookname()+"----处理方法修改了数据");
book.setAuthor(book.getAuthor()+"----处理方法修改了数据");
book.setPress(book.getPress()+"----处理方法修改了数据");
book.setIsbn(book.getIsbn()+"----处理方法修改了数据");
return book;
}
}
浏览器访问localhost:8888/mvcdemo/index.html 输入信息后提交,下方即将服务器返回的信息列处理了
自定义JSON的HttpMessaageConverter转换器
用alibaba的fastjson:下载或者用maven引入http://maven.aliyun.com/nexus/#nexus-search;quick~fastjson
主要就是改下applicationContext.xml配置:
<mvc:annotation-driven>
<mvc:message-converters register-defaults="false"> <!-- 不使用默认配置 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
<bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" />
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
<bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter" />
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter" >
<property name="supportedMediaTypes"> <!-- 支持的媒体类型 -->
<list>
<value>text/html;charset=UTF-8</value><!-- 顺序不要写反了,否则IE会出现下载提示 -->
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
总的说:json转换就是一个转换器,两个注解
0059 Spring MVC与浏览器间的JSON数据转换--@RequestBody--@ResponseBody--MappingJacson2HttpMessageConverter的更多相关文章
- Spring mvc框架 controller间跳转 ,重定向 ,传参
一.需求背景 1. 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示. @Req ...
- spring mvc接收ajax提交的JSON数据,并反序列化为对象
需求:spring mvc接收ajax提交的JSON数据,并反序列化为对象,代码如下: 前台JS代码: //属性要与带转化的对象属性对应 var param={name:'语文',price:16}; ...
- Spring MVC 解决 Could not write JSON: No serializer found for class java.lang.Object
Spring MVC 解决 Could not write JSON: No serializer found for class java.lang.Object 资料参考:http://stack ...
- jsp与spring mvc后台controller间参数传递处理之总结
在编程过程中,最容易出现问题及卡壳的地方,往往是各层之间接缝处,接缝处往往存在着各种各样的参数传递,数据转换和格式化,参数很好的传递并正确接收过来之后就是复杂逻辑之间的处理了,所以为了避免多种问题占用 ...
- 160506、Spring mvc新手入门(11)-返回json 字符串的其他方式
Spring MVC返回 json字符串的方式有很多种方法,这里介绍最简单,也是最常使用的两种方式 一.使用 PrintWriter printWriter 直接输出字符串到返回结果中 不需 ...
- Spring MVC全局异常后返回JSON异常数据
问题: 当前项目是作为手机APP后台支持,使用spring mvc + mybaits + shiro进行开发.后台服务与手机端交互是发送JSON数据.如果后台发生异常,会直接返回异常页面,显示异常内 ...
- Spring MVC登录注册以及转换json数据
项目结构; 代码如下: BookController package com.mstf.controller; import javax.servlet.http.HttpServletRespons ...
- spring mvc接收参数方式,json格式返回请求数据
1 使用方法形参使用变量接收提交的数据 2 在方法的形参中使用模型接收数据 3 如果在提交的表单中有多个数据模型,需要创建一个新的Bean,里面的属性是要接收的对象变量. 4 接收提交的日期字符串,转 ...
- spring mvc 利用匿名内部类构建返回json对象
@RequestMapping(value = "/order/findOrderByIdVague/{noId}.json", method = {RequestMethod.G ...
随机推荐
- linux查找超过一定时间的文件,并批量删除
1.find . -maxdepth 4 -name "*-*" -mtime 3 -maxdepth的值决定是否对下面的子目录进行递归查找 -mtime 3表示查找刚好3天的: ...
- hdu-4725-The Shortest Path in Nya Graph-层次网络
我们依据每一个人的layer把同样layer的人分配到同一个层次中. 然后记录走到每一个层次的最小值. 假设这个最小值被更新了. 那么我们就更新与这个层次相连的层次上的点. 其它的就是最普通的spfa ...
- iOS: FFmpeg的使用一
现状:现在视频直播非常的火,所以在视频直播开发中,使用的对视频进行遍解码的框架显得尤为重要了,其实,这种框架蛮多的,这次主要介绍一下FFmpeg视频播放器的集成和使用,FFmpeg是视频编解码的利器. ...
- Install Python+Django+Nginx+UWSGI
一.软件环境: CentOS6.6_64bit 需要用到的软件: [root@django tools]# ll 总用量 33336 -rw-r--r-- 1 root root 7497785 3月 ...
- AJAX前台传过来的中文在后台获取是乱码问题
前台传值时加上encodeURI $.SaveForm({ url: "${basePath}/soft/mergeSoftAction_add.do?ids="+ids+&quo ...
- jsp+servlet+jdbc实现对数据库的增删改查
一.JSP和Servlet的简单介绍: 1.Servlet和JSP简介: Java开发Web应用程序时用到的技术主要有两种,即Servlet和JSP,Servlet是在服务器端执行的Java程序,一个 ...
- IIS6.0 开启Gzip与PHP Gzip
因为在做一个项目,项目里面服务器主要提供数据,但是数据多了文件就大了,比较浪费流量和时间,我们便用Gzip来处理.我在本机上是apache,服务器上是IIS6.0,用的是php,那么我就在这里分享一下 ...
- windows下读取Linux分区软件
导读 ext3等日志型文件系统是Linux中被广泛应用的,通常是许多流行Linux发行版默认的文件系统.etx4也是Linux下的日志型文件系统,被设计作为ext3的继任者.他消除了64位存储限制,是 ...
- js 多域名跳转
<script>try {if( self.location == "http://cnblogs.com/endv" ) { top.location.href = ...
- (笔试题)关于C++的虚函数和多态性
以下两段程序的输出是什么? 程序1: #include "stdio.h" class Base { public: int Bar(char x) { return (int)( ...