Java XML
什么是 XML解析?
解析XML是指将通过XML文档访问数据或修改数据的一个操作或方法。
Java库中提供了两种XML解析器:
像文档对象模型(Document Object Model,DOM)解析器这的树型解析器(tree parse),它们将读入的XML文档转换成树结构。
像XML简单API(Simple API for XML,SAX)解析器这样的流机制解析器(streaming parser),它们在读入XML文档时生成相应的事件。
什么是 XML 解析器?
XML解析器提供方法来访问或修改 XML 文档中的数据。 Java 提供了多种解析 XML 文档的选项。 以下是通常用于解析 XML 文档的各种类型的解析器。
Dom 解析器 − 通过加载文档的完整内容并在内存中创建其完整的层次树来解析 XML 文档。
SAX 解析器 − 在基于事件的触发器上解析 XML 文档。 不将完整的文档加载到内存中。
JDOM 解析器 − 解析 XML 文档的方式与 DOM 解析器类似,但方式更简单。
StAX 解析器 − 以与 SAX 解析器类似的方式解析 XML 文档,但以更有效的方式。
XPath 解析器 − 基于表达式解析 XML 文档,并广泛与 XSLT 结合使用。
DOM4J 解析器 − 一个使用 Java Collections Framework 解析 XML、XPath 和 XSLT 的 java 库。 它提供对 DOM、SAX 和 JAXP 的支持。
Java DOM4J 解析器
DOM4J 是一个开源的、基于 Java 的库,用于解析 XML 文档。 它是一个高度灵活且内存高效的 API。 它是 Java 的优化,并使用 Java 集合,如 List 和 Arrays。
DOM4J 适用于 DOM、SAX、XPath 和 XSLT。 它解析大型 XML 文档时具有非常低内存占用。
环境设置:为了使用 DOM4J 解析器,应该包含 dom4j-1.6.1.jar 和 jaxen.jar在应用程序的类路径中。 下载 dom4j-1.6.1.zip。
什么情况下使用?
应该在以下情况下使用 DOM4J 解析器 −
需要知道很多关于 XML 文档的结构
需要移动 XML 文档的各个部分(例如,可能想要对某些元素进行排序)。
需要多次使用 XML 文档中的信息。
是一名 Java 开发人员,希望利用 Java 优化的 XML 解析。
会得到什么?
当使用 DOM4J 解析器解析 XML 文档时,可以灵活地获取包含文档所有元素的树结构,而不会影响应用程序的内存占用。DOM4J 提供了多种实用功能,您可以使用这些功能检查 XML 文档的内容和结构,以防文档结构良好且结构已知。DOM4J 使用 XPath 表达式在 XML 文档中导航。
优势
DOM4J 为 Java 开发人员提供了 XML 解析代码的灵活性和易维护性。 它是一个轻量级的且快速的 API。
Document表示整个XML文档。文档Document对象是通常被称为DOM树。
Element表示一个XML元素。 Element对象有方法来操作其子元素,它的文本,属性和名称空间。
Attribute表示元素的属性。属性有方法来获取和设置属性的值。它有父节点和属性类型。
Node代表元素,属性或处理指令
SAXReader.read(xmlSource)()构建XML源的DOM4J文档。
Document.getRootElement()得到的XML的根元素。
Element.node(index)获得在元素特定索引XML节点。
Element.attributes()获取一个元素的所有属性。
Node.valueOf(@Name)得到元件的给定名称的属性的值。
使用dom4j解析xml的大致步骤
1.创建SAXReader
2.使用SAXReader读取xml文档并且生成Document对象。
这一步也是dom解析耗资源的地方,因为首先要先将文档所有数据读取完毕,并且以一个Document对象的形式保存在内存当中
3.通过Document对象获取根元素
4.按照xml文档的结构从根元素开始逐级遍历xml文档数据的目的
Document提供了获取根元素的方法:Element getRootElement()
而element的每一个实例用于表示当前xml文件的一个元素(一对标签),它提供了获取其元素相关的方法:
获取当前标签的名字:String getName()
获取当前标签中间的文本:String getText()
获取当前标签下指定名字的子标签:Element element(String name)
获取当前标签下的所有子标签:List elements()
获取当前标签下指定名字的子标签:List elements(String name)
获取当前标签下指定名字标签的属性:Attribute attribute(String name)
Attribute的每一个实例表示一个属性,它有两个方法:
获取属性名:String getName()
获取属性值:String getValue()
生成xml文件的大致步骤为:
1.创建一个Document对象,表示一个空白文档
2.向Document中添加根元素
3.按照xml文档结构从根标签开始逐级添加子标签以及对应的数据
4.创建XmlWrite
5.使用XmlWrite写出Document,生成文档
Document提供了添加根元素的方法:
Element addElement(String name)
添加后会根据标签以一个Element实例返回,以便于我们对其继续操作,
注意:这个方法只能调用一次
Element也提供了添加相关信息的方法:
Element addElement(String name),向当前标签中添加给定标签名的子标签
Element addText(String text),向当前标签中添加指定的文本,返回的还是当前标签(这样做的好处是 ,可以继续添加其他内容)
WEB-SERVER
1、创建core.WebServer类,负责接收请求,生成socket对象
2、自定义异常exception.InitServerSocketException类,表示serverSocket初始化失败异常
3、定义日志信息类base.Log,负责打印日志信息
4、创建ClientHandler类,读取请求的相关数据
5、创建http.HttpServletRequest类,用途:封装请求数据,便于后期操作
该类包含主要功能:解析请求头、解析请求行、解析请求数据、获取请求行数据
工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
介绍
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在其子类执行。
注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
设计模式的六大原则
- 开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类
- 里氏代换原则(Liskov Substitution Principle)
里氏代换原则(Liskox Substitution Principle LSP)面向对象设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP 是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科4
- 依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。
- 迪米特法则(最少知道原则)(Demeter Principle)
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6.合成复用原则(Composite Reuse Principle)
尽量使用合成/聚合,而不是使用继承。
工厂方法模式
1.普通工厂模式
就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
2.多工厂模式
是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
3.静态工厂方法模式,
将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。