JSON学习笔记
JsonResponseUtil 和JsonUtil,这两个工具类都实现接口InitializingBean!
Spring的InitializingBean和init-method
1、Spring在设置完一个bean所有的属性后,会检查bean是否实现了InitializingBean接口,如果实现就调用bean的afterPropertiesSet方法。(这个接口只有一个方法 afterPropertiesSet,这个方法会在 Bean 完成属性设置之后执行)另外,如果bean是单例的,则afterPropertiesSet方法只会被调用一次;否则每次创建bean时afterPropertiesSet方法都会被重新调用.
Spring虽然可以通过InitializingBean完成一个bean初始化后对这个bean的回调,但是这种方式要求bean实现 InitializingBean接口。一但bean实现了InitializingBean接口,那么这个bean的代码就和Spring耦合到一起了。通常情况下不建议直接实现InitializingBean,而是用Spring提供的init-method的功能来执行一个bean 子定义的初始化方法,这可以在一个bean的配置文件中通过init-method声明:
<bean id="testBean" class="TestClass" init-method="initialize"/>
spring要求这个init-method方法是一个无参数的方法
如果一个bean同时实现了这两种方式的初始化配置,则spring会先调用afterPropertiesSet方法,然后通过反射调用init-method,任何一个方法出错都会导致spring创建bean失败.如果afterPropertiesSet方法调用失败,也不会再继续执行init-mehtod方法.
2、实现org.springframework.beans.factory.InitializingBean接口允许一个bean在他的所有必需的属性被BeanFactory设置后,来执行初始化的工作。当然可以使用init-method来取代实现这个接口,以让应用不与spring产生耦合。如果一个bean既实现了InitializingBean,又指定了init-method,则spring会先调InitializingBean的方法,在调init-method指定的方法。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
JSON建构于两种结构:
• “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
• 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
JSON具有以下这些形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
字符串(string)与C或者Java的字符串非常相似。
数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
空白可以加入到任何符号之间。 以下描述了完整的语言。
P17系统的实现说明:
Web层的调用类JsonResponseUtil.java
工具类:JsonUtil.java
原理是通过工具类JsonUtil进行对象装换,全部转为字符串,通过调用类JsonResponseUtil将字符串写入response,在通过Ajax回调。
在设置过程中需要设置response的contentType、charsetName!这两个字段不用指定在代码中,配置在xml文件中
通过Spring注入:
<!-- 工具类配置 -->
<bean id="jsonUtil" class="com.cpic.p17.pf.util.json.JsonUtil">
<description>上传的Action基类,下面配置具体的类解析方法</description>
<property name="jsonProcessor">
<list>
<bean class="com.cpic.p17.pf.util.json.DateJsonValueProcessor">
<constructor-arg><value>yyyy-MM-dd</value></constructor-arg>
</bean>
<bean class="com.cpic.p17.pf.util.json.TimeStampJsonValueProcessor">
<constructor-arg>
<value>yyyy-MM-dd hh:mm:ss</value>
</constructor-arg>
</bean>
</list>
</property>
</bean>
<bean id="jsonResponseUtil" class="com.cpic.p17.pf.util.web.JsonResponseUtil">
<description>JSON返回HttpResponse的封装的工具类</description>
<property name="jsonUtil" ref="jsonUtil"></property>
<!-- 这种设置Prototype可以自动识别为Json对象 -->
<property name="contentType">
<value>application/x-javascript;charset=UTF-8</value>
</property>
<property name="charsetName"><value>UTF-8</value></property>
</bean>
设置自定义的Json转换时的处理类
JsonConfig类是用于配置这些规则的,P17使用了时间格式的显示规则,使用方法registerJsonValueProcessor注册JsonValueProcessor,使用JsonValueProcessor处理Bean对象的属性值的转换
registerJsonValueProcessor(propertyType, jsonValueProcessor),第一参数是类的类型(我的理解是基本类型的包装类),第二个是JsonValueProcessor接口
说明:两个时间格式类:DateJsonValueProcessor和TimeStampJsonValueProcessor,通过上面的xml,并通过Spring初始化格式
/**
* 设置自定义的Json转换时的处理类 *
* @param jsonProcessorList
*/
P17主要使用了jsonConfig.registerJsonValueProcessor(clazz[j],(JsonValueProcessor)jsonProcessorProvider);
指定包装类的转换格式()
在JsonUtil.java中主要使用JSON包提供的方法有两个:
1、 生成Json对象的串,注意:对象串是以{}包围的
JSONObject.fromObject(data, jsonConfig).toString();
2、 生成Json数组的串,注意:数组串是以[]包围的
JSONArray.fromObject(arrayObject, jsonConfig).toString();
在JsonResponseUtil.java中需要将上面方法创建的json串返回页面
/**
* 直接将Json的串发送给客户端
* @param jsonString json的串
*/
public void responseJsonString(String jsonString) {
HttpServletResponse response = ServletActionContext.getResponse();
responseJsonString(response, jsonString);
}
/**
* 直接将字Json的字符串写入到Response中
* @param response
* @param jsonString Json的字符串
*/
public void responseJsonString(HttpServletResponse response, String jsonString) {
response.setContentType(contentType);
byte[] bytes;
try {
bytes = jsonString.getBytes(charsetName);
} catch (UnsupportedEncodingException e) {
throw new UncheckedException(e);
}
response.setContentLength(bytes.length);
try {
OutputStream os = response.getOutputStream();
os.write(bytes);
os.flush();
if(logger.isDebugEnabled()) {
logger.debug("往客户端发送的Json串为:" + jsonString);
}
} catch (IOException e) {
logger.error("在往Response中写入Json字符串的时候发生异常。", e);
throw new UncheckedException(e);
}
}
通过以上方法将获取的JSON数据,根据Ajax方法的调用,返回页面。
这个Ajax的请求及回调数据的过程都是通过prototype.js提供的类Ajax.Request实现的!
new Ajax.Request(pageUrl, pf.ajaxRequestOptions({
method : 'post',
parameters : params,
onSuccess : function(transport) {
closepageloading();//关闭滚动条
try {
func(transport);
} catch (e) {
pf.log(e.name + ':' + e.message);
}
},
onFailure : ajaxOnFailure
}));
说明:提交URL,获取JSON,也就是使用XMLHttpRequest对象去调用参数和获取返回的数据,在js中使用transport来接收该对象,然后引用XMLHttpRequest对象的方法responseText来获取信息
例:var jsonObj = transport.responseText;// XMLHttpRequest.responseText
jsonObj 显示的就是{**:**,**:**},但是字符串
var recallEndParameterVo = jsonObj.evalJSON();//evalJSON()将字符串转化为json对象,该方法是prototype提供。
对于Ajax.Request的描述如下:
Ajax.Request构造方法的第二个对象了吗? 参数{method: 'get', parameters: pars, onComplete: showResponse} 表示一个匿名对象的真实写法。他表示你传入的这个对象有一个名为 method 值为 'get'的属性,另一个属性名为 parameters 包含HTTP请求的查询字符串,和一个onComplete 属性/方法包含函数showResponse。
还有一些其它的属性可以在这个对象里面定义和设置,如 asynchronous,可以为true 或 false 来决定AJAX对服务器的调用是否是异步的(默认值是 true)。
这个参数定义AJAX调用的选项。在我们的例子中,在第一个参数通过HTTP GET命令请求那个url,传入了变量 pars包含的查询字符串, Ajax.Request 对象在它完成接收响应的时候将调用showResponse 方法。
也许你知道, XMLHttpRequest在HTTP请求期间将报告进度情况。这个进度被描述为四个不同阶段:Loading, Loaded, Interactive, 或 Complete。你可以使 Ajax.Request 对象在任何阶段调用自定义方法 ,Complete 是最常用的一个。想调用自定义的方法只需要简单的在请求的选项参数中的名为 onXXXXX 属性/方法中提供自定义的方法对象。 就像我们例子中的 onComplete 。你传入的方法将会被用一个参数调用,这个参数是 XMLHttpRequest 对象自己。你将会用这个对象去得到返回的数据并且或许检查包含有在这次调用中的HTTP结果代码的 status 属性。
还有另外两个有用的选项用来处理结果。我们可以在onSuccess 选项处传入一个方法,当AJAX无误的执行完后调用, 相反的,也可以在onFailure选项处传入一个方法,当服务器端出现错误时调用。正如onXXXXX 选项传入的方法一样,这两个在被调用的时候也传入一个带有AJAX请求的XMLHttpRequest对象。
我们的例子没有用任何有趣的方式处理这个 XML响应, 我们只是把这段XML放进了一个文本域里面。对这个响应的一个典型的应用很可能就是找到其中的想要的信息,然后更新页面中的某些元素, 或者甚至可能做某些XSLT转换而在页面中产生一些HTML。
- 大小: 17 KB
- 大小: 14.9 KB
- 大小: 31 KB
- 大小: 24.7 KB
- 大小: 45.4 KB
- 大小: 54.5 KB
分享到:
相关推荐
C++学习笔记和实践项目,实践项目包括Json工具类、设计模式的C++实现、消息队列、智能指针,linux下的并发控制工具、线程池,epoll管理器和Mysql连接池、STL容器的快捷输出工具和页面置换算法(FIFO, LRU, LFU)的...
在这5堂课中,学生将可以学习到深度学习的基础,学会构建神经网络,并用在包括吴恩达本人在内的多位业界顶尖专家指导下创建自己的机器学习项目。Deep Learning Specialization对卷积神经网络 (CNN)、递归神经网络 ...
Struts2 是一个非常优秀的MVC框架,基于Model2...整合Ajax支持:json插件 Struts2的今生前世: 1.早期开发模型Servlet+JSP+JavaBean显得力不从心: 流程凌乱、数据传递无序、缺乏辅助功能。 2.MVC模式的轻量级Web应
在项目开发的过程中,因为无法和后台的数据做交互,所以我们可以自建一个假数据文件(如data.json)到项目文件夹中,这样我们就可以模仿后台的数据进行开发。但是,如何在一个vue.js 项目中引入本地的json文件呢,下面...
ASP.NET Core 3高级编程学习笔记 - 基于C#开发,包含132个文件,如CS、MAP、CSS、JSON、CSHTML、CSPROJ、JS、SLN、USER和GITIGNORE等。该项目为用户提供了一个基于C#的ASP.NET Core 3高级编程学习笔记,通过界面交互...
最近有个用单片机的项目用到了CJSON,本文总结了CJSON应用的主要API函数及应用的注意事项
开发工具安装好后,新建一个项目,记得取消勾选“创建quick start项目” (此图片来源于网络,如有侵权,请联系删除! ) 从Hello,World!开始 了解下目录结构 小程序 = app程序主体 + 页面pages app程序主体文件...
XPAGE学习笔记 1 Theme 2 2 在Xpage中使用Dojo 2 2.1 加载dojo.js 2 2.2 设置应用程序主题引入tundra.css 2 2.3 设置xpage属性引入dojo模块 3 2.4 Xpage的页面html代码 4 2.5 在xpage中使用dojo编程 4 2.5.1 按钮...
{11}项目}{148}{chapter.11} {11.1}ELTS}{148}{section.11.1} {12}Oracle数据库}{151}{chapter.12} {12.1}术语}{151}{section.12.1} {12.2}登录数据库}{151}{section.12.2} {12.3}创建表格}{152}{section.12.3...
机器学习&深度学习资料笔记&基本算法实现&资源整理.zip 0.不调库系列 No free lunch. 线性回归 - logistic回归 - 感知机 - SVM(SMO) - 神经网络 决策树 - Adaboost kNN - 朴素贝叶斯 EM - HMM - 条件随机场 kMeans ...
D3 4.X 数据可视化实战手册 学习笔记 1、启动方法 step 1: npm i step 2: npm start step 3: 在浏览器中打开下面地址 http://localhost:8082 or http://localhost:8082/index2.html 2、关于
参考资料:1.Python中用json.load() json.loads()加载json数据的方法:...2. python中yield的用法详解:https://blog.csdn.net/mieleizhi0522/article/details/82142856/ 一个很有趣
学习笔记 数据结构 Java (最终基于CAS实现) Spring Mybatis Zookeeper 数据库 Linux 大数据 协议 代码质量 画图工具 (在线,支持流程图、思维导图、原型图、UML、网络拓扑图等) ##Web转App工具 We5X HBuilder 数据...
Go入门的学习笔记,从零开始学Go,做一个Go工程师。 持续更新... 项目结构 ├─ Go │ ├─ 00-基础语法 │ ├── 01-环境安装 │ ├── 02-变量声明 │ ├── 03-数组 │ ├── 04-Slice 切片 │ ├── 05-...
###SpringBoot的项目实战学习笔记#####SpringBoot的版本是1.5.10.RELEASE,全部基于Spring4.X的java配置.java版本是1.8,Maven的版本是3.3.9第一章基本使用篇 1. 热部署的配置使用和原理的了解.devtools 2. Markdown的...
由于第一次初始的时候,下载的demo,由于没有注意app.json的放置的文件夹位置,导致了多了一层,导致老是报一个错误。经同事指点后,将文件和项目文件夹放置同一级处,这样就可以顺利调试到。由于appid申请不到,在...
装饰器3.Json & pickle 数据序列化4.软件目录结构规范5.作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 列表生成式:a = [i+1 for i in range(10)] 列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每...
今天开始学习小程序,按自己写APP的顺序开始,就不按微信官方文档来了。 有些控件是结合官方和网上其他同学分享的代码。 基础概述 这一部分看官方网站,了解一下小程序的架构页面组成啥的,没什么难度,打开微信...
纯属娱乐学习项目,偶尔记录下开发中遇到的问题和想法,不定期更新,如果你有什么建议也请告诉我()。项目中自己的封装一些组件,可在项目结构查看。影视数据全部由API提供。目前豆瓣搜索接口已经没有免费的可以...
MongoDB是一个基于分布式文件存储的数据库开源项目。由C++语言编写,旨在为WEB应用提供可护展的高性能数据存储解决方案。它的特点是可扩展,高性能,易使用,模式自由,存储数据非常方便等。1.1.1主要功能特性a)面向...