客户端常用的数据交换格式有xml、json、html
json:是一种轻量级数据交换格式
xml:是一种重量级的数据交换格式,标记语言
json与xml区别:
1、json占用宽带小、xml占用宽带大
2、微服务是http+json进行通讯。
3、json轻量级xml重量级
数据交换格式 == 报文 == 发送的一些参数 == 参数列表
json:是一种轻量级数据交换格式
json里面有jsonObject ---json对象 jsonArray---json数组
建maven项目使用的json
com.alibaba
fastjson
1.2.7
代码1 使用fastjson
package com.leeue.json;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
*
* @classDesc: 功能描述:(使用fastjson 解析)
* @author:李月
* @Version:v1.0
* @createTime:2018年7月25日 下午1:46:10
*/
public class JSONDemo01 {
// 转义 把" 变成 \"
public static String jsonStr = "{\"id\": \"001\",\"name\": \"里约\",\"items\": [{\"itemId\": \"002\",\"itemName\": \"嘻嘻\"}, {\"itemId\": \"002\",\"itemName\": \"嘻嘻\"}]}";
public static void main(String[] args) {
// new JSONObject();
// 1、先将json字符串转换成jsonObject对象来操作。
JSONObject jsonObject = JSONObject.parseObject(jsonStr);
String id = jsonObject.getString("id");
System.out.println("id:" + id);
String name = jsonObject.getString("name");
System.out.println("name:" + name);
// 取jsonArray类型
JSONArray jsonArray = jsonObject.getJSONArray("items");
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject object = jsonArray.getJSONObject(i);
String itemId = object.getString("itemId");
System.out.println("itemId:" + itemId);
String itemName = object.getString("itemName");
System.out.println("itemName:" + itemName);
}
}
}
代码2:将json转换成对象再来解析
package com.leeue.json;
import com.alibaba.fastjson.JSONObject;
import com.leeue.entity.User;
/**
*
* @classDesc: 功能描述:(将json数据文件 转换程对象)
* @author:李月
* @Version:v1.0
* @createTime:2018年7月25日 下午1:56:59
*/
public class JSONDemo02 {
public static String jsonStr = "{\"id\": \"001\",\"name\": \"里约\",\"items\": [{\"itemId\": \"002\",\"itemName\": \"嘻嘻\"}, {\"itemId\": \"002\",\"itemName\": \"嘻嘻\"}]}";
public static void main(String[] args) {
User user = (User) new JSONObject().parseObject(jsonStr,User.class);
System.out.println(user.toString());
}
}
package com.leeue.json;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
*
* @classDesc: 功能描述:(自定义json字符串)
* @author:李月
* @Version:v1.0
* @createTime:2018年7月25日 下午2:08:10
*/
public class JSONDemo03 {
public static void main(String[] args) {
JSONObject root = new JSONObject();
root.put("id", "23");
root.put("name", "leeue");
JSONArray jsonArray = new JSONArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("itemId", "001");
jsonObject.put("itemName", "打球");
JSONObject jsonObject2 = new JSONObject();
jsonObject2.put("itemId", "002");
jsonObject2.put("itemName", "嘻嘻");
jsonArray.add(jsonObject);
jsonArray.add(jsonObject2);
root.put("items", jsonArray);
System.out.println(root.toJSONString());
}
}
显示:
package com.leeue.json;
/**
*
* @classDesc: 功能描述:(使用实体类封装成json字符串)
* @author:李月
* @Version:v1.0
* @createTime:2018年7月25日 下午2:15:31
*/
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSONObject;
import com.leeue.entity.Item;
import com.leeue.entity.User;
public class JSONDemo04 {
public static void main(String[] args) {
User user = new User();
user.setId("23");
user.setName("嘻嘻");
List- items = new ArrayList
- ();
Item item = new Item();
item.setItemId("11");
item.setItemName("哈哈");
items.add(item);
Item item2 = new Item();
item2.setItemId("22");
item2.setItemName("敷敷");
items.add(item2);
user.setItems(items);
System.out.println(new JSONObject().toJSONString(user));
}
}
显示结果:
什么是xml?
xml就是一个标记语言,一般做描述数据,配置文件等
DTD文件就是用来约束规则的。
解析xml方式有哪些?
dom4j、sax、pull
dom4j:不适合大文件解析
sax:适用大文件解析
package com.leeue.xml;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XMLDemo01 {
public static void main(String[] args) throws DocumentException {
//1、获取到读取对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("student.xml");
//获取根节点 获取到根节点就能获取到所有的节点了
Element rootElement = document.getRootElement();
getNodes(rootElement);
}
public static void getNodes(Element rootElement) {
String name = rootElement.getName();
System.out.println("节点名称:"+name);
//获取节点属性
List attributes = rootElement.attributes();
for (Attribute attribute:attributes) {
System.out.println("属性名称"+attribute.getName()+"---"+attribute.getText());
}
//获取值
String value = rootElement.getTextTrim();
if(!value.equals("")) {
System.out.println("节点属性名称:"+value);
}
//判断是否还有下个节点
Iterator elementIterator = rootElement.elementIterator();
while (elementIterator.hasNext()) {
Element next = elementIterator.next();//拿到下个节点
getNodes(next);
}
}
}
什么是Java反射?
反射机制就是正在运行动态获取当前类的所有信息。
类可以不用new 使用java反射机制帮你去初始化
类私有属性可以使用java的反射机制赋值。
核心》当前类的class机制
默认创建的时候调用的无参构造函数
应用:框架、Jdbc连接驱动、SpringIOC
java反射机制作用?
提高程序的扩张性,封装一些工具类、写一些框架都会用上反射机制。
怎么禁止使用java反射机制?
将构造函数修饰符变成 private 私有的的。
将构造函数私有化。
案例:
package com.leeue.reflex;
import java.lang.reflect.Constructor;
import com.leeue.entity.User;
/**
*
* @classDesc: 功能描述:(使用java反射机制来创建对象)
* @author:李月
* @Version:v1.0
* @createTime:2018年7月25日 下午3:02:04
*/
public class ReflexDemo01 {
public static void main(String[] args) throws Exception {
// 1、new 方式创建对象
// User user = new User();
// 2、使用反射机制创建对象Class.forName("类的完整路径")
Class forName = Class.forName("com.leeue.entity.User");
// 使用默认无参构造函数创建对象
User classUser = (User) forName.newInstance();
System.out.println(classUser);
// 使用有参数的构造函数创建对象。 String.class.表示传入的构造函数参数是什么类型的
Constructor constructor = forName.getConstructor(String.class, String.class);
User user = (User) constructor.newInstance("1", "xixi");
System.out.println("使用有参数构造函数创建User:" + user.toString());
}
}
案例:获取私有属性、方法
package com.leeue.reflex;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import com.leeue.entity.User;
/**
*
* @classDesc: 功能描述:(使用反射机制修改私有属性 )
* @author:李月
* @Version:v1.0
* @createTime:2018年7月25日 下午3:38:14
*/
public class ReflexDemo02 {
public static void main(String[] args) throws Exception {
//1.使用java的反射机制获取类的所有属性方法,并且唯私有属性赋值。
Class> forName = Class.forName("com.leeue.entity.User");
//2.获取到当前类的所有属性
Field[] declaredFields = forName.getDeclaredFields();
for(Field fieled:declaredFields) {
//打印出属性名称
System.out.println(fieled.getName());
}
//3获取当前类的所有方法
Method[] declaredMethods = forName.getDeclaredMethods();
for(Method method:declaredMethods) {
System.out.println(method.getName());
}
//4、使用java的反射机制修改私有属性赋值
Object newInstance = forName.newInstance();
Field fileId = forName.getDeclaredField("id");
//要设置这个 允许反射操作私有属性,如果不加会报错
fileId.setAccessible(true);
fileId.set(newInstance, "20");
Field fileName = forName.getDeclaredField("name");
fileName.setAccessible(true);
fileName.set(newInstance, "哈哈哈");
//强转成user对象
User user = (User) newInstance;
System.out.println(user.toString());
}
}
什么是SpringIOC
控制反转,将每个bean与bean之间的关系交给第三方容器(spring)进行管理。
手写springIOC框架步骤:
第一步:
解析xml application.xml
第二步:
使用对应的beanId查找对应的xml节点,获取class属性。
第三步:
使用java的反射机制初始化类。
第四步:
使用java的反射机制给私有属性赋值。
这4步就是springIOC底层实现原理。dom4j+java反射机制
反射机制缺点:初始化对象效率低、扩展性高。
使用反射机制主要是初始化类:
第一种用法:调用无参构造函数创建对象 两行代码
// 2、使用反射机制创建对象Class.forName("类的完整路径")
Class forName = Class.forName("com.leeue.entity.User");
// 使用默认无参构造函数创建对象
User classUser = (User) forName.newInstance();
第二种:使用有参构造函数创建对象
// 2、使用反射机制创建对象Class.forName("类的完整路径")
Class forName = Class.forName("com.leeue.entity.User");
// 使用有参数的构造函数创建对象。
//String.class.表示传入的构造函数参数是什么类型的
Constructor constructor =
forName.getConstructor(String.class, String.class);
如果直接操作私有属性需要加上权限:
//4、使用java的反射机制修改私有属性赋值
Object newInstance = forName.newInstance();
//获取id这个私有属性
Field fileId = forName.getDeclaredField("id");
//要设置这个 允许反射操作私有属性,如果不加会报错
fileId.setAccessible(true);
//给id赋值
fileId.set(newInstance, "20");
主要代码:
package com.leeue.xml;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XMLDemo01 {
public static void main(String[] args) throws DocumentException {
//1、获取到读取对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("student.xml");
//获取根节点 获取到根节点就能获取到所有的节点了
Element rootElement = document.getRootElement();
getNodes(rootElement);
}
public static void getNodes(Element rootElement) {
String name = rootElement.getName();
System.out.println("节点名称:"+name);
//获取节点属性
List attributes = rootElement.attributes();
for (Attribute attribute:attributes) {
System.out.println("属性名称"+attribute.getName()+"---"+attribute.getText());
}
//获取值
String value = rootElement.getTextTrim();
if(!value.equals("")) {
System.out.println("节点属性名称:"+value);
}
//判断是否还有下个节点
Iterator elementIterator = rootElement.elementIterator();
while (elementIterator.hasNext()) {
Element next = elementIterator.next();//拿到下个节点
getNodes(next);
}
}
}