對(duì)XML以及Tomcat的簡(jiǎn)單了解

XML

extensible markup language 可擴(kuò)展標(biāo)記語(yǔ)言崇众。

XML的作用

  • 存儲(chǔ)數(shù)據(jù)
  • 作為配置文件
  • 作為數(shù)據(jù)傳輸載體

定義XML

  1. 文檔聲明: <?xml version="1.0"?>

指定encoding: <?xml version="1.0" encoding="utf-8"?>
還有standalone(yes/no)屬性代表文檔是否引用其他文件

  1. 元素定義
  • 元素即標(biāo)簽
  • 必須要有一個(gè)根元素
  • 可以寫空標(biāo)簽秘狞,即自閉合標(biāo)簽
  • 標(biāo)簽名可以完全自定義
  1. 屬性定義, 定義在元素內(nèi)部,如<stu id="111"></stu>
  2. 注釋:同html

CDATA區(qū)

所有 XML 文檔中的文本均會(huì)被解析器解析。
只有 CDATA 區(qū)段(CDATA section)中的文本會(huì)被解析器忽略。

  • 非法字符
    嚴(yán)格地講,在 XML 中僅有字符 "<"和"&" 是非法的。省略號(hào)视粮、引號(hào)和大于號(hào)是合法的,但是把它們替換為實(shí)體引用是個(gè)好的習(xí)慣橙凳。
轉(zhuǎn)義字符 符號(hào) 含義
&lt; < 小于
&gt; < 大于
&amp; & 和號(hào)
&apos; ' 省略號(hào)
&quot; " 引號(hào)

術(shù)語(yǔ) CDATA 指的是不應(yīng)由 XML 解析器進(jìn)行解析的文本數(shù)據(jù)(Unparsed Character Data)蕾殴。

在 XML 元素中,"<" 和 "&" 是非法的岛啸。

"<" 會(huì)產(chǎn)生錯(cuò)誤钓觉,因?yàn)榻馕銎鲿?huì)把該字符解釋為新元素的開始。

"&" 也會(huì)產(chǎn)生錯(cuò)誤坚踩,因?yàn)榻馕銎鲿?huì)把該字符解釋為字符實(shí)體的開始荡灾。

某些文本,比如 JavaScript 代碼瞬铸,包含大量 "<" 或 "&" 字符批幌。為了避免錯(cuò)誤,可以將腳本代碼定義為 CDATA嗓节。

CDATA 部分中的所有內(nèi)容都會(huì)被解析器忽略荧缘。

CDATA 部分由 "<![CDATA[" 開始,由 "]]>" 結(jié)束:

XML解析

獲取元素里面的字符數(shù)據(jù)或者屬性數(shù)據(jù)

分為DOM解析和SAX解析:

DOM解析: document object model,把整個(gè)xml全部讀到內(nèi)存當(dāng)中拦宣,形成樹狀結(jié)構(gòu)截粗。整個(gè)文檔稱為document對(duì)象,元素為element,屬性為attribute鸵隧,文本為text绸罗。

如果xml過大,會(huì)造成內(nèi)存溢出豆瘫,但是可以對(duì)文檔進(jìn)行增刪操作

SAX解析:Simple API for Xml, 基于事件驅(qū)動(dòng)珊蟀,讀取一行解析一行。

SAX不會(huì)造成內(nèi)存溢出靡羡,但是相應(yīng)的系洛,也不可以進(jìn)行增刪俊性,只能查詢略步。

針對(duì)DOM解析和SAX解析的API: jaxp, jdom, dom4j

dom4j

現(xiàn)有如下xml:

<?xml version="1.0" encoding="utf-8" ?>
<stus>
    <stu id="111">
        <name>Yang</name>
        <age>23</age>
    </stu>
</stus>

dom4j的代碼使用舉例:

package com;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        SAXReader saxReader = new SAXReader(); // 1.創(chuàng)建SAX讀取對(duì)象
        try {
//            指定解析的xml文件描扯,并獲取org.dom4j.Document對(duì)象
            Document document =  saxReader.read(new File("src/main/java/com/demo.xml"));
//            獲取到org.dom4j.Document的實(shí)例對(duì)象,就可以使用其方法獲取xml的信息
            System.out.println(document.getRootElement());// org.dom4j.tree.DefaultElement@3966ec04 [Element: <stus attributes: []/>]
            Element rootElement = document.getRootElement();
            System.out.println(rootElement.getName()); // 獲取到root元素的name stus

            List<Element> elements = rootElement.elements(); // 返回根元素的所有直接子元素
            System.out.println(elements.size()); // 1
            for (Element element : elements) {
                System.out.println(element.getName()); // stu
            }

//            獲取節(jié)點(diǎn)的信息
//            element()方法支持鏈?zhǔn)秸{(diào)用
            System.out.println(rootElement.element("stu").element("name").getText());// Yang
            System.out.println(rootElement.element("stu").element("name").getStringValue());// Yang
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Xpath

Xpath教程

Xpath是xml的路徑語(yǔ)言。支持在解析xml的時(shí)候趟薄,可以快速的定位到某一個(gè)層級(jí)比較深的元素绽诚。

使用Xpath可以避免上述例子一直鏈?zhǔn)秸{(diào)用rootElement.element("stu").element("name")的這種情況。

package com;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.io.File;

public class Main {
    public static void main(String[] args) {
        SAXReader saxReader = new SAXReader();
        try {
            Document document =  saxReader.read(new File("src/main/java/com/demo.xml"));
            Element rootElement = document.getRootElement();

            Node node =  rootElement.selectSingleNode("http://name");
            System.out.println(node.getText());// Yang
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

值得一提的是:還需要導(dǎo)入額外的依賴:

<!-- https://mvnrepository.com/artifact/jaxen/jaxen -->
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.2.0</version>
        </dependency>

XML的約束

對(duì)于如下xml:

<?xml version="1.0" encoding="utf-8" ?>
<stus>
    <stu id="111">
        <name>Yang</name>
        <age>23</age>
    </stu>
    <stu id="111">
        <name>Yang</name>
        <name>Zhang</name>
        <name>Wang</name>
        <age>23</age>
    </stu>
</stus>

如果想規(guī)定id唯一不重復(fù)或者name屬性只能有一個(gè)之類的約束的話杭煎,可以使用DTD或者schema

DTD

DTD教程

對(duì)于上述的xml恩够,可以新建一個(gè)dtd文件,對(duì)其內(nèi)部所有的元素做約束羡铲,
語(yǔ)法規(guī)則為: <!ELEMENT 元素名 元素類型> DTD元素
對(duì)于元素的屬性的約束語(yǔ)法規(guī)則為: <!ATTLIST 元素名稱 屬性名稱 屬性類型 默認(rèn)值>DTD屬性
新建一個(gè)stus.dtd,按如下規(guī)則規(guī)定約束:

<!ELEMENT stus (stu)+> // 代表stus標(biāo)簽下只能有stu標(biāo)簽 +代表有1個(gè)或者多個(gè)stu蜂桶,相應(yīng)的還有*(任意多個(gè))?(0個(gè)或者1個(gè))
<!ELEMENT stu (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)> // #PCDATA用于簡(jiǎn)單元素也切,即沒有子標(biāo)簽的元素 詳見
<!ATTLIST stu id ID> // 設(shè)置stu標(biāo)簽的id屬性的類型為ID即不可重復(fù)

關(guān)于屬性的類型約束: ID表示不可重復(fù)扑媚,CDATA表示是普通的文本
寫好約束之后,在xml中引入dtd引入:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE stus SYSTEM "stus.dtd">
<stus>
    <stu id="111">
        <name>Yang</name>
        <age>23</age>
    </stu>
    <stu id="111">
        <name>Yang</name>
        <name>Zhang</name>
        <name>Wang</name>
        <age>23</age>
    </stu>
</stus>

引入本地外部dtd的語(yǔ)法具體為:<!DOCTYPE 根元素 SYSTEM "文件名">

也可以不用新建文件雷恃,直接在xml內(nèi)部直接引用 <!DOCTYPE 根元素 [dtd內(nèi)容]>

如果要引入外部網(wǎng)絡(luò)上的dtd約束的話疆股,語(yǔ)法規(guī)則為:<!DOCTYPE 根元素 PUBLIC dtd名稱 dtd路徑(url)>

引入成功之后可以看到文件中不符合dtd約束的地方都被標(biāo)紅了。

schema

schema教程

schema其實(shí)就是一個(gè)xml倒槐,使用xml的語(yǔ)法規(guī)則旬痹,解析起來比較方便,是為了替代DTD讨越,但是schema約束文本內(nèi)容比DTD的內(nèi)容還要多两残,所以目前也沒有真正的替代DTD

schema后綴為xsd文件。對(duì)于上述xml把跨,新建一個(gè)xsd文件

<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">

</schema>

關(guān)于頭部屬性:xmlns,targetNamespace,elementFormDefault

Tomcat

web服務(wù)器軟件

web服務(wù)器軟件就是運(yùn)行在服務(wù)器上的一個(gè)應(yīng)用程序磕昼,負(fù)責(zé)下面的功能:

  • 客戶端輸入指定url進(jìn)行訪問,web服務(wù)器接收請(qǐng)求響應(yīng)消息
  • 處理客戶端的請(qǐng)求节猿, 返回資源/信息

Tomcat目錄結(jié)構(gòu)

bin: 包含了一些jar和腳本文件票从,如startup.bat
conf: tomcat的配置,server.xml,web.xml
lib: tomcat運(yùn)行所需的jar包
logs: 日志文件
temp:臨時(shí)文件
webapps:發(fā)布到tomcat服務(wù)器上的項(xiàng)目
work:jsp文件翻譯成java文件存放地

發(fā)布項(xiàng)目到tomcat

需求:如何通過服務(wù)器訪問到本地的資源stu.xml

  1. 拷貝文件到webapps
  2. 如果文件在webapps/ROOT下的話滨嘱,重啟tomcat峰鄙,訪問localhost:8080/stu.xml即可
  3. 如果文件沒放在ROOT文件夾下,那么新建一個(gè)文件夾xml太雨,將stu.xml放到xml目錄下,重啟tomcat吟榴,訪問localhost:8080/xml/stu.xml下即可訪問到

上述文件涉及到拷貝文件,如果不想手動(dòng)拷貝囊扳,可以去修改server.xml去配置虛擬路徑

  1. 打開server.xml吩翻,找到<Host>標(biāo)簽兜看,在其后面追加一個(gè)<Context docBase="D:\JavaDemos\src\com\company" path="/testPath"></Context>

docBase屬性規(guī)定了要訪問的文件的目錄路徑,而path規(guī)定了頁(yè)面url訪問時(shí)的路由地址

  1. 重啟tomcat狭瞎,訪問localhost:8080/testPath/stu2.xml细移,即可獲取到文件

配置虛擬路徑還有另外一種方式熊锭,詳見tomcat Defining a context

  1. 在$CATALINA_BASE/conf/[enginename]/[hostname]/目錄下弧轧,默認(rèn)為:[tomcat安裝目錄]/conf/catalina/localhost,新建一個(gè)xml文件碗殷,名稱定義為person.xml
  2. 編輯這個(gè)persom.xml精绎,寫入<?xml version="1.0" encoding="utf-8" ?>之后,加入上述配置虛擬路徑<Context>的那個(gè)元素:<Context docBase="D:\JavaDemos\src\com\company"></Context>,但是注意要去掉Path
  3. 重啟tomcat锌妻,訪問localhost:8080/person/stu2.xml即可獲取到資源

其實(shí)一般使用最多的還是第一種手動(dòng)拷貝代乃,下面2種配置虛擬路徑的方式其實(shí)過于繁瑣了

idea中配置Tomcat

安裝完tomcat后,

  1. 配置環(huán)境變量CATALINA_BASE: D:\apache-tomcat-8.5.40 //Tomcat安裝目錄
  2. 配置環(huán)境變量CATALINA_HOME: D:\apache-tomcat-8.5.40 //Tomcat安裝目錄
  3. 在ClassPath的變量值中加入:%CATALINA_HOME%\lib\servlet-api.jar;
  4. 在Path的變量值中加入:%CATALINA_HOME%\bin;%CATALINA_HOME%\lib;
  5. 在idea中設(shè)置edit configuration仿粹,新增tomcat server搁吓,server頁(yè)選擇本地安裝目錄,并且要在deployment頁(yè)面新增ROOT牍陌,否則默認(rèn)不能訪問8080
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末擎浴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子毒涧,更是在濱河造成了極大的恐慌贮预,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件契讲,死亡現(xiàn)場(chǎng)離奇詭異仿吞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捡偏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門唤冈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人银伟,你說我怎么就攤上這事你虹。” “怎么了彤避?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵傅物,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我琉预,道長(zhǎng)董饰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮卒暂,結(jié)果婚禮上啄栓,老公的妹妹穿的比我還像新娘。我一直安慰自己也祠,他們只是感情好昙楚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著齿坷,像睡著了一般数焊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上佩耳,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音李滴,去河邊找鬼蛮瞄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芹助,可吹牛的內(nèi)容都是我干的闲先。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蒙谓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼训桶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谤专,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤琉朽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后墅垮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抬伺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年峡钓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了若河。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拉鹃,死狀恐怖膏燕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坝辫,我是刑警寧澤射亏,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站银锻,受9級(jí)特大地震影響做鹰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钾麸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一饭尝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钥平,春花似錦、人聲如沸知态。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)其做。三九已至,卻和暖如春驹沿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背甚负。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工审残, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搅轿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓璧坟,卻偏偏與公主長(zhǎng)得像雀鹃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子黎茎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. XML簡(jiǎn)介 以下內(nèi)容來自于http://www.w3school.com.cn/xml 基本知識(shí) XML 和...
    WebSSO閱讀 1,911評(píng)論 1 7
  • 一、XML介紹 XML 指可擴(kuò)展標(biāo)記語(yǔ)言(EXtensible Markup Language),也是一種標(biāo)記語(yǔ)言...
    圣賢與無賴閱讀 1,118評(píng)論 2 3
  • 一:XML的介紹 XML(可擴(kuò)展的標(biāo)記語(yǔ)言)的作用: 1.可以用來保存數(shù)據(jù) 2.可以用來做配置文件 3.數(shù)據(jù)傳輸載...
    愛樂之農(nóng)閱讀 283評(píng)論 0 0
  • 1 從前有一個(gè)年輕的農(nóng)夫,他養(yǎng)了一只鵝。每天的愿望就是從鵝籠里撿一個(gè)鵝蛋當(dāng)早飯屏积。有一天他在鵝籠里發(fā)現(xiàn)了一個(gè)金蛋。當(dāng)...
    右水左岸閱讀 1,938評(píng)論 17 71
  • 我恐懼登高 但為了一窩蜜 我必須爬上髙樹留搔。 我厭惡海水咸澀 但為了一條魚 我必須潛入海中铛铁。 蜜蜂們很憤怒 但我的家...
    王子魚閱讀 2,479評(píng)論 116 164