0305 xml

web编程

可以通过浏览器访问web服务器上的资源了

什么是xml

xml是可扩展标记语言,XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的

xml格式:

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

元素:

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

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

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

元素命名:

区分大小写

不能使用空格,不能使用冒号

不建议以XML,  xml,  Xml开头

格式化良好的XML文档,必须只有一个根元素

属性:

属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引

一个元素可以有O ~ N个属性,但一个元素中不能出现同名属性

属性名不能使用空格、冒号等特殊字符,且必须以字母开头

注释:

XML的注释与HTML相同,即以“<!--”开始,以“-->”结束

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

那么我们就要采用CDATA区 将代码包裹起来

我们先写一个简单的,创建一个demo01.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<school>
    <class1>
        <student name="张三" age="18"></student>
        <student name="李斯" age="18"></student>
    </class1>
    <class2>
        <student name="小红" age="18"></student>
        <student name="小绿" age="18"></student>
    </class2>
    <class3>
        <![CDATA[
            if(a<b&&a>100){
                a=1;
            }
        ]]>
    </class3>
</school>

  像上述代码中我们自定义了一些标签,但是感觉并没有什么任何意义,所以提供了DTD约束和Schema约束,去约束xml文件的代码编写

1、DTD约束,我们将web-app_2_3.dtd文件打开发现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<!--
    模拟servlet2.3规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
    格式如下:
    <!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
-->
<!ELEMENT web-app (servlet*,servlet-mapping* , welcome-file-list?) >
<!ELEMENT servlet (servlet-name,description?,(servlet-class|jsp-file))>
<!ELEMENT servlet-mapping (servlet-name,url-pattern+) >
<!ELEMENT servlet-name (#PCDATA)>
<!ELEMENT servlet-class (#PCDATA)>
<!ELEMENT url-pattern (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT jsp-file (#PCDATA)>
 
<!ELEMENT welcome-file-list (welcome-file+)>
<!ELEMENT welcome-file (#PCDATA)>
 
<!ATTLIST web-app version CDATA #IMPLIED>

  上述DTD约束中规定了xml文件 的根标签 子标签的书写规范,什么标签下必须有什么标签,那我们再创建一个web.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
<web-app>
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.oracle.demo01.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>
</web-app>

  我们只需要将web-app_2_3.dtd文件中的<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">这句代码粘贴到我们创建的xml文件中,按照提示将标签点出来就OK了

2、Schema约束,和DTD约束用法是一样的。Schema约束比DTD约束要强大一点

那么我们将完整包名加类名写在了xml文件的标签中,那我们只能获取到他的内容我们才能去进行反射 获取他的类对象,从而操作类的方法

依旧采用dom树的思路去获取标签内容,那么久用到了dom4jjar包

dom4j必须使用核心类SaxReader加载xml文档获得Document通过Document对象获得文档的根元素

SaxReader类中有一个read方法 用于加载xml文件,返回值是一个document对象,

document类中有一个getRootElement方法获取根元素,返回值是Element对象

Element中

elements获取指定名称的所有子元素

element 获取指定名称的第一个子元素

getName 获取当前元素的元素名称

attributeValue 获取指定属性名的属性值

elementText获取指定子元素的文本值

getTxt获取当然元素的文本内容

代码展示

先将jar包导入到项目中

 

 

 将Schema约束文件放在同一个包中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?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>

  将上述代码中的

1
2
3
4
<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"><br><br>
1
复制到创建的web.xml中

创建web.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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>HelloServlet</servlet-name>
                <servlet-class>com.oracle.demo02.HelloServlet</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>HelloServlet</servlet-name>
                <url-pattern>/HelloServlet</url-pattern>
            </servlet-mapping>
</web-app>

  创建HelloServlet类

1
2
3
4
5
6
7
8
9
10
11
12
public class HelloServlet {
 
    public void init(){
        System.out.println("Servlet创建啦");
    }
    public void service(){
        System.out.println("Servlet被访问了");
    }
    public void destory(){
        System.out.println("Servlet被销毁了");
    }
}

  

创建测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Demo01 {
 
    public static void main(String[] args) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        //加载xml文档 获取整个文档对象
        SAXReader sax=new SAXReader();
        Document doc=sax.read("src/com/oracle/demo02/web.xml");
        //获取根元素对象
        Element root=doc.getRootElement();
        //获取servlet标签
        Element servlet=root.element("servlet");
        //获取servlet-class元素对象
        Element servletClass=servlet.element("servlet-class");
        //获取当前元素文本内容
        String className=servletClass.getText();
        //获取字节码文件
        Class c=Class.forName(className);
        //快速创建对象
        HelloServlet hello=(HelloServlet)c.newInstance();
        //获取成员方法对象
        hello.init();
        hello.service();
        hello.destory();
    }
}

  运行结果

Servlet创建啦
Servlet被访问了
Servlet被销毁了

 

posted @   公雪  阅读(113)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示