2018-08-31XML文件+DTD约束文件+Schema约束文件

Java里面两种配置文件:XML和Properties文件!

只要是A标签这种没有办法指定提交方式(GET/POST)的标签,都是GET方式提交!

Servlet:请求-->响应!

XML指可扩展标记语言,XML被设计用来传输和存储数据!

Servlet执行机制:

XML个称为Extensible Markup Language,意思是可扩展的标记语言!XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的!

XML文档声明

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

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

3;文档声明只有属性!

versioin:指定XML文档版本,必须属性,不会选择1.1,只会选择1.0!

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

元素Element:

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

2;普通元素的结构开始标签,元素体,结束标签组成!

3:元素体:元素体可以是元素,也可以是文本!

4:空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭介!

5:元素命名:

区分大小写!

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

不建议以XML,xml,Xml开头!

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

属性

1;属性是元素的一部分,它必须出现在元素的开始标签中!

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

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

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

注释:

XML的注释与HTML相同,即以<!--开始,以-->结束!注释内容会被XML解析器忽略!

转义字符

XML中的转义字符与HTML一样(HTML实体)!

因为很多符号己经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符!

CDATA区

 

当大量的转义字符出现在XML文档中时,会使XML文档的可读性大幅度降低!

此时可以使用CDATA!

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文档在网络上,一般都有框架提供!

XML文件中的特殊符号释义:

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

    元素名:自定义

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

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

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

符号

符号类型

描述

示例

?

问号

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

(菜鸟?)

*

星号

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

(爱好*)

+

加号

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

(成员+)

()

括号

用来给元素分组

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

(王朔|余杰),毛毛

|

竖条

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

(男人|女人)

,

逗号

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

(西瓜,苹果,香蕉)

DTD和Schema约束:

Schema约束更加规范化一点!

Schema优点:

Schema是新的XML文档约束:

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

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

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

Schema支持名称空间

DTD约束文件:

<servlet>

<!-- 不可以使用空格和冒号 -->

<!-- 3 -->

<servlet-name>HelloServlet</servlet-name>

<!-- 4是包名加类名文件 -->

<servlet-class>com.oracle.helloservlet</servlet-class>

</servlet>

<servlet-mapping>

<!-- 2和3名字必须相同 -->

<servlet-name>HelloServlet</servlet-name>

<!-- 1页面进来先找URL地址,必须以/开头 -->

<url-pattern>/hello</url-pattern>

</servlet-mapping>

Schema约束文件规范:

<!-- 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">

</web-app>

解析方式和解析器:

1;DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象!

①     优点:元素与元素之间保留结构关系,故可以进行增删改查操作!

②     缺点:XML文档过大,可能出现内存溢出显现!

2;SAX:是一种速度更快,更有效的方法!它逐行扫描文档,一边扫描一边解析!并以事件,驱动的方式进行具体解析,每执行一行,都将触发对应的事件!

①    优点:处理速度快,可以处理大文件

②    缺点:只能读,逐行后将释放资源!

3;PULL:Android内置的XML解析方式,类似SAX!

解析器释义:

①    解析器:就是根据不同的解析方式提供的具体实现,有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包!

①    常见的解析开发包:

①  JAXP:Sun公司提供支持DOM和SAX开发包!

②  JDom:Dom4J兄弟!

③  JSoup:一种处理HTML特定解析开发包!

④  Dom4J:比较常用的解析开发包,Hibernate底层采用!

原理示意图:

解析器使用如下:

步骤:

1.获取解析器

2.获得document文档对象

3.获取根元素

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

5.遍历子元素

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

7.获取servlet-name元素

8.获取servlet-class元素

作业代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.oracle.homework.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>


<?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>TestServlet</servlet-name>
<servlet-class>com.oracle.homework.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>


package com.oracle.homework;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class TestQues3 {
    public static void main(String[] args) throws DocumentException {
        //获取解析器:
        SAXReader saxr=new SAXReader();
        //获取Document文档:
        Document doc=saxr.read("src/com/oracle/homework/WebXSD.xml");
        //获取文档中的根标签,拿到web-app:
        Element rootEle=doc.getRootElement();
        //获取跟标签的子标签放进List集合:
        List<Element> childEle=rootEle.elements();
        //遍历该集合:
        for(Element ele:childEle){
            if("servlet".equals(ele.getName())){
                System.out.println(ele.element("servlet-name").getName());
                System.out.println(ele.element("servlet-class").getName());
            }else if("servlet-mapping".equals(ele.getName())){
                System.out.println(ele.element("servlet-name").getName());
                System.out.println(ele.element("url-pattern").getName());
            }
            System.out.println(ele.getName());
        }
    }
}


//定义接口:
package com.oracle.homework;
public interface MyServlet {
    public void init();
    public void service();
    public void distory();
}

//实现以上接口:
package com.oracle.homework;
public class MyServletImp implements MyServlet {
    @Override
    public void init() {
        System.out.println("这是Init");
    }

    @Override
    public void service() {
        System.out.println("这是Service");
    }

    @Override
    public void distory() {
        System.out.println("这是Distory");
    }
}

//进行不可描述的操作:
package com.oracle.homework;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class TestMyServlet {
    public static void main(String[] args) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        //获取解析器:
        SAXReader saxr=new SAXReader();
        //获取Document文档:
        Document doc=saxr.read("src/com/oracle/homework/MyServletXSD.xml");
        //获取根标签web-app:
        Element rootEle=doc.getRootElement();
        //获取rootEle的子元素并放进List集合:
        List<Element> childEle=rootEle.elements();
        //定义String接收,并遍历赋值:
        String getPackClass=null;
        for(Element ele:childEle){
            if("servlet".equals(ele.getName())){
                getPackClass=ele.element("servlet-class").getText();
            }
        }
        //获取字节码文件对象:
        Class cla=Class.forName(getPackClass);
        //获取Object对象:
        MyServletImp myser=(MyServletImp)cla.newInstance();
        myser.init();
        myser.service();
        myser.distory();
    }
}

猜你喜欢

转载自www.cnblogs.com/postgredingdangniu/p/9569993.html