zoukankan      html  css  js  c++  java
  • Java 模拟servlet执行、DTD约束、Schema约束、dom4j解析(读写xml)

    模拟servlet执行

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

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

    我们需要使用xml约束(DTDschema);为了获得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:

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

    </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 FolderFolderName:lib

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

    解析方式:

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

    SAX:处理速度快,只能读

    PULL:  Android内置的XML解析方式

    解析器(解析开发包):

    JAXP: sun公司提供支持DOMSAX开发包

    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());
                }
            }
            
            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业务");
        }
    }
  • 相关阅读:
    VBScript学习笔记
    C#调用C++库知识点
    .Net面试经验,从北京到杭州
    杭州.Net 相关大公司,希望对大家有帮助
    一起学习《C#高级编程》3--运算符重载
    一起学习《C#高级编程》2--比较对象的相等性
    一起学习《C#高级编程》1--类型的安全性
    博客园的第一天
    基于SpringCloud+Kubernetes 微服务的容器化持续交付实战
    第一节:Docker学习 — 安装
  • 原文地址:https://www.cnblogs.com/javscr/p/10262279.html
Copyright © 2011-2022 走看看