1、数据交换格式

  1.1 有哪些数据交换格式

    客户端与服务器常用数据交换格式xml、json、html

  1.2 数据交换格式应用场景

    1.2.1 移动端(安卓、iOS)通讯方式采用http协议+JSON格式走restful风格

    1.2.2 互联网项目主要采用Http协议+JSON

    1.2.3 因为xml比较重量级,WebService服务采用http+xml格式,银行项目使用比较多

  1.3 JSON 简单使用

    1.3.1 什么是JSON

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,相比于xml这种数据交换格式来说,因为解析xml比较的复杂,而且需要编写大段代码,所以客户端和服务器的数据交换个事往往通过JSON来进行交换。

{
"sites": [
{
"name": "张三",
"sex": "男"
},
{
"name": "小红",
"sex": "女"
}
]
}

  JSON:JavaScript 对象表示法(JavaScript Object Notation)。

  JSON的形式是用大括号“{}”包围起来的项目列表,每一个项目间用逗号(,)分隔,而项目就是用冒号(:)分隔的属性名和属性值。这是典型的字典表示形式,也再次表明javascript里的对象就是字典结构。不管多么复杂的对象,都可以用一句JSON代码来创建并赋值。在JSON中,名称 / 值对包括字段名称(在双引号中),后面写一个冒号,然后是值。

  1.4 JSON格式的分类

    JSON有两种

    JSON简单说就是JavaScript中的对象和数据,所以这两种结构就是对象和数据两种结构

    1.4.1 对象:对象在js中表示为“{}”括起来的内容,数据格式为{key:value,key:value,...}的键值对的结构。

    1.4.2 数组:数组在js中是中括号“[]”括起来的内容,数据结构为["java","javascript","vb",...],取值方式和所有语言一样,使用索引获取。

  1.5 常用JSON解析框架

    fastjson(阿里)、gson(谷歌)、jackson(springmvc自带)

    1.5.1使用fastjson解析json:

    添加jar包,引入依赖

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.43</version>
</dependency>
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray。

    解析json

     public static void main(String[] args) {
String jsonStr = "{\"sites\":[{\"name\":\"张三\",\"url\":\"www.zs.com\"},{\"name\":\"李四\",\"url\":\"http://lisi.com/\"}]}";
JSONObject jsonObject = new JSONObject();
// 将json字符串转为jsonbject
JSONObject jsonStrObject = jsonObject.parseObject(jsonStr);
JSONArray jsonArray = jsonStrObject.getJSONArray("sites");
for (Object object : jsonArray) {
JSONObject stObject = (JSONObject) object;
String name = stObject.getString("name");
String url = stObject.getString("url");
System.out.println(name + "---" + url);
}
}

   组装json

JSONObject jsonObject = new JSONObject();
JSONArray jsonArray = new JSONArray();
JSONObject stObject = new JSONObject();
stObject.put("name", "百度");
stObject.put("url", "http://www.baidu.com");
jsonArray.add(stObject);
jsonObject.put("sites", jsonArray);
System.out.println(jsonObject.toJSONString());

    1.5.2 XML的简单使用

      1.5.2.1 什么是xml

      xml是可扩展标记语言(Extesible Markup Language),是一种标记语言,主要描述数据和用作配置文件。xml文档在逻辑上主要由以下5个部分组成:

      xml声明:指明所用的xml版本、文档编码、文档的独立性信息

      元素:有开始标签、元素内容和结束标签构成

      注释:以结束,用于对文档中的内容起一个说明作用

      处理指令:通过处理指令来通知其他应用程序来处理非xml格式的数据

<?xml version="1.0" encoding="UTF-8"?>
<students>
<student1 id="001">
<姓名>残缺</姓名>
<学号>20140101</学号>
<地址>北京</地址>
</student1>
</students>

    1.5.2.2 xml的解析

      xml的解析有Dom4j、Sax、Pull方式。dom4j不适合大文件的解析,因为它是一下子将文件加载到内存中,所以有可能出现内存溢出,sax是基于事件来对xml进行解析的,所以他可以解析大文件的xml,也正是因为如此,所以dom4j可以对xml进行灵活的增删改查和导航,而sax没有这么强的灵活性,所以sax经常是用来解析大型xml文件,而要对xml文件进行一些灵活(crud)操作就用dom4j。

    1.5.2.3使用DOM4J解析xml

    解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步。

    a 自己创建Document对象

// 创建SAXReader对象
SAXReader reader = new SAXReader();
// 读取文件 转换成Document
Document document = reader.read(new File("XXXX.xml"));

    b 读取xml文本内容后去Document对象

String xmlStr = "<students>......</students>";
Document document = DocumentHelper.parseText(xmlStr);

    解析代码

public static void main(String[] args) throws DocumentException {
SAXReader saxReader = new SAXReader();
Document read = saxReader.read(new File("E://src//main//resources//stu.xml"));
// 获取根节点
Element rootElement = read.getRootElement();
getNodes(rootElement); } static public void getNodes(Element rootElement) {
System.out.println("当前节点名称:" + rootElement.getName());
// 获取属性ID
List<Attribute> attributes = rootElement.attributes();
for (Attribute attribute : attributes) {
System.out.println("属性:" + attribute.getName() + "---" + attribute.getText());
}
if (!rootElement.getTextTrim().equals("")) {
System.out.println(rootElement.getName() + "--" + rootElement.getText());
}
// 使用迭代器遍历
Iterator<Element> elementIterator = rootElement.elementIterator();
while (elementIterator.hasNext()) {
Element next = elementIterator.next();
getNodes(next);
}
}

  1.5.3 XML和JSON的区别

    Xml是重量级数据交换格式,占宽带比较大。 JSON是轻量级交换格式,xml占宽带小。 所有很多互联网公司都会使用json作为数据交换格式。很多银行项目,大多数还是在使用xml。

2、Java的反射机制

  2.1 什么是java反射

    就是能够将正在运行,动态获取这个类的所有信息的技术   

  2.2 反射机制的作用

    a 反编译:.class -> .java

    b 通过反射机制访问java对象的属性、方法、构造方法等;

  2.3 反射机制的应用场景

    a Jdbc加载驱动

    b Spring ioc

    c 框架

  2.4 反射机制获取类的三种方法

    //第一种方式:
Classc1 = Class.forName("Employee"); //第二种方式:
//java中每个类型都有class 属性.
Classc2 = Employee.class; //第三种方式:
//java语言中任何一个java对象都有getClass 方法
Employeee = new Employee();
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)

  2.5 反射创建对象的方式

    Class<?> forName = Class.forName("com.stu.entity.User");
// 创建此Class 对象所表示的类的一个新实例 调用了User的无参数构造方法.
Object newInstance = forName.newInstance();

  实例化有参构造函数

    Class<?> forName = Class.forName("com.stu.entity.User");
Constructor<?> constructor = forName.getConstructor(String.class, String.class);
User newInstance = (User) constructor.newInstance("123", "123");
方法名称 作用
getDeclaredMethods [] 获取该类的所有方法
getReturnType() 获取该类的返回值
getFields() 只返回公共字段,即有public修饰的字段,包括父类
getParameterTypes() 获取传入参数
getDeclaredFields() 获取该类的所有字段,不包括父类
setAccessible 允许访问私有成员

 

  2.6 使用反射为类私有属性赋值

    // 获取当前类class地址
Class<?> forName = Class.forName("com.demo.entity.User");
// 使用反射实例化对象 无参数构造函数
Object newInstance = forName.newInstance();
// 获取当前类的 userId字段
Field declaredField = forName.getDeclaredField("userId");
// 允许操作私有成员
declaredField.setAccessible(true);
// 设置值
declaredField.set(newInstance, "123");
User user = (User) newInstance;
System.out.println(user.getUserId());

3、手写SpringIOC框架

  3.1什么是SpringIOC

    就是把每一个bean与本案之间的关系交给第三方容器管理

  xml配置

<beans>
<bean id="user1" class="com.stu.entity.UserEntity">
<property name="userId" value="0001"></property>
<property name="userName" value="张三"></property>
</bean>
<bean id="user2" class="com.stu.entity.UserEntity">
<property name="userId" value="0002"></property>
<property name="userName" value="李四"></property>
</bean>
</beans>

  java代码

    //1.读取springxml配置
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
//2.获取bean对象
TestService testService = (TestService) classPathXmlApplicationContext.getBean("testService");
System.out.println(testService.test());

  3.2 什么是SpringIOC底层实现原理

    a 读取bean的xml配置文件

    b 使用beanID查找bean配置,并获取配置文件中的class地址

    c 使用Java反射技术实例化对象

    d 获取属性配置,使用反射技术进行赋值

  详细步骤

1.利用传入的参数获取xml文件的流,并且利用dom4j解析成Document对象
2.对于Document对象获取根元素对象<beans>后对下面的<bean>标签进行遍历,判断是否有符合的id.
3.如果找到对应的id,相当于找到了一个Element元素,开始创建对象,先获取class属性,根据属性值利用反射建立对象.
4.遍历<bean>标签下的property标签,并对属性赋值.注意,需要单独处理int,float类型的属性.因为在xml配置中这些属性都是以字符串的形式来配置的,因此需要额外处理.
5.如果属性property标签有ref属性,说明某个属性的值是一个对象,那么根据id(ref属性的值)去获取ref对应的对象,再给属性赋值.
6.返回建立的对象,如果没有对应的id,或者<beans>下没有子标签都会返回null

  3.3使用反射技术完成Java代码

import java.lang.reflect.Field;
import java.util.List; import org.apache.commons.lang3.StringUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; import com.demo.entity.User; /**
*
* @classDesc: 功能描述:(读取Spring配置文件)*/
public class ClassPathXmlApplicationContext {
private String xmlPath;
/**
*
* @param xmlPath
* spring xml 配置路径
*/
public ClassPathXmlApplicationContext(String xmlPath) {
this.xmlPath = xmlPath;
} public Object getBean(String beanId) throws Exception {
// 解析xml器
SAXReader saxReader = new SAXReader();
Document read = null;
try {
// 从项目根目录路径下 读取
read = saxReader.read(this.getClass().getClassLoader().getResourceAsStream(xmlPath));
} catch (Exception e) {
e.printStackTrace();
}
if (read == null) {
return null;
}
// 获取根节点资源
Element root = read.getRootElement();
List<Element> elements = root.elements();
if (elements.size() <= 0) {
return null;
}
Object oj = null;
for (Element element : elements) {
String id = element.attributeValue("id");
if (StringUtils.isEmpty(id)) {
return null;
}
if (!id.equals(beanId)) {
continue;
// throw new Exception("使用beanId:" + beanId + ",未找到该bean");
}
// 获取实体bean class地址
String beanClass = element.attributeValue("class");
// 使用反射实例化bean
Class<?> forNameClass = Class.forName(beanClass);
oj = forNameClass.newInstance();
// 获取子类对象
List<Element> attributes = element.elements();
if (attributes.size() <= 0) {
return null;
}
for (Element et : attributes) {
// 使用反射技术为方法赋值
String name = et.attributeValue("name");
String value = et.attributeValue("value");
Field field = forNameClass.getDeclaredField(name);
field.setAccessible(true);
field.set(oj, value); } }
return oj;
// 1.使用beanId查找配置文件中的bean。
// 2.获取对应bean中的classpath配置
// 3.使用java反射机制实体化对象
} public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
User bean = (User) applicationContext.getBean("user2");
System.out.println("使用反射获取bean" + bean.getUserId() + "---" + bean.getUserName()); }
}

数据交换格式与SpringIOC底层实现的更多相关文章

  1. 【学习】006数据交换格式与SpringIOC底层实现

    课程目标 XML和JSON Java反射机制 手写SpringIOC 什么是数据交换格式 客户端与服务器常用数据交换格式xml.json.html 数据交换格式用场景 移动端(安卓.IOS)通讯方式采 ...

  2. iOS 中 JSON 数据交换格式

         JSON (JavaScript Object Notation)是一种轻量级的数据交换格式. JSON 的详细教程,能够參见 JSON 中国:http://www.json.org.cn/ ...

  3. Atitit.常见软件 数据 交换格式 标准

    Atitit.常见软件 数据 交换格式 标准 1. 常见的数据格式txt ,doc ,pic,music ,vodio1 2. 通用格式json yaml phpstr1 3. 专用格式1 4. 用户 ...

  4. 在.NET使用JSON作为数据交换格式

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhoufoxcn.blog.51cto.com/792419/517093 我们 ...

  5. json 数据交换格式与java

    http://wiki.mbalib.com/wiki/数据交换 数据交换是指为了满足不同信息系统之间数据资源的共享需要,依据一定的原则,采取相应的技术,实现不同信息系统之间数据资源共享的过程. 数据 ...

  6. 常用两种数据交换格式之XML和JSON的比较

    目前,在web开发领域,主要的数据交换格式有XML和JSON,对于XML相信每一个web developer都不会感到陌生: 相比之下,JSON可能对于一些新步入开发领域的新手会感到有些陌生,也可能你 ...

  7. NDEF-NFC数据交换格式

    为实现NFC标签.NFC设备以及NFC设备之间的交互通信,NFC论坛(NFC FROUM)定义了称为NFC数据交换格式(NDEF)的通用数据格式.NDEF是轻量级的紧凑的二进制格式,可带有URL,vC ...

  8. XML和JSON两种数据交换格式的比较

    在web开发领域,主要的数据交换格式有XML和JSON,对于在 Ajax开发中,是选择XML还是JSON,一直存在着争议,个人还是比较倾向于JSON的.一般都输出Json不输出xml,原因就是因为 x ...

  9. Java 常见数据交换格式——xml、json、yaml

    目录 数据交换格式介绍 XML 使用DOM方式解析 使用SAX方式解析 使用DOM4J方式解析 使用JDOM方式解析 JSON 使用JSONObject方式将数据转换为JSON格式 利用JSONObj ...

随机推荐

  1. C# /VB.NET操作Word批注(一)—— 插入、修改、删除Word批注

    批注内容可以是对某段文字或内容的注释,也可以是对文段中心思想的概括提要,或者是对文章内容的评判.疑问,以及在阅读时给自己或他人起到提示作用.本篇文章中将介绍如何在C#中操作Word批注,主要包含以下要 ...

  2. PHP代码片段

    将数组拼接为 table 标签字符串 <?php //判断是否是图片 function isImage($string){ $isImage = false; $pics = ['.png', ...

  3. 关于HTTP中GET与POST的区别

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 看似很简单,其实是一道送命题 “标准答案”: GET在浏览器回退时是无害的,而POST会再次提交请求. ...

  4. XSS 漏洞介绍

    概念: XSS 攻击:跨站脚本攻击 (Cross Site Scripting),为不和层叠样式表 (Cascading Style Sheets, CSS) 的缩写混淆.故将跨站脚本攻击缩写为 XS ...

  5. iOS---------显示和隐藏状态栏的网络活动标志

    //在向服务端发送请求状态栏显示网络活动标志: [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; ...

  6. Android Studio调试手机或者安装APK的时候出现install failed test only

    1.检查\app\src\main\AndroidMainfest.xml中是否有testOnly属性为true,如果有去掉或者改为false 2.检查Android Studio和gradle版本是 ...

  7. Fragment与Activity的生命周期对比

    因为fragment是依赖于activity的,所以activity的创建相关都是先于fragment的,fragment的销毁相关都是先于activity的.

  8. c# 多线程委托传参方式

    1.定义一个线程调用的方法函数 private void RTPServer(object _Serverip) { IPEndPoint Serverip = _Serverip as IPEndP ...

  9. [转]QQ空间、新浪微博、腾讯微博等一键分享API链接代码

    转自------ 1.新浪微博:http://service.weibo.com/share/share.php?url= count=表示是否显示当前页面被分享数量(1显示)(可选,允许为空)&am ...

  10. 启动期间的内存管理之pagging_init初始化分页机制--Linux内存管理(十四)

    1 今日内容(分页机制初始化) 在初始化内存的结点和内存区域之前, 内核先通过pagging_init初始化了内核的分页机制. 在分页机制完成后, 才会开始初始化系统的内存数据结构(包括内存节点数据和 ...