Java 模擬servlet執行、DTD約束、Schema約束、dom4j解析

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章