Java 模拟servlet执行、DTD约束、Schema约束、dom4j解析

旧城冷巷雨未停 提交于 2020-12-28 08:20:09

模拟servlet执行

浏览器请求WEB服务器上的资源,WEB服务器返回给浏览器

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

我们需要使用xml约束(DTD或schema);为了获得xml的内容,我们需要使用dom4j进行解析。

XML(不同路径(/hello)执行不同的资源( HeIIoMyServlet))

XML可扩展的标记语言 标签可自定义的

包下创建xml 文件 new → other → XMLFile

粘贴web-app_ 2_ 3.dtd文件

复制web-app_ 2_ 3.dtd的文档声明到xml文件

存放数据

<?xml version="1.0" encoding="UTF-8"?> XML文档声明第一行 顶格写

versioin:XML版本encoding:文档的编码 默认utf-8:
//加入Java开发交流君样:756584822一起吹水聊天
 

<school name="oracle" size="3"> 元素(不以XML,xml开头)一个根元素

<person> 属性值必须使用单引或双引

<name>张三<</name> 元素内容 转义符 写法与html相同

<age><![CDATA[18><]]></age>CDATA区<![CDATA[内容自动转义]]>

<c/> 空元素

</person> <!--注释-->

</school>

DTD约束 (约束元素名、子元素、顺序、元素属性等) web-app_2_3.dtd

<?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>

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

  • 常见符号: ? {1} * {0,n} +{1.n} (a|b)或 (a,b,c)指定顺序
  • 常见类型:#PCDATA表示内容是文本,不能是子标签
<!ATTLIST 元素名 属性1 属性类型1 约束1 属性2 属性类型2 约束2>

属性类型:ID/CDATA/(a|b) 标识唯一/文本类型/多选一

属性约束:#REQUIRED/#IMPLIED 属性必须有 /属性可选

内部:在XML文档内部嵌入DTD

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

<!DOCTYPE web-app [

...//具体语法

]>

<web-app>...</web-app>

外部:DTD文档在本地系统上

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

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

<web-app>...</web-app>

外部:DTD文档在网络上

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

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>...</web-app>

Schema约束 (功能多,数据类型更完善,命名空间)web-app_ 2_ 5.xsd

命名空间:解决多个约束文件同名元素冲突

包下创建xml 文件 new → other → XMLFile

粘贴web-app_ 2_ 5.xsd文件 到包

复制web-app_ 2_ 5.xsd的命名空间到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>Hello</servlet-name>

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

</servlet>

<servlet-mapping>

<servlet-name>Hello</servlet-name>

<url-pattern>/Hello</url-pattern>
//加入Java开发交流君样:756584822一起吹水聊天
</servlet-mapping>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

<welcome-file>index.html</welcome-file>

</welcome-file-list>

</web-app>

dom4j解析(读写xml)

项目下新建lib文件夹 new → Folder→ FolderName:lib

粘贴dom4j-1.6.1.jar, jaxen-1.1-beta-6.jar 到lib文件夹

解析方式:

DOM:保留元素之间结构,可以进行增删改查操作。可能内存溢出

SAX:处理速度快,只能读

PULL: Android内置的XML解析方式

解析器(解析开发包):

JAXP: sun公司提供支持DOM和SAX开发包

JDom:dom4j兄弟

jsoup:一种处理HTML特定解析开发包

dom4j:比较常用的解析开发包,hibernate底层采用。

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

public class Demo {//同包下
    public static void main(String[] args) throws Exception {
        SAXReader saxReader=new SAXReader();//解析器对象
        
       Document doc=saxReader.read("src/com/oracle/web.xml");//文档对象
        
        Element root=doc.getRootElement();            //获取根元素
        Element ser=root.element("ser");    //获取第一个"ser"子元素

        String rootName=root.getName();            //获取元素名称
        String rootAttr=root.attributeValue("version");    //获取元素属性值
        String rootText=root.getText();            //获取元素文本内容
        //List<Element> elements=root.elements();    //获取子元素 数组
        List<Element> elements=root.elements("aaa");//获取子元素 数组

        //Element ele1=e.element();    //获取第一个子元素 
        Element aaa=e.element("aaa");    //获取第一个子元素 叫"aaa"的

        for(Element e:elements){                //遍历子元素
            if(e.getName().equals("servlet")){    //元素名是否为servlet
                //获取servlet-name子元素
                Element servletName=e.element("servlet-name");
                //获取servlet-name子元素 的文本内容
                String servletNameText=e.elementText("servlet-name");
                //获取servlet-class子元素
                Element servletClass=e.element("servlet-class");
                System.out.println(servletName.getText());
                System.out.println(servletClass.getText());
            }
        }//加入Java开发交流君样:756584822一起吹水聊天
        
        Class c=Class.forName(classText);    //通过类全名获取字节码文件
          
        Object obj=c.newInstance();        //创建实例对象
        
        Hello add=(Hello)obj;            //对象转型
        add.init();                        //调用方法
        add.service();
    
    }
}

public class Hello{
    public void init(){
        System.out.println("servlet初始化");
    }
    public void service(){
        System.out.println("servlet业务");
    }
}

image

最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:756584822

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!