JavaEEXML整理

第一章           XML

 

浏览器的入口不同(访问路径),访问的资源也不同。

 

 

 

 

 

1.1XML语法

1.文档声明必须为<?xml开头,以?>结束;

2.文档声明必须从文档的0行0列位置开始:

3.文档声明只有属性:

a)      versioin:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;

b)      encoding:指定当前文档的编码。可选属性,默认值是。utf-8:

元素element

 

1.元素是XML文档中最重要的组成部分,

2.普通元素的结构开始标签、元素体、结束标签组成。例如:<hello>大家好</hello>

3.元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a ></b>

4.空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭介,例如:<c/>

5.元素命名:

a)      区分大小写

b)      不能使用空格,不能使用冒号:

c)      不建议以XML,  xml,  Xml开头

  转义字符

XML中的转义字符与HTML一样。

因为很多符号己经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符,例如:"<"、”>”、” ’ ”、” ” ”、”&”。

 

1.2什么是DTD

DTD (Document Type Definition ),文档类型定义,用来约束XML文档。规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等。

案例实现

l  步骤1:创建web.xml文档,并将“web-app_ 2_ 3.dtd"拷贝相同目录下。

 

l  步骤2:从DTD文档开始处,拷贝需要的“文档声明”

 

l  步骤3:完成xml内容编写

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

<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">

<web-app version="2.3"

<servlet>

       <servlet-name></servlet-name>

       <servlet-class></servlet-class>

    </servlet>

    <servlet-mapping>

       <servlet-name></servlet-name>

       <url-pattern></url-pattern>

    </servlet-mapping>

    <welcome-file-list>

       <welcome-file></welcome-file>

       <welcome-file></welcome-file>

    </welcome-file-list>

</web-app>

1.2.1文档声明
  1. 内部DTD,在XML文档内部嵌入DTD,只对当前XML有效。

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

<!DOCTYPE web-app [

    ...//具体语法

]>

<web-app>

</web-app>

2.外部DTD——本地DTD,DTD文档在本地系统上,公司内部自己项目使用。

 

3.外部DTD——公共DTD,DTD文档在网络上,一般都有框架提供。

 

1.2.2元素声明

定义元素语法:<!ELEMENT元素名 元素描述>

    元素名:自定义

    元素描述包括 : 符号和数据类型

          常见符号: ?  *  +  ()  |  ,

          常见类型:#PCDATA表示内容是文本,不能是子标签

符号

符号类型

描述

示例

?

问号

表示该对象可以出现,但只能出现一次

(菜鸟?)

*

星号

表示该对象允许出现任意多次,也可以是零次

(爱好*)

+

加号

表示该对象最少出现一次,可以出现多次

(成员+)

()

括号

用来给元素分组

(古龙|金庸|梁羽生),

(王朔|余杰),毛毛

|

竖条

表明在列出的对象中选择一个

(男人|女人)

,

逗号

表示对象必须按指定的顺序出现

(西瓜,苹果,香蕉)

l  实例

<!ELEMENT  web-app(servlet*,servlet-mapping*,welcome-file-list?)>

    web-app包括3个标签,且必须顺序出现。

        servlet子标签个数任意

        servlet-mapping子标签个数任意

        welcome-file-list子标签最多只能出现一次

<!ELEMENT servlet(servlet-name,description?,(servlet-class|jsp-file))>

    servlet有3个子标签,且必须顺序出现

        servlet-name,必须有,且只能出现1次

        description,可选1次

        servlet-class和jsp-file二选一,且只能出现一次

<!ELEMENT servlet-name(#PCDATA)>

    servlet-name的标签体必须是文本

<!ELEMENT  welcome-file-list  (welcome-file+)>

      welcome-file-list至少有1个子标签welcome-file

1.2.2.3.3属性声明

 

1.2.3什么是Schema

l  Schema是新的XML文档约束:

l  Schema要比DTD强大很多,是DTD替代者;

l  Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml .

l  Schema功能更强大,数据类型更完善

l  Schema支持名称空间

与DTD一样,要求可以通过schema约束文档编写xml文档。常见框架使用schema的有:Spring等通过提供”web-app_ 2_ 5.xsd"编写xml文档

 

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

<!--

         模拟servlet2.5规范,如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。

         格式如下:

         <web-app xmlns="http://www.example.org/web-app_2_5"

                            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

                            xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"

                            version="2.5">

-->

<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"

         targetNamespace="http://www.example.org/web-app_2_5"

         xmlns:xsd="http://www.w3.org/2001/XMLSchema"

         xmlns:tns="http://www.example.org/web-app_2_5"

         elementFormDefault="qualified">

        

         <xsd:element name="web-app">

                   <xsd:complexType>

                            <xsd:choice minOccurs="0" maxOccurs="unbounded">

                                     <xsd:element name="servlet">

                                               <xsd:complexType>

                                                        <xsd:sequence>

                                                                 <xsd:element name="servlet-name"></xsd:element>

                                                                 <xsd:element name="servlet-class"></xsd:element>

                                                        </xsd:sequence>

                                               </xsd:complexType>

                                     </xsd:element>

                                     <xsd:element name="servlet-mapping">

                                               <xsd:complexType>

                                                        <xsd:sequence>

                                                                 <xsd:element name="servlet-name"></xsd:element>

                                                                 <xsd:element name="url-pattern" maxOccurs="unbounded"></xsd:element>

                                                        </xsd:sequence>

                                               </xsd:complexType>

                                     </xsd:element>

                                     <xsd:element name="welcome-file-list">

                                               <xsd:complexType>

                                                        <xsd:sequence>

                                                                 <xsd:element name="welcome-file" maxOccurs="unbounded"></xsd:element>

                                                        </xsd:sequence>

                                               </xsd:complexType>

                                     </xsd:element>

                            </xsd:choice>

                            <xsd:attribute name="version" type="double" use="optional"></xsd:attribute>

                   </xsd:complexType>

         </xsd:element>

</xsd:schema>

l  案例文档中同一个“命名空间”分别使用“默认命名空间”和“显示命名空间”进行引入,所以文档中<schema>和<xsd:schema>作用一样。

 

完成xml内容编写

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

<web-app xmlns="http://www.example.org/web-app_2_5"

           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

           xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"

           version="2.5">

    <servlet>

       <servlet-name></servlet-name>

       <servlet-class></servlet-class>

    </servlet>

    <servlet-mapping>

       <servlet-name></servlet-name>

       <url-pattern></url-pattern>

    </servlet-mapping>

    <welcome-file-list>

       <welcome-file></welcome-file>

       <welcome-file></welcome-file>

    </welcome-file-list>

</web-app>

1.2.4 dom4j解析

1.2.4.4 API使用

如果需要使用dom4j,必须导入jar包。

 

dom4j必须使用核心类SaxReader加载xml文档获得Document通过Document对象获得文档的根元素,然后就可以操作了。

步骤:

1.获取解析器

2.获得document文档对象

3.获取根元素

4.获取根元素下的子元素

5.遍历子元素

6.判断元素名称为servlet的元素

7.获取servlet-name元素

8.获取servlet-class元素

import java.util.List;

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

import org.junit.Test;

public class TestDom4j {

         @Test

         public void testReadWebXML() {

                   try {

                            // 1.获取解析器

                            SAXReader saxReader = new SAXReader();

                            // 2.获得document文档对象

                            Document doc = saxReader.read("src/com/oracle/demo06/web.xml");

                            // 3.获取根元素

                            Element rootElement = doc.getRootElement();

                            // System.out.println(rootElement.getName());//获取根元素的名称

                            // System.out.println(rootElement.attributeValue("version"));//获取根元素中的属性值

                            // 4.获取根元素下的子元素

                            List<Element> childElements = rootElement.elements();

                            // 5.遍历子元素

                            for (Element element : childElements) {

                                     //6.判断元素名称为servlet的元素

                                     if ("servlet".equals(element.getName())) {

                                               //7.获取servlet-name元素

                                               Element servletName = element.element("servlet-name");

                                               //8.获取servlet-class元素

                                               Element servletClass = element.element("servlet-class");

                                               System.out.println(servletName.getText());

                                               System.out.println(servletClass.getText());

                                     }

                            }

                   } catch (DocumentException e) {

                            e.printStackTrace();

                   }

         }

}

1.3案例实现

准备工作

为了模拟服务器端程序,且可以同时存在多个类似程序。故提供接口,接口中有3个方法,我们人为约定三个方法的调用顺序。

public interface IMyServlet {

 

    public void init();

 

    public void service();

 

    public void destory();

}

public class MyServletImpl implements IMyServlet {

 

    @Override

    public void init() {

       System.out.println("啊,俺来也……");

    }

 

    @Override

    public void service() {

       System.out.println("我可以为你服务……");

    }

 

    @Override

    public void destory() {

       System.out.println("啊,俺去也……");

    }

 

}

1.3.2反射执行

测试程序我们直接new HeIloServlet,这种编程方式我们称为硬编码,及代码写死了。为了后期程序的可扩展,开发中通常使用实现类的全限定类名(com.oracle.demo06.MyServletImpl)通过反射加载字符串指定的类,并通过反射创建实例。

public class TestMyServlet {

 

    @Test

    public void testMyServlet(){

       MyServletImpl my = new MyServletImpl();

       my.init();

       my.service();

       my.destory();

    }

   

    @Test

    public void testMyServlet1(){

       try {

           String className = "com.oracle.demo06.MyServletImpl";

           Class clazz = Class.forName(className);

           MyServletImpl my = (MyServletImpl) clazz.newInstance();

           my.init();

           my.service();

           my.destory();

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

}

1.3.3解析xml

使用反射我们己经可以创建对象的实例,此时我们使用的全限定类名,在程序是仍写死了,我们将器配置到xml文档中。

xml文档内容:

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

<web-app xmlns="http://www.example.org/web-app_2_5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"

    version="2.5">

    <servlet>

       <servlet-name>MyServlet1</servlet-name>

       <servlet-class>com.oracle.demo06.servlet.MyServlet1</servlet-class>

    </servlet>

    <servlet-mapping>

       <servlet-name>MyServlet1</servlet-name>

       <url-pattern>/myServlet1</url-pattern>

    </servlet-mapping>

      

</web-app>

解析实现:

步骤:

//1.创建解析器对象

//2.使用解析器加载web.xml文件得到document对象

//3.获取根元素节点

//4.根据元素名称获取子元素节点

//5.根据元素名称获取servlet-class的文本节点

//6.通过类全名获取字节码文件

//7.创建实例对象 

//8.调用实例对象里面的方法

package com.oracle.demo06.servlet;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

import org.junit.Test;

public class TestMyServlet {

        

         @Test

         public void testMyServlet(){

                   try {

                            //1.创建解析器对象

                            SAXReader saxReader = new SAXReader();

                            //2.使用解析器加载web.xml文件得到document对象

                            Document document = saxReader.read("src/com/oracle/demo06/servlet/web.xml");

                            //3.获取根元素节点

                            Element rootElement = document.getRootElement();

                            //4.根据元素名称获取子元素节点

                            Element servletElement = rootElement.element("servlet");

                            //5.根据元素名称获取servlet-class的文本节点

                            String servletClass = servletElement.element("servlet-class").getText();

                            //System.out.println(servletClass);

                            //6.通过类全名获取字节码文件

                            Class clazz = Class.forName(servletClass);

                            //7.创建实例对象

                            MyServlet1 my = (MyServlet1) clazz.newInstance();

                            //8.调用实例对象里面的方法

                            my.init();

                            my.service();

                            my.destory();

                   } catch (Exception e) {

                            // TODO Auto-generated catch block

                            e.printStackTrace();

                   }

         }

}

猜你喜欢

转载自www.cnblogs.com/mengmengi/p/10652394.html