1.1 上次课内容回顾:

JDBC        :
* JDBC的概述:
    * JDBC:Java Database Connectivity
* JDBC的API:
    * Connection:连接.
        * 获得连接.
        * 执行事务的管理.
    * Statement:
        * 执行SQL语句.
            * int executeUpdate(String sql);
            * ResultSet executeQuery(String sql);
            * boolean execute(String sql);
    * ResultSet:
        * getXXX(int idx),getXXX(String name);
* JDBC完成CRUD的操作:
连接池:
* 自定义连接池:(了解)
    * 增强一个类中的某个方法有几种方式:
        * 继承:
            * 控制控制这个类的构造.
       * 装饰者模式:
            * 增强的类和被增强类实现相同的接口.
            * 在增强类中获得被增强的类引用.
                * 接口中方法过多,增强其中一个方法,其他方法都要重写.
        * 动态代理:
            * 被增强的类实现了接口即可.
                * 编写代码的时候麻烦.
* DBCP:
* C3P0:
DbUtils:工具类:
* 使用DBUtils完成CRUD的操作

1.2 案例一:使用XML作为配置文件的方式完成模拟Tomcat.1.2.1 需求: 现在有一套页面,这套页面想被其他人访问到.端口号可以进行修改的-(不修改源码的基础上). 1.2.2 分析:1.2.2.1 技术分析: 【Java基础的网络编程】 【XML的概述】 Ø 什么是XML:

**** 允许用户自定义标签的!!!
Ø XML的作用:
* 传输 和 存取数据.
* 软件的配置文件.
Ø XML的使用:
* XML的语法.
【XML的语法】
Ø XML的基本语法:
* XML必须有关闭标签
* 区分大小写
* 属性需要有引号
* 标签必须正确嵌套.
Ø XML的文档声明
* 文档声明:通常出现在XML的第一行第一列的位置!!!
* 写法:
    * <?xml 属性名=”属性值” 属性名=”属性值” ...?>
        * version        :必须的. 使用”1.0”
        * encoding        :字符集. 是使用浏览器打开的时候采用的默认的字符集的编码.
        * standalone        :描述XML文档是否需要依赖其他的文件.
Ø XML的注释
* <!-- XML的注释 -->
Ø XML的元素
  • 元素(标签)的命名规范: ***** 名称中不能包含冒号(:) Ø XML的属性

  • 属性的名称规范与元素一致. ***** 属性需要使用引号! Ø XML的特殊字符和CDATA区

  • XML的特殊字符:

  • XML的CDATA区:(CDATA:Character Data)

  • <![CDATA[ 内容 ]]> 【XML的解析】 Ø XML的解析:从XML文档中获得想要的数据(通过代码完成的.) Ø XML的解析的方式(*****):

  • DOM解析:DOM:Document Object Model.

  • SAX解析:Simple Api for XML.

  • DOM和SAX的区别: Ø 针对这两种解析的方式,不同的公司提供了不同的API的实现.

  • JAXP :SUN公司提供的一套XML的解析的API.

  • JDOM :开源组织提供了一套XML的解析的API-jdom.

  • DOM4J :开源组织提供了一套XML的解析的API-dom4j.

  • pull :主要应用在Android手机端解析XML. Ø DOM4J的入门案例步骤:

  • 【步骤一】导入jar包.dom4j-1.6.1.jar

  • 【步骤二】创建解析器

  • 【步骤三】解析文档获得代表文档的Document对象.

  • 【步骤四】获得跟节点.

  • 【步骤五】从跟节点下查找其他的节点.

  • 代码实现: @Test /** * 获得元素的内容:查询的操作. */ public void demo1() throws Exception{ // 创建解析器 SAXReader reader = new SAXReader(); // 解析XML的文档 Document document = reader.read("xml/demo1.xml"); // 获得跟节点 Element root = document.getRootElement(); System.out.println(root.getName()); // 查找跟节点下的子节点. element() elements(); Element pElement = root.element("person"); // 查找的是第一个person元素 // root.elements("person").get(1); // 查找的是第二个person元素 Element nElement = pElement.element("name"); Element aElement = pElement.element("age"); Element sElement = pElement.element("sex"); System.out.println(nElement.getText()); System.out.println(aElement.getText()); System.out.println(sElement.getText()); } Ø XPath:

  • dom4j支持XPath的jar包.

    • jaxen-1.1-beta-6.jar
  • dom4j的XPath支持的API:

    • List document.selectNodes(String xPath);
    • Node document.selectSingleNode(String xPath);
  • 代码: @Test /** * DOM4J的XPath的写法: */ public void demo2() throws Exception{ // 创建解析器: SAXReader reader = new SAXReader(); // 解析XML返回Document对象. Document document = reader.read("xml/demo1.xml"); /List<Node> list = document.selectNodes("//name"); for (Node node : list) { Element element = (Element) node; System.out.println(element.getText()); }/

              List<Node> list = document.selectNodes("//person['@id']");
              for (Node node : list) {
                      Element element = (Element) node;
                      System.out.println(element.attributeValue("id"));
              }
      }
    

1.2.3 代码实现: 【步骤一】:将基础班的Socket编写的代码复制到工程中. 【步骤二】:新建xml.在conf/server.xml 【步骤三】:使用DOM4J解析XML public class MyServer {

    public static void main(String[] args) throws Exception {
            // 解析XML:
            // 创建解析器
            SAXReader reader = new SAXReader();
            // 解析XML文档:
            Document document = reader.read("conf/server.xml");
            Element element = (Element)document.selectSingleNode("//Connector['@port']");
            String port = element.attributeValue("port");
            // ServerSocket 对象可以监听端口
            ServerSocket serversocket = new ServerSocket(Integer.parseInt(port));
            while(true) {
                    Socket socket = serversocket.accept();        // 等待客户端的连接请求,一旦有请求过来,就结束阻塞,返回客户端对象
                    //System.out.println(socket.getInetAddress());
                    // 一旦有客户来访问, 就另开一个新线程去提供服务, main线程继续等待下一个客户的连接
                    new Thread(new MyService(socket)).start();
            }
    }

} 1.2.4 总结:1.2.4.1 XML的约束: Ø XML的约束的额概述:

  • 什么是XML的约束 :就是用来约束XML的文档中可以出现哪些标签,不能出现哪些标签,标签中是否有顺序,出现的次数.

  • XML的约束 :用来规范XML的写法. ***** XML的约束的种类及区别?

    • DTD 和 Schema :
      • 区别: 1.DTD语法是自成一体的.Schema语法就是XML的语法. 2.Schema的语法就是XML的语法所以更容易被解析器所解析. 3.Schema支持名称空间. 4.Schema有比DTD更加强大的语义和语法的约束. Ø DTD的语法 :(了解)
  • DTD的引入方式:

    • 内部的DTD: <!DOCTYPE persons [

    ]>

    • 外部的DTD:
      • 一种本地DTD: <!DOCTYPE persons SYSTEM "unknown.dtd">
      • 一种网络DTD: <!DOCTYPE persons PUBLIC "//UNKNOWN/" "unknown.dtd">
  • DTD的语法:

    • 元素:
      • <!ELEMENT 元素名 元素类型>
        • 元素类型:
          • EMPTY
          • ANY
          • 子元素
            • 是否有序: 使用 逗号(,)或者竖线(|)表示.
            • 出现的次数:?:零次或一次 +:一次或多次 *:零次或多次
          • PCDATA
    • 属性:
      • <!ATTLIST 元素名称 属性名称 属性的类型 属性的约束>

        • 属性的类型:
          • ID类型:表示属性值需要是唯一的.
          • CDATA类型:普通的字符串.
          • 枚举:
        • 属性的约束:
          Ø Schema的语法:(了解) <?xml version="1.0" encoding="UTF-8"?> <!-- 名称空间:一个XML只能引入一个DTD约束文档.使用了Schema约束XML文档,一个XML可以引入多个Schame的约束!!! 如果再多个Schema文档中定义了相同的属性名称 该怎么办?
      • 名称空间类似于java中的package.通过名称空间区分 标签或属性来自于哪个文档的!!!通常名称空间唯一的不重复的即可.一般情况下使用一个URL地址表示一个名称空间.

        xmlns :xml name sapace .代表当前的文档应用的名称空间. targetNameSpace :目标名称空间. elementFormDefault : --> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itheima.com/ee25" elementFormDefault="qualified"> <!-- 复杂标签 --> <element name="persons"> <!-- 复杂类型 --> <complexType> <sequence maxOccurs="unbounded" minOccurs="1"> <element name="person"> <complexType> <sequence> <!-- 简单标签 --> <element name="name" type="string"></element> <element name="age" type="int"></element> <element name="sex" type="string"></element> </sequence> <attribute name="id" type="string" use="required"/> </complexType> </element> </sequence> </complexType> </element> </schema>