SpringMVC前后台数据传递中Json格式的相互转换(前台显示格式、Json-lib日期处理)及Spring中的WebDataBinder浅析
两个方向:
一、前台至后台:
Spring可以自动封装Bean,也就是说可以前台通过SpringMVC传递过来的属性值会自动对应到对象中的属性并封装成javaBean,但是只能是基本数据类型(int,String等)。如果传递过来的是特殊对象,则需要手动进行封装。
Spring提供了@initBinder(初始化绑定封装)注解和WebDataBinder工具。用户只需要向WebDataBinder注册自己需要的类型的属性编辑器即可。
/*
前台传递过来的String类型时间,通过下面的初始化绑定,转换成Date类型
*/
@initBinder
public void initBinder(WebDataBinder binder){
SimpleDateFormate sdf=new SimpleDateFormate("yyyy-MM-dd HH:mm");
binder.registerCustomEditor(Date.class,new CustomDateEditor(sdf,true));//true表示允许空值,false不允许
}
更多详细内容转载链接
1,http://blog.csdn.net/hongxingxiaonan/article/details/50282001(前台传递过来非Date类型,及WebDataBinder的其它方法)
2,http://www.cnblogs.com/AloneSword/p/3998943.html(前台传递过来两个不同名和不同格式的Date类型)
二、后台到前台:
1,可以直接在后台将值存入session或request或page中,后台就可以直接通过EL表达式¥{key.value}取值
2,主要记录后台将List<javaBean>值存入json中,前台如何取值及转换。
我写的项目前台运用的是easyui-datagrid显示值
(1),前台封装的值不包含特殊类型,如java.util.Date
easyui前台显示数据可以使用JSONObject,也可以使用JSONArray。但是如果需要在datagrid表格中进行数据显示,只能使用JSONObject,这是easyui的规范。
一般后台会将查询出的List使用JSONArray.fromObject()方法将List转换成JSONArray,但如果是在datagrid的表格中显示,则需要将JSONArray put到JSONobject中;如果不用在datagrid表格中显示,那么JSONObject和JSONArray都可以传递给前台值。
如combobox,后台只需要将List放入JSONArray中即可传向前台。
先给个工具类,用于前台显示:
public class ResponseUtil {
public static void write(HttpServletResponse response, Object o) throws Exception {
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.println(o.toString());
writer.flush();
writer.close();
}
}
ResponseUtil.java
Controller层方法,PageBean也是自己创建的实体类,是用来给sql语句的limit提供数据而已:
public class PageBean {
private int page;// 页数
private int rows;// 每页行数
private int start;// 起始页
public PageBean(int page, int rows) {
super();
this.page = page;
this.rows = rows;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public int getStart() {
start = (page - 1) * rows;
return start;
}
}
PageBean.java
@RequestMapping("/getProductList")
public void getProductList(@RequestParam(value = "page", required = false) String page,@RequestParam(value = "rows") String rows, HttpServletResponse response, Product product) throws Exception {
PageBean pageBean = new PageBean(Integer.parseInt(page), Integer.parseInt(rows));
Map<String, Object> map = new HashMap<>();
map.put("start", pageBean.getStart());
map.put("size", pageBean.getRows());
map.put("productName", product.getProductName());
List<Product> productList = productService.getProductList(map);
int total = productService.getTotal(map);
JSONObject jsonObject = new JSONObject();
JSONArray jsonArray = JSONArray.fromObject(productList);//将查询出的List先转换成JSONArray
jsonObject.put("rows", jsonArray);
jsonObject.put("total", total);
ResponseUtil.write(response, jsonObject);
}
(2),前台封装的值包含如java.util.Date的特殊类型
用Json-lib日期处理:将后台的传递的时间类型转换成前台可以显示的Json格式,用类JsonConfig和接口JsonValueProcessor处理,用法也很简单:
源码JsonValueProcessor接口中只包含两个方法,我定义一个类JavaDateObjectToJsonUtil继承该接口,定义新类是为了可以在类中添加我需要的时间格式
public class JavaDateObjectToJsonUtil implements JsonValueProcessor {
private String format = null;
public JavaDateObjectToJsonUtil(String format) {
super();
this.format = format;
}
@Override
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return null;
}
@Override
public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
if (value == null) {
return "";
}
if (value instanceof Date) {
return new SimpleDateFormat(format).format((Date) value);
}
return value.toString();
}
}
JavaDataObjectToJsonUtil.java
Controller层方法,实体类SaleChance类中包含有属性java.util.Date createTime;并且有createTime的get/set方法:
@RequestMapping("/getSaleChanceList")
public void getSaleChanceList(@RequestParam(value = "page", required = false) String page,@RequestParam(value = "rows") String rows, HttpServletResponse response, SaleChance saleChance)throws Exception {
PageBean pageBean = new PageBean(Integer.parseInt(page), Integer.parseInt(rows));
Map<String, Object> map = new HashMap<>();
map.put("start", pageBean.getStart());
map.put("size", pageBean.getRows());
map.put("createMan", saleChance.getCreateMan());
List<SaleChance> saleChanceList = saleChanceService.getSaleChanceList(map);
int total = saleChanceService.getTotal(map);
JSONObject jsonObject = new JSONObject();
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(java.util.Date.class, new JavaDateObjectToJsonUtil("yyyy:MM:dd hh:mm"));//只需将时间类型和新类通过JsonConfig注册即可
JSONArray jsonArray = JSONArray.fromObject(saleChanceList, jsonConfig);//转换成JSONArray时多带上刚注册的JsonConfig
jsonObject.put("rows", jsonArray);
jsonObject.put("total", total);
ResponseUtil.write(response, jsonObject);
}
SpringMVC前后台数据传递中Json格式的相互转换(前台显示格式、Json-lib日期处理)及Spring中的WebDataBinder浅析的更多相关文章
- Json部分知识(前台显示格式、Json-lib日期处理)
1,Json格式用于datagrid数据显示 easyui前台显示数据可以使用JSONObject,也可以使用JSONArray.但是如果需要在datagrid表格中进行数据显示,只能使用JSONOb ...
- C#曲线分析平台的制作(一,ajax+json前后台数据传递)
在最近的项目学习中,需要建立一个实时数据的曲线分析平台,这其中的关键在于前后台数据传递过程的学习,经过一天的前辈资料整理,大概有了一定的思路,现总结如下: 1.利用jquery下ajax函数实现: & ...
- JavaScript中,JSON格式的字符串与JSON格式的对象相互转化
前言:JSON是一个独立于任何语言的数据格式,因此,严格来说,没有“JSON对象”和“JSON字符串”这个说法(然而”菜鸟教程“和”W3school“使用了“JSON对象”和“JSON字符串”这个说法 ...
- json格式的字符串转为json对象遇到特殊字符问题解决
中午做后台发过来的json的时候转为对象,可是有几条数据一直出不来,检查发现json里包含了换行符,造成这种情况的原因可能是编辑部门在编辑的时候打的回车造成的 假设有这样一段json格式的字符串 va ...
- Python mysql表数据和json格式的相互转换
功能: 1.Python 脚本将mysql表数据转换成json格式 2.Python 脚本将json数据转成SQL插入数据库 表数据: SQL查询:SELECT id,NAME,LOCAL,mobil ...
- SpringMVC之数据传递一
之前的博客中也说了,mvc中数据传递是最主要的一部分,从url到Controller.从view到Controller.Controller到view以及Controller之间的数据传递.今天主要学 ...
- WP8解析JSON格式(使用Newtonsoft.Json包)
DOTA2 WebAPI请求返回的格式有两种,一种是XML,一种是JSON,默认是返回JSON格式. 这里举一个简单的解析JSON格式的例子(更多JSON操作): { "response&q ...
- angularJS入门小Demo2 【包含不用数据库而用data.json格式响应前台的ajax请求方式测试】
事件绑定: <html> <head> <title>angularJS入门小demo-5 事件指令</title> <script src=&q ...
- 关于new Function使用以及将json格式字符串转化为json对象方法介绍
一直对Function()一知半解,今日就Function()的使用做一下总结 一.函数实际是功能完整的对象,用Fucntion()直接创建函数. 语法规则: var 函数名 = new Fun ...
随机推荐
- LOJ2422 NOIP2015 斗地主 【搜索+贪心】*
LOJ2422 NOIP2015 斗地主 LINK 题目大意很简单,就是问你斗地主的一分手牌最少多少次出完 然后我们发现对于一种手牌状态,不考虑顺子的情况是可以贪心做掉的 然后我们直接枚举一下顺子出牌 ...
- WPF 中使用附加属性,将任意 UI 元素或控件裁剪成圆形(椭圆)
不知从什么时候开始,头像流行使用圆形了,于是各个平台开始追逐显示圆形裁剪图像的技术.WPF 作为一个优秀的 UI 框架,当然有其内建的机制支持这种圆形裁剪. 不过,内建的机制仅支持画刷,而如果被裁剪的 ...
- Windows常用配置和sublime快捷键
常用配置和快捷键 1.操作系统常用配置 (1)系统调整为最佳性能 (2)文件夹显示设置:显示文件类型.显示路径 (3)任务栏设置:锁定任务栏+使用小图标2.操作系统常用快捷键 win+数字键--快速打 ...
- 【spring源码学习】spring的task配置
=================spring线程池的配置策略含义========================== id:当配置多个executor时,被@Async("id" ...
- Python猴子补丁
属性在运行时的动态替换,叫做猴子补丁(Monkey Patch). 为什么叫猴子补丁 属性的运行时替换和猴子也没什么关系,关于猴子补丁的由来网上查到两种说法: 1,这个词原来为Guerrilla Pa ...
- 使用vigil 监控微服务系统包含可视化界面
1. 安装 a. rust cargo cargo install vigil-server b. docker docker pull valeriansaliou/vigil:v1.3.0 2. ...
- vue数据已渲染成 但还是报错 变量 undefined
问题:页面上的数据已渲染出来,但是控制台还是报错变量未undefined,主要是当页面加载完成后,数据并未加载完,所以会报次错误. 解决办法:在数据渲染的主节点(最外层的div)添加 v-if=“da ...
- 自己定义一个tab指令
定义一个tab切换的指令: 指令的文件结构: Js/directives/tab tab.html tab.js tab.html: <style> .my-li-style{ line- ...
- RK3288 error: undefined reference to 'LOGD'
HAL层和JNI层中的打印都必须包含下面的宏和头文件. 比如:LOGD.LOGE等等. #define LOG_TAG "TEST_LED" #include <utils/ ...
- vss和vs2008组合搭建源代码管理器
用源代码管理项目,是为了方便开发和管理组内项目,一个组做的是同一套项目,彼此知道各个模块的进度和开发情况,这也是开发项目所需要的.今天整理了VSS的安装.创建.连接及添加项目等操作. 一.安装VSS( ...