java进阶教程:2023.3.22第二十四天,Java进阶XML、解析、设计模式[java教程]

前言

记录时间:2023.3.22

已坚持的第二十四天

java从入门到精通

学习java时间历程记录打卡

早上7:00到 12:00

下午2:00到 6: 00

java基础入门总结

历时二十四天不间断学习,没想到自己能坚持这么久,java基础的入门课程总算学完了,在这里感谢黑马程序员的徐磊老师讲的课程,思路讲的很细节很清晰,刨根问底讲底层原理,易学易懂,跟着边学边敲有很大的感触,还是那句话兴趣是最好的老师,接下来的路还长,这只是java入门的冰山一角,准备进入下一阶段javaweb,祝自己迎难而上,前程似锦,一路生花

下面是是java入门基础课程的全部总结目录

1.JavaSE入门基础

1.Java概述、IDEA、Java基础语法
2.数据类型、运算符、API介绍、键盘录入
3.程序流程控制、Random类
4.数组、Debug
5.方法
6.编程思维和编程能力、综合应用专题课
7.面向对象基础
8.常用API(String、ArrayList)
9.ATM系统案例开发
10.阶段总结、下阶段课程介绍(必看)

2.JavaSE基础加强课程

1.static、单例、代码块、继承
2.面向对象进阶(包、权限修饰符、final、常量、枚举、抽象类、接口)
3.面向对象进阶(多态、内部类、常用API)
4.常用API(常用API、正则表达式、Lambda、算法)
5.day05、集合(Collection、数据结构、List、泛型深入
6.集合(Set、Collections、Map、集合嵌套)
7.不可变集合、Stream、异常
8.日志框架、阶段项目
9.File、递归、IO流(一)
10.IO流二
11.多线程
12.网络编程
13.Java高级技术:单元测试、反射、注解
14.XML、解析、设计模式等

完成代码练习

xmldata

1.认识xml数据文件

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释:根标签有且仅能有一个 -->
<student>
    <name>女儿国王</name>
    <sex>女</sex>
    <hobby>唐僧,追唐僧</hobby>
    <info>
        <age>30</age>
        <addr>女儿国</addr>
    </info>
    <sql>
        select * from user where age &lt; 18;
        select * from user where age &lt; 18 &amp;&amp; age > 10
        <![CDATA[
                select * from user where age < 18
        ]]>
    </sql>
</student>

2.认识自定义xml的dtd约束

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM "data.dtd">
<书架>
    <书>
        <书名>精通JavaSE加强</书名>
        <作者>dlei</作者>
        <售价>很贵</售价>
    </书>
    <书>
        <书名></书名>
        <作者></作者>
        <售价></售价>
    </书>
    <书>
        <书名></书名>
        <作者></作者>
        <售价></售价>
    </书>
</书架>
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

2.认识自定义xml的xsd约束

<?xml version="1.0" encoding="UTF-8" ?>
<书架 xmlns="http://www.vqqc.cn"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.vqqc.cn data.xsd">
    <!-- xmlns="http://www.vqqc.cn"  基本位置
         xsi:schemaLocation="http://www.vqqc.cn books02.xsd" 具体的位置 -->
    <书>
        <书名>神雕侠侣</书名>
        <作者>金庸</作者>
        <售价>399.9</售价>
    </书>
    <书>
        <书名>神雕侠侣</书名>
        <作者>金庸</作者>
        <售价>19.5</售价>
    </书>

</书架>
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.vqqc.cn"
        elementFormDefault="qualified" >
    <!-- targetNamespace:申明约束文档的地址(命名空间)-->
    <element name='书架'>
        <!-- 写子元素 -->
        <complexType>
            <!-- maxOccurs='unbounded': 书架下的子元素可以有任意多个!-->
            <sequence maxOccurs='unbounded'>
                <element name='书'>
                    <!-- 写子元素 -->
                    <complexType>
                        <sequence>
                            <element name='书名' type='string'/>
                            <element name='作者' type='string'/>
                            <element name='售价' type='double'/>
                        </sequence>
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>
</schema>

d1_dom4j

1.导入xml数据文件

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book id="0001" desc="我是第一本书">
        <name>     JavaWeb开发教程</name>
        <author> 张孝祥    </author>
        <sale>100.00元</sale>
    </book>
    <book id="0002">
        <name>三国演义</name>
        <author>罗贯中</author>
        <sale>100.00元</sale>
    </book>
    <sql>
        select * from user where age >= 18
    </sql>
</books>
<?xml version="1.0" encoding="UTF-8"?>
<contactList>
    <contact id="1" vip="true">
        <name>   潘金莲  </name>
        <gender>女</gender>
        <email>panpan@itcast.cn</email>
    </contact>
    <contact id="2" vip="false">
        <name>武松</name>
        <gender>男</gender>
        <email>wusong@itcast.cn</email>
    </contact>
    <contact id="3" vip="false">
        <name>武大狼</name>
        <gender>男</gender>
        <email>88888@email.com</email>
    </contact>
    <user>
    </user>
</contactList>
<?xml version="1.0" encoding="UTF-8"?>
<contactList>
    <contact id="1" vip="true">
        <name>   潘金莲  </name>
        <gender>女</gender>
        <email>panpan@itcast.cn</email>
    </contact>
    <contact id="2" vip="false">
        <name>武松</name>
        <gender>男</gender>
        <email>wusong@itcast.cn</email>
    </contact>
    <contact id="3" vip="false">
        <name>武大郎</name>
        <gender>男</gender>
        <email>88888@email.com</email>
    </contact>
    <user>
        <contact>
            <info>
                <name id="888">我是西门庆</name>
            </info>
         </contact>
    </user>
</contactList>

d2_xpath

1.XPath检索XML中的信息

package cn.vqqc.d2_xpath;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.util.List;

/**
 目标:XPath检索XML中的信息啊。(了解)

 引入:
 Dom4J可以用于解析整个XML的数据。
 但是如果要检索XML中的某些信息,建议使用XPath.(Xpath依赖Dom4j技术)
 Dom4J用于解析数据,Xpath用于检索数据。
 XPath使用步骤:
 1.导入dom4j框架。(XPath依赖于Dom4j技术,必须先导入dom4j框架!)
 2.导入XPath独有的框架包。jaxen-1.1.2.jar
 XPath常用API:
 List<Node> selectNodes(String var1):检索出一批节点集合。
 Node selectSingleNode(String var1):检索出一个节点返回。
 XPath提供的四种检索数据的写法:
 1.绝对路径。
 2.相对路径。
 3.全文搜索。
 4.属性查找。
 小结:
 1.绝对路径: /根元素/子元素/子元素。
 2.相对路径: ./子元素/子元素。 (.代表了当前元素)
 3.全文搜索:
 //元素  在全文找这个元素
 //元素1/元素2  在全文找元素1下面的一级元素2
 //元素1//元素2  在全文找元素1下面的全部元素2
 4.属性查找。
 //@属性名称  在全文检索属性对象。
 //元素[@属性名称]  在全文检索包含该属性的元素对象。
 //元素[@属性名称=值]  在全文检索包含该属性的元素且属性值为该值的元素对象。
 */
public class XPathDemo {
    /**
     1.绝对路径: /根元素/子元素/子元素。
     */
    @Test
    public void parse01() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        // c、检索全部的名称
        List<Node> nameNodes = document.selectNodes("/contactList/contact/name");
        for (Node nameNode : nameNodes) {
            Element  nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }

    /**
     2.相对路径: ./子元素/子元素。 (.代表了当前元素)
     */
    @Test
    public void parse02() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        Element root = document.getRootElement();
        // c、检索全部的名称
        List<Node> nameNodes = root.selectNodes("./contact/name");
        for (Node nameNode : nameNodes) {
            Element  nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }

    /**
     3.全文搜索:
     //元素  在全文找这个元素
     //元素1/元素2  在全文找元素1下面的一级元素2
     //元素1//元素2  在全文找元素1下面的全部元素2
     */
    @Test
    public void parse03() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        // c、检索数据
        //List<Node> nameNodes = document.selectNodes("//name");
        // List<Node> nameNodes = document.selectNodes("//contact/name");
        List<Node> nameNodes = document.selectNodes("//contact//name");
        for (Node nameNode : nameNodes) {
            Element  nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }

    /**
     4.属性查找。
     //@属性名称  在全文检索属性对象。
     //元素[@属性名称]  在全文检索包含该属性的元素对象。
     //元素[@属性名称=值]  在全文检索包含该属性的元素且属性值为该值的元素对象。
     */
    @Test
    public void parse04() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        // c、检索数据
        List<Node> nodes = document.selectNodes("//@id");
        for (Node node : nodes) {
            Attribute attr = (Attribute) node;
            System.out.println(attr.getName() + "===>" + attr.getValue());
        }

        // 查询name元素(包含id属性的)
//      Node node = document.selectSingleNode("//name[@id]");
        Node node = document.selectSingleNode("//name[@id=888]");
        Element ele = (Element) node;
        System.out.println(ele.getTextTrim());
    }
}

d3_factory_pattern

1.定义类

package cn.vqqc.d3_factory_pattern;

public abstract class Computer {
    private String name;
    private double price;

    public abstract void start();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

2.继承类

package cn.vqqc.d3_factory_pattern;

public class Huawei extends Computer{
    @Override
    public void start() {
        System.out.println(getName() + "开机了,展示了华为的花图标~~~~");
    }
}

3.继承类

package cn.vqqc.d3_factory_pattern;

public class Mac extends Computer{
    @Override
    public void start() {
        System.out.println(getName() + "以非常优雅的方法启动了,展示了一个苹果logo");
    }
}

4.定义方法返回

package cn.vqqc.d3_factory_pattern;

public class FactoryPattern {
    /**
     定义一个方法,创建对象返回
     */
    public static Computer createComputer(String info){
        switch (info){
            case "huawei":
                Computer c = new Huawei();
                c.setName("huawei pro");
                c.setPrice(5999);
                return c;
            case "mac":
                Computer c2 = new Mac();
                c2.setName("MacBook pro");
                c2.setPrice(11999);
                return c2;
            default:
                return null;
        }
    }
}

5.工厂模式

package cn.vqqc.d3_factory_pattern;

/**
 目标:工厂模式

 什么是工厂设计模式?
 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。
 这种类型的设计模式属于创建型模式,它提供了一种创建对象的方式。
 之前我们创建类对象时, 都是使用new 对象的形式创建, 除new 对象方式以外,
 工厂模式也可以创建对象。

 工厂设计模式的作用:
 1.对象通过工厂的方法创建返回,工厂的方法可以为该对象进行加工和数据注入。
 2.可以实现类与类之间的解耦操作(核心思想,重点)

 小结:
 工厂模式的思想是提供一个工厂方法返回对象!
 */
public class FactoryDemo {
    public static void main(String[] args) {
        Computer c1 = FactoryPattern.createComputer("huawei");
        c1.start();

        Computer c2 = FactoryPattern.createComputer("mac");
        c2.start();
    }
}

d4_decorator_pattern

1. 装饰类:继承InputStream

package cn.vqqc.d4_decorator_pattern;


/**
 装饰类:继承InputStream 拓展原始类的功能
 */
public class BufferedInputStream extends InputStream{
    private InputStream is;
    public BufferedInputStream(InputStream is){
        this.is = is;
    }
    @Override
    public int read() {
        System.out.println("提供8KB的缓冲区,提高读数据性能~~~~");
        return is.read();
    }

    @Override
    public int read(byte[] buffer) {
        System.out.println("提供8KB的缓冲区,提高读数据性能~~~~");
        return is.read(buffer);
    }
}

2.装饰模式

package cn.vqqc.d4_decorator_pattern;

/**
 装饰模式

 定义父类:InputStream
 定义实现类:FileInputStream 继续父类 定义功能
 定义装饰实现类:BufferedInputStream 继承父类 定义功能 包装原始类,增强功能。
 */
public class DecoratorPattern {
    public static void main(String[] args) {
        InputStream is = new BufferedInputStream(new FileInputStream());
        System.out.println(is.read());
        System.out.println(is.read(new byte[3]));
    }
}

3.原始类

package cn.vqqc.d4_decorator_pattern;

import java.util.Arrays;

/**
 原始类
 */
public class FileInputStream extends InputStream{
    @Override
    public int read() {
        System.out.println("低性能的方式读取了一个字节a");
        return 97;
    }

    @Override
    public int read(byte[] buffer) {
        buffer[0] = 97;
        buffer[1] = 98;
        buffer[2] = 99;
        System.out.println("低性能的方式读取了一个字节数组:" + Arrays.toString(buffer));
        return 3;
    }
}

4.共同父类

package cn.vqqc.d4_decorator_pattern;

/**
 共同父类
 */
public abstract class InputStream {
    public abstract int read();
    public abstract int read(byte[] buffer);
}

视频总结

1.今日课程安排、XML、XML创建

https://www.bilibili.com/video/BV1Cv411372m?p=194

2.XML的文档约束

https://www.bilibili.com/video/BV1Cv411372m?p=195

3.XML文件的解析技术:Dom4J

https://www.bilibili.com/video/BV1Cv411372m?p=196

4.XML解析的案例

https://www.bilibili.com/video/BV1Cv411372m?p=197

5.XML文件的数据检索技术:XPath

https://www.bilibili.com/video/BV1Cv411372m?p=198

6.补充知识:工厂模式、装饰模式

https://www.bilibili.com/video/BV1Cv411372m?p=199

7.结课语:下阶段学习内容说明

https://www.bilibili.com/video/BV1Cv411372m?p=200

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容