Ajax前台返回JSON数据后再Controller中直接转换成类型使用,后台接收json转成实体的方法
之前写过一篇记录文章,写的是将一个比较复杂的数据结构在前台组合起来后传递到后台。
当时并不太了解@RequestBody,也并没有使用js提供的JSON.stringify()方法
所有都是自己写的,比如js将json转为字符串的方法,后台接收json转成实体的方法。
最近接触到了@RequestBody,于是想将之前的代码改写一下。
首先@RequestBody需要接的参数是一个string化的json,这里直接使用JSON.stringify(json)这个方法来转化
其次@RequestBody,从名称上来看也就是说要读取的数据在请求体里,所以要发post请求
第三,要设置contentType,contentType:"application/json,明确的告诉服务器发送的内容是json,而默认的contentType是application/x-www-form-urlencoded; charset=UTF-8
那么可以开始写出代码了:
$.ajax({
type: "post",
contentType:"application/json",
url: "repairs/saveDispatches",
data: JSON.stringify(dispatchesDTO),
success: function(data){
if(!data.success){
alertError("派工失败");
}else{
alertSuccess("派工成功");
}
})
后台怎么接呢?这就轮到@RequestBody出马了
@RequestMapping("/repairs/saveDispatches")
public void saveDispatches(@RequestBody DispatchesDTO dispatchesDTO,
HttpServletResponse response) throws IOException {
dispatchesService.saveDispatches(dispatchesDTO);
success(response);
}
很简单吧,无需手动进行json与实体的转换,只要能映射上去(也就是字段名和json的key相对应,value可以匹配上数据类型),那么就可以直接转换。
如何定义“能映射上去”呢?若是json中的key在实体中都能找到对应的field,那么就是“能映射上去”,也就是说:
前台传入的json中的key在实体中必须要存在,不然就会报错,比如下面这个前台传入的json中多了一个key为id的键值对
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized field "id" (Class com.westsoft.kft.repairs.dto.DispatchesDTO), not marked as ignorable
其实要使用@RequestBody这个注解还需要额外配置一个Bean,也就是自动帮我们接收json并转成对象的消息转换器messageConverter
由于我使用的是Spring3.1之后的版本,那么配置在RequestMappingHandlerAdapter下
<!--Spring3.1开始的注解 HandlerAdapter -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
</bean>
</list>
</property>
</bean>
当然也可以通过<mvc:annotation-driven />来简单的配置,这里就不过多介绍了~
最后再要提到几点
一、若1、前台发送请求时未指定contentType为json/application 2、Spring中未配置messageConverter
那么会报错误415,也就是类型不支持
前者是因为Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
而后者是因为Content type 'application/json;charset=UTF-8' not supported
二、由于Spring中使用的json转换用到的是jackson,所以需要引入jackson包
怎使用springmvc的@requestbody 返回json数据
先配置 XXX_ servletxml
<!-- 整合jackson 返回一个json格式 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter"/>
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
再然后Action方法里注解就可以
@RequestMapping(value="/XXXXXX", method = RequestMethod.POST)
@ResponseBody
public 返回类型 XXXXXX(){
}
@responsebody一般在什情况下使用,他的好处与坏处?
@responsebody表示该方法的返回结果直接写入HTTP response body中
一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。
Ajax前台返回JSON数据后再Controller中直接转换成类型使用,后台接收json转成实体的方法的更多相关文章
- ASP.NET MVC搭建项目后台UI框架—8、将View中选择的数据行中的部分数据传入到Controller中
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- View中选择的数据行中的部分数据传入到Controller中
将View中选择的数据行中的部分数据传入到Controller中 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NE ...
- 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...
- ajax获取动态列表数据后的分页问题
ajax获取动态列表数据后的分页问题 这是我在写前台网站时遇到的一个分页问题,由于数据是通过ajax的方式来请求得到的,如果引入相应的js文件来做分页,假如只是静态的填放数据到列表各项内容中(列表条数 ...
- 关于由ajax返回的数据在for循环中只能取到最后一个数的问题
关于由ajax返回的数据在for循环中只能取到最后一个数的问题 以上是来自后台的数据格式.从数据中可以看出,里面包含两个商品,每个商品价格分别为:1.98,13.60.这里我要计算两个商品的总价格,但 ...
- 在用easyui中做CRUD功能时,当删除一行或多行数据后再点击修改会提示你选中了多行,如何解决这个bug了?
在用easyui中做CRUD功能时,当删除一行或多行数据后再点击修改会提示你选中了多行,如何解决这个bug了? 在删除成功后,加上这句话就可以了:$("#dg").datagrid ...
- iOS key value coding kvc在接收json数据与 model封装中的使用
iOS key value coding kvc在接收json数据与 model封装中的使用 使用 kvc 能够极大的简化代码工作,及以后的接口维护工作: 1:先创建MovieModel类.h和 . ...
- model,map,MapAndVivew用于页面跳转时候使用的即跳转后才添加属性 这样再回调中无法使用 因为回调的前提是页面不调转;解决的方法是用responsewrite(普通的字符响应)
model,map,MapAndVivew用于页面跳转时候使用的即跳转后才添加属性 这样再回调中无法使用 因为回调的前提是页面不调转:解决的方法是用responsewrite
- bootstrap通过ajax请求JSON数据后填充到模态框
1. JSP页面中准备模态框 <!-- 详细信息模态框(Modal) --> <div> <div class="modal fade" id=& ...
随机推荐
- HelloDjango 启动!免费带你学Django全栈!
欢迎 追梦 入伙 HelloGitHub-Team,同时为我们带来了完全免费的 HelloDjango 系列教程,全网首发于 HelloGitHub 公众号.让想你的系列文章被跟多人看到,那就来加入我 ...
- [leetcode] 238. Product of Array Except Self (medium)
原题 思路: 注意时间复杂度,分别乘积左右两边,可达到O(n) class Solution { public: vector<int> productExceptSelf(vector& ...
- Supalle-Admin-Layout,一个PC端和手机端都合适用的后台页面模板
Supalle-Admin-Layout主要使用有Vue.Element-UI.layui-icon,Ajax实现采用Fetch(是有这个打算,不过目前是jQuery.). 源码地址:https:// ...
- python课堂整理8---字符串格式化
一.字符串格式化(% 和 format) 1. % s 主要接收字符串类型,也可以接收任意类型 tp1 = "i am %s my hobby is alex" % 'lhf' ...
- Flink 灵魂两百问,这谁顶得住?
Flink 学习 https://github.com/zhisheng17/flink-learning 麻烦路过的各位亲给这个项目点个 star,太不易了,写了这么多,算是对我坚持下来的一种鼓励吧 ...
- 关于Hibernate查询对象调用set方法自动同步到数据库解决方案
Hibernate的get和load方法查询出的实体都是持久化对象,拿到该对象后,如果你调用了该对象的set方法,如果再同一个事务里面,那么在事务递交的时候,Hibernate会把你设置的值自动更新到 ...
- 洛谷 P3387 题解
题面 裸跑一遍SPFA,统计每个点的入队次数: 如果该点的入队次数>=总点数,那么该点便是一个负环上的点: 重点!!!: 1.不是“YES”,是“YE5”: 2.不是“NO”,是“N0”:(是零 ...
- 用机智云做PWM占空比控制电机,物联网智能家居应用
因为是新申请的博客,所以申请了总想往里面加点东西,所以把我之前在机智云写的帖子复制了过来 (各位抱歉,由于之前上传的文件可能有错误,之前上传的文件PWM不能用,那么我又重新上传了一个文件,这个文件 ...
- cdh5-MariaDB 配置(暂未排版)
在多数分布MariaDB的设施默认设置使用保守的缓冲区的大小和内存使用. 使用保守的缓冲区大小和内存使用率 Cloudera的数据库管理服务器,监控活动,报告管理,Cloudera 导航,Hive 的 ...
- 【Java笔记】【Java核心技术卷1】chapter3 D5运算符
package chapter3; import java.math.*; //引入数学类 //枚举类型 enum Size{SMALL,MEDIUM,LARGE}; public class D5运 ...