概述

展标记语言,由程序设计编写者自定义实现
XML主要以标记文本形式表示一组或多组数据,使用XML格式传递数据可以实现跨平台跨计算机编程语言

语法规则

必写

<?xml version="1.0" encoding="UTF-8"?>

至少有一个根元素类

&lt; <小于
&gt; >大于
&amp; &和号
&apos; '单引号
&quot; "引号

XML文件的解析

DOM文档对象模型
SAX简单的XML API
JDOM java文件对象模型
DOM4J 拓展于JDOM

JDOM读取xml
创建SAXBuilder来构建加载目标XML文档
基于XML路径创建XML文件对象
使用SAXBuilder加载XML文件对象
利用JDOM相关方法解析XML文档封装成java对象
JDOM写入xml
创建XmlOutput用来修改写入XML文档
基于XML路径创建XML文件对象
使用SAXBuilder加载XML文件对象
利用JDOM相关方法将修改信息写入XML文档
整合
文件目录

student.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--此文档用来存储学生信息-->
<students><!--students是文档的根元素--><student code="stu001"><chen>陈陈陈</chen><age>89</age><女>男</女></student><student code="stu002"><name>张三</name><age>2</age><sex>女</sex></student><student code="stu003"><name>鸿飞</name><age>23</age><sex>男</sex></student>
</students>

定义学生类,用来接收XML中的student信息

package entity;public class Student {private String name;private int age;private String sex;private String code;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}
}

获取当前路径的方法

package util;public final class Tools {public static String getClassPath(){//获取当前应用程序类路径的通用方法return Tools.class.getClassLoader().getResource("").getPath().toString();}
}

XML的读取并存储,以及修改XML文件

package util;import entity.Student;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.XMLOutputter;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;public class JDOMxmlManager {//用来解析xml文件private static SAXBuilder saxbuilder;// 用来构建xml文档private static Document document;// XML文档对象private static XMLOutputter xmlOutput;public static List<Student> toStudentFromXml(String xmlFileName){//读取xml封装为Student对象,存储到List集合中List<Student> stuList = new ArrayList<Student>();newInstanceSAXBuilder();String classPath = Tools.getClassPath();//调用获取类路径的方法System.out.println(classPath);/* 基于类路径创建目标xml文件的java.io.File对象*/File xmlFile = new File(classPath+"day25/doc/"+xmlFileName);System.out.println(classPath+"day25/doc/"+xmlFileName);try {document = saxbuilder.build(xmlFile);// 使用saxBuilder实例构建目标xml文件得到一个Document对象if(document != null){//如果文档不等于空,开始解析Element root = document.getRootElement();//获取xml文档对象Document根节点List<Element> studentList = root.getChildren();//获取根节点下的一级子元素for(Element e:studentList){// 循环遍历所有根节点下的Student子元素,并将其封装为Student学生对象Student stuObj = new Student();String code = e.getAttribute("code").getValue();// 获取当前元素的code属性对应的值stuObj.setCode(code);// 获取当前元素的子元素String name = e.getChild("name").getText();stuObj.setName(name);String sex = e.getChild("sex").getText();stuObj.setSex(sex);int age = Integer.parseInt(e.getChild("age").getText());stuObj.setAge(age);//添加到List中stuList.add(stuObj);}}} catch (JDOMException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return stuList;}//此方法用来创建一个saxbulider对象private static void newInstanceSAXBuilder(){if(saxbuilder == null){saxbuilder = new SAXBuilder();}}private static void newInstanceXMLOutputter(){if(xmlOutput == null){xmlOutput = new XMLOutputter();}}public static void modifyXML(Student stu,String fileName){// 此方法实现对象目标xml的信息修改newInstanceSAXBuilder();String classPath = Tools.getClassPath();File xmlFile = new File(classPath + "day25/doc/" + fileName);newInstanceXMLOutputter();//实例化xmlOutPutterWriter out = null;
//        System.out.println(stu.getCode());try {document = saxbuilder.build(xmlFile);Element root = document.getRootElement();//获取根元素List<Element> studentList = root.getChildren("student");//获取所有一级节点studentfor(Element e:studentList){String codeVal = e.getAttribute("code").getValue();//获取code属性值,用来进行对比if(stu.getCode().equals(codeVal)){//如果stu的code值与codeVal值相同System.out.println("进入");Element nameEle = e.getChild("name");
//                    System.out.println(nameEle.getText()); // 正确输出nameEle.setName(stu.getName());Element sexEle = e.getChild("sex");sexEle.setName(stu.getSex());}}out = new FileWriter(fileName);//写入xml目标文件的输出流System.out.println("进入这里了吗?");xmlOutput.output(document,out);//用out这个流写入document文件} catch (Exception e){e.printStackTrace();}finally{try {out.close();} catch (IOException e) {e.printStackTrace();}}}
}

测试方法
首先测试读取xml文件

import entity.Student;
import util.JDOMxmlManager;import java.util.List;public class TestClass {public static void main(String[] args) {//        System.out.println(Tools.getClassPath());String xmlFile = "students.xml";List<Student> sL =  JDOMxmlManager.toStudentFromXml(xmlFile);for(Student s:sL){System.out.println(s.getName() + "," + s.getSex() + "," + s.getCode() + "," + s.getAge());}}
}

结果:

然后对XML文件进行改写

import entity.Student;
import util.JDOMxmlManager;public class TestJdomWriteXml {public static void main(String[] args) {String code = "stu001";String name = "chen";String sex = "女";Student sTemp = new Student();sTemp.setName(name);sTemp.setSex(sex);sTemp.setCode(code);String fileName = "students.xml";JDOMxmlManager.modifyXML(sTemp,fileName);}
}

改写的结果在bin文件夹中

DOM4j解析XML

只和java相关,实现与JDOM类似
解析分为两种操作:
1、读取目标XML文档并解析,封装成运行时的java对象进行处理
2、将运行时java对象以XML文件方式写入硬盘储存

DOM4J写入XML文档步骤
1、创建DocumentFactory用来创建Document对象
2、使用DOM4J实现对Document对象操作
3、创建XMLWriter用来将Doucument对象写入XML文件
4、关闭相关文件流
DOM4J读取文档步骤
1、基于xml文件路径创建File对象
2、创建SAXReader用来加载xml文件为Document
3、DOM4J相关方法解析XML文档
4、封装文档对象数据为java对象

package util;import entity.Employee;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentFactory;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;import java.io.*;
import java.util.ArrayList;
import java.util.List;public class Dom4jXmlManager {private static DocumentFactory docFactory = DocumentFactory.getInstance();//没有new方法public static void toXMLFromEmployee(List<Employee> emplist,String filename){Document doc = docFactory.createDocument("utf-8");Element rootEle = docFactory.createElement("employees");doc.setRootElement(rootEle);// 设置文档的根元素if(emplist != null && emplist.size() != 0){//不为空for(Employee e:emplist){Element empEle = docFactory.createElement("employee");// 循环创建rootEle下的子元素Element codeEle = docFactory.createElement("code");codeEle.setText(e.getEmpId());// 设置code的值Element nameEle = docFactory.createElement("name");nameEle.setText(e.getEmpName());Element ageEle = docFactory.createElement("age");ageEle.setText(String.valueOf(e.getEmpAge()));//将子元素添加到empELe中empEle.add(codeEle);empEle.add(nameEle);empEle.add(ageEle);rootEle.add(empEle);//将empEle添加到根节点/*实现将Document对象保存为xml文件*/String classPath = Tools.getClassPath();File xmlFile = new File(classPath + "day25/doc/" + filename);/*创建XMLWriter*/Writer writer = null;try {writer = new FileWriter(xmlFile);XMLWriter xmlWriter = new XMLWriter(writer, OutputFormat.createCompactFormat());// 第二个参数可以规范书写格式xmlWriter.write(doc);// 写入文档} catch (IOException ioException) {ioException.printStackTrace();}finally {try {writer.close();} catch (IOException ioException) {ioException.printStackTrace();}}}}}public static List<Employee> toEmployeeFromXml(String fileName){List<Employee> empList = new ArrayList<Employee>();String classPath = Tools.getClassPath();File xmlFile = new File(classPath + "day25/doc/" + fileName);Reader reader = null;try {reader = new FileReader(xmlFile);SAXReader saxReader = new SAXReader(); // 建立saxreader对象Document doc = saxReader.read(reader);if(doc != null){Element rootEle = doc.getRootElement();//获取根元素List<Element> el = rootEle.elements("employee");for(Element e:el){Employee empObj = new Employee(e.elementText("code"),e.elementText("name"),Integer.valueOf(e.elementText("age")));empList.add(empObj);}}} catch (FileNotFoundException | DocumentException e) {e.printStackTrace();}finally {try {reader.close();} catch (IOException e) {e.printStackTrace();}}return empList;}
}

employee类 :

package entity;public class Employee {private String empCode;private String empName;private int empAge;public String getEmpId() {return empCode;}public void setEmpId(String empId) {this.empCode = empId;}public String getEmpName() {return empName;}public void setEmpName(String empName) {this.empName = empName;}public int getEmpAge() {return empAge;}public void setEmpAge(int empAge) {this.empAge = empAge;}public Employee(String empCode, String empName, int empAge) {this.empCode = empCode;this.empName = empName;this.empAge = empAge;}
}

检验:先将数据写入xml文档,然后再读出来,通过控制台输出

import entity.Employee;
import util.Dom4jXmlManager;import java.util.ArrayList;
import java.util.List;public class Dom4jTest {public static void main(String[] args) {Employee e1 = new Employee("1","chen",13);Employee e2 = new Employee("2","lao",132);Employee e3 = new Employee("3","liang",140);ArrayList<Employee> employees = new ArrayList<>();employees.add(e1);employees.add(e2);employees.add(e3);Dom4jXmlManager.toXMLFromEmployee(employees,"employees.xml");/*读取文件*/List<Employee> readerEmpList = Dom4jXmlManager.toEmployeeFromXml("employees.xml");for(Employee e:readerEmpList){System.out.println(e.getEmpId()+"," + e.getEmpName()+"," + e.getEmpAge());}}
}

结果:

代理

java中的代理为某个对象提供一种代理机制,使对象不能直接进行访问,是一种设计模式
代理实现中可以分为以下角色:
抽象接口:声明真实对象和代理对象的共同接口
代理角色(代理实现者):其中主要包含了被代理的对象
真实角色(被代理对象):客户最终要引用目标对象

静态代理

实现方法:
代理角色和真实角色拥有共同的抽象接口
一个真实对象对应一个代理角色
真实角色实现必须存在,在代理对象中被给定不变
设计实现简单清晰。会产生更多的类

动态代理

1、代理类的代理实现代码被固定下来,不会因为业务的逐渐增长而改表;
2、在程序运行时超采区欸的那个被代理对戏的类型
3、实现AOP编程更加灵活,这是静态代理无法实现的
4、解耦,在web业务下,可以实现数据层和业务层的分离

代码实例

(代码好像有点多)
先把整个文件目录列出来

首先看数据文件,db文件夹下的DataBase(模拟数据库,都是一些数据,大致看看就行)

package xzit.db;import xzit.entity.Department;
import xzit.entity.Employee;
import xzit.entity.Goods;import java.util.ArrayList;
import java.util.List;public class DataBase {public static final List<Department> DEPLIST = new ArrayList<Department>();public static final List<Employee> EMPLIST = new ArrayList<Employee>();public static final List<Goods> GOODSLIST = new ArrayList<Goods>();static{DEPLIST.add(new Department("dep100","事业部"));DEPLIST.add(new Department("dep200","策划部"));DEPLIST.add(new Department("dep300","市场部"));DEPLIST.add(new Department("dep400","人事部"));DEPLIST.add(new Department("dep500","研发部"));DEPLIST.add(new Department("dep600","测试部"));EMPLIST.add(new Employee("任我行","男","黑木崖"));EMPLIST.add(new Employee("任盈盈","女","黑木崖"));EMPLIST.add(new Employee("令狐冲","男","华山"));EMPLIST.add(new Employee("岳不群","男","华山"));EMPLIST.add(new Employee("丁春秋","男","南海"));GOODSLIST.add(new Goods("goods100","加热器",123.50));GOODSLIST.add(new Goods("goods200","胜利羽毛球lark4",54.00));GOODSLIST.add(new Goods("goods300","联想笔记本T450",8900.50));GOODSLIST.add(new Goods("goods400","小米麦克风",99.50));}
}

数据库中包含的三个类:Department(部门),Employee(员工),Goods(货物),在entity文件夹下,包含get/set方法和构造器,没有其他方法,受篇幅影响就不贴代码出来了。

静态代理
首先明确代理对象和被代理对象
代理对象为客户,Client类

package xzit.entity;
/*** 客户实体类* @author Administrator**/
public class Client {private String name; // 客户姓名private boolean isVip; // 是否是VIP客户public String getName() {return name;}public void setName(String name) {this.name = name;}public boolean isVip() {return isVip;}public void setVip(boolean isVip) {this.isVip = isVip;}public Client(String name, boolean isVip) {this.name = name;this.isVip = isVip;}
}

被代理对象是生产商,Producer,这里定义了一个可以获取货物的方法

package xzit.entity;import xzit.db.DataBase;
import xzit.interfaces.IGoods;
import java.util.List;/*生产商  */
public class Producer implements IGoods {@Overridepublic List<Goods> produerGoodList() {return DataBase.GOODSLIST;}
}

生产商实现了获取货物接口IGoods,当然可以继续在此补充方法

package xzit.interfaces;import xzit.entity.Goods;import java.util.List;//提供产品列表的接口
//代理者和被代理对象都应实现此接口
public interface IGoods {List<Goods> produerGoodList();
}

创建静态代理类(ProducerProxy),包括了代理与被代理对象

package xzit.aop;import xzit.entity.Client;
import xzit.entity.Goods;
import xzit.entity.Producer;
import xzit.interfaces.IGoods;import java.util.List;public class ProducerProxy implements IGoods {private Producer producer;// 被代理对象private Client client;// 购买对象public void setClient(Client client) {this.client = client;}public void setProducer(Producer producer) {this.producer = producer;}@Overridepublic List<Goods> produerGoodList() {//对此进行处理boolean bool = this.validateVip();//判断客户是否是vip用户if(bool){//如果是vip用户,进行处理List<Goods> goodsList = producer.produerGoodList();for(Goods g:goodsList){g.setPrice(g.getPrice()*0.85);// 打八五折扣}return goodsList;}return producer.produerGoodList();}private boolean validateVip(){if(client.isVip()){return true;}return false;}
}

最后main方法测试一下

package xzit.proxy;import xzit.aop.ProducerProxy;
import xzit.entity.Client;
import xzit.entity.Goods;
import xzit.entity.Producer;import java.util.List;public class TestStaticProxy {public static void main(String[] args) {/*定义两个客户*/Client c1 = new Client("liang",true);Client c2 = new Client("chen",false);ProducerProxy proxy = new ProducerProxy();proxy.setClient(c1);proxy.setProducer(new Producer());// 设置代理者List<Goods> goodsList = proxy.produerGoodList();for(Goods g:goodsList){System.out.println(g.getName()+","+g.getPrice());}}
}

静态代理结果:

动态代理
动态代理需要用到InvocationHandler

InvocationHandler是java.lang.reflect反射包下的实现动态代理的规范接口,通常自定义实现的动态代理类必需实现此接口

并且要重写InvocationHander中的invoke方法

Object invoke(Object obj,Method method,Object[] args)
参数obj是动态代理实现的实例;
参数method是目标被代理对象的业务手法;
参数args是传递给目标方法的所有参数;
Object是目标方法的返回值,如果没有返回值则返回null对象

好,进入代码
先写有关Department和Employee的类

package xzit.interfaces;
import xzit.db.DataBase;
import java.util.List;
public class DepartmentDaoImp<T> implements IObject<T>{@Overridepublic List<T> findList() {System.out.println("获取部门列表");return (List<T>) DataBase.DEPLIST;}
}
package xzit.interfaces;
import xzit.db.DataBase;
import java.util.List;
public class EmployeeDaoImp<T> implements IObject<T>{@Overridepublic List<T> findList() {System.out.println("获取员工列表");return (List<T>) DataBase.EMPLIST;}
}

实现了IObject接口,这个接口中方法的功能用于返回List的信息

package xzit.interfaces;
import java.util.List;
public interface IObject<T> {List<T> findList();// 查找目标数据列表
}

动态代理类

package xzit.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class DynInvoke implements InvocationHandler {private Object target;// 被代理的对象public void setTarget(Object target) {this.target = target;}@Override/*重写实现InvocationHandler中的invoke方法*/public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {System.out.println("动态代理方法");Object obj = arg1.invoke(target,arg2);return obj;}
}

动态代理测试类main

package xzit.proxy;import xzit.aop.DynInvoke;
import xzit.entity.Department;
import xzit.interfaces.DepartmentDaoImp;
import xzit.interfaces.IObject;import java.lang.reflect.Proxy;
import java.util.List;public class TestDynProxy {public static void main(String[] args) {/*测试动态代理类*/DynInvoke dynInvoke = new DynInvoke();DepartmentDaoImp<Department> depDao = new DepartmentDaoImp<Department>();// 创建被代理的目标对象
//        EmployeeDaoImp<Employee> empDao = new EmployeeDaoImp<Employee>(); //可以创建employ的dynInvoke.setTarget(depDao);Class[] arg1 = depDao.getClass().getInterfaces();// 获取所有被代理对象的父接口数组IObject iObject = (IObject)Proxy.newProxyInstance(depDao.getClass().getClassLoader(),arg1,dynInvoke);//获取代理类实例List<Department> depList =  iObject.findList();// 调用方法}
}


这里测试的是获取部门的列表,也可以获取员工Employee列表(如注释)

总结

代理学完了,整个过程就是一脸懵,还需要多加磨练啊。
从2021.7.5日到2021.8.15,java se告一段落,这一个月加十天,每天只睡六个小时,这在以前那个嗜睡狂魔的我是没法想象的,然而还是很自然的坚持了下来,在上班的时候感觉一坐下就能睡着(所以拧螺丝的时候都不敢坐)。
但不管怎么说,第一阶段完成了,个人还算满意,下个阶段是学习数据库了,希望能保持这种良好的学习动力。
——2021.8.15

java | (十六)XML、代理相关推荐

  1. (转)JAVA 十六个常用工具类

    (转)JAVA 十六个常用工具类 一. org.apache.commons.io.IOUtils closeQuietly 关闭一个IO流.socket.或者selector且不抛出异常.通常放在f ...

  2. Java十六:Scanner,配合hasNext()/hasNextInt()/hasNextFloat()....实现人机互动

    Scanner:配合hasNext()/hasNextInt()/hasNextFloat()-实现人机互动 package com.kuangstudy.ProcessControl;import ...

  3. 教妹学Java(十九):continue 关键字详解

    你好呀,我是沉默王二,是<Web 全栈开发进阶之路>的作者,CSDN 2019 年度的博客之星.<教妹学 Java>是一套非常有趣的付费专栏,除了继续保持幽默风趣的行风风格,我 ...

  4. Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十六(商品排序,Thymeleaf快速入门,商品详情页的展示)

    Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十六(商品详情页的展示) 一.商品排序 1.完善页面信息 这是用来做排序的,默认按照综合排序 ...

  5. 第三十六期:学 Java 网络爬虫,需要哪些基础知识?

    说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...

  6. java监听数据库操作_第十六篇——JDBC操作数据库之监听器

    JavaWeb应用中,很多的地方都和session有关.因此session相关的事件监听器,在日常工作中非常有用. 有时候我们需要统计当前在线的人数和访问人数总数,此时就可以使用监听器技术来很简单的实 ...

  7. Java学习系列(十六)Java面向对象之基于TCP协议的网络通信

    TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...

  8. 达拉草201771010105《面向对象程序设计(java)》第十六周学习总结

    达拉草201771010105<面向对象程序设计(java)>第十六周学习总结 第一部分:理论知识 1.程序与进程的概念: (1)程序是一段静态的代码,它是应用程序执行的蓝 本. (2)进 ...

  9. 四十六、深入Java的网络编程(下篇)

    @Author:Runsen @Date:2020/6/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  10. 三十六、Java集合中的HashMap

    @Author:Runsen @Date:2020/6/3 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

最新文章

  1. PC端微信小程序wxapkg解密
  2. Jasperreport导出pdf内容展示不完全处理
  3. linux使用grep获取两个文件相同的行或不同的行
  4. easy-mock本地部署成功,访问报错:EADDRNOTAVAIL 0.0.0.0:7300 解决方案
  5. vs2008 试用版评估期结束的解决方法(2009-08-
  6. post提交的数据几种编码格式
  7. SaaS服务创投:场景多元化 平台建设稳中有序
  8. 2019/2/12 Python今日收获
  9. Error loading native library: libnjni9.so.的解决办法
  10. 我想说:工作没那么难找吧
  11. java线程等待按钮点击_java如何用多线程使线程在sleep时等待按钮按下?
  12. Java 编解码问题
  13. LeetCode之Find Eventual Safe States(Kotlin)
  14. linux 7 %3e命令,Linux操作系统常用基础命令
  15. 只开窗不镀锡_开窗也有大学问,只有老司机才懂这些车窗使用技巧
  16. redchat怎么编写shell脚本_Linux如何编写shell脚本?
  17. 前后端分离的思考与实践(四)
  18. Win10自带播放器怎么倍速播放视频
  19. 外卖产品(饿了么、美团外卖、百度外卖)竞品分析
  20. php怎么替换斜杠,PHP 反斜杠如何替换掉?

热门文章

  1. Windows系统 修改 dns
  2. 微信8.0.3:做重了群公告,再也不能@所有人了!
  3. vsftpd 虚拟用户
  4. 在线apt-get安装mysql_apt-get安装mysql
  5. JSR规范系列(1)——Java版本、JSR规范和JCP社区流程概述
  6. 关于获取安卓手机MAC地址的问题
  7. hhkb mac设置_HHKB MAC 配置指南 操作指南 快捷键
  8. 1.10 新概念 have a cold/headache
  9. python爬虫学习(循环爬取网页链接)
  10. Windows平台上使用Qt(MinGW)调用基于VS编写的周立功CAN卡Dll文件