1. 程式人生 > 實用技巧 >XML基礎和Web基本概念(JavaWeb片段一)

XML基礎和Web基本概念(JavaWeb片段一)

XML基礎

概述

xml(eXtensible Markup Language)即可擴充套件標記語言,xml是網際網路資料傳輸的重要工具,它可以跨越網際網路任何的平臺,不受程式語言和作業系統的限制,可以說它是一個擁有網際網路最高級別通行證的資料攜帶者。

  • XML 的設計宗旨是傳輸資料,而不是顯示資料
  • HTML被設計用來顯示資料。
  • XML 是 W3C 的推薦標準

一個完整的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<book>
	<title>人生海海</title>
    <author>麥芒</author>
</book>

XML語法

文件宣告

一個完整的XML文件中,必須包含一個XML文件的宣告,並且該宣告必須位於文件的第一行。

語法格式:

<?xml 版本資訊 [編碼資訊] [文件獨立資訊]?>

XML組成元素

XML文件的主題內容都是由元素(Element)組成的。元素一般是由開始標記屬性元素內容結束標記組成。


標籤(開始結束標記):

1)一個XML文件有且僅有一個根元素。

2)所有的XML元素都必須有結束標籤(關閉標籤)

注:這裡的結束標籤不一定是成對的,也可以是空標籤。

空標籤也必須有結束標籤,不同於HTML,在HTML中 <br>是合法的,但是在XML中空標籤必須有<br/>

結束標籤。

3)XML標籤大小寫敏感

4)XML必須正確地巢狀


屬性:

語法:<元素名 屬性名=“屬性值”/>

1)屬性值用雙引號包裹;一個元素可以有多個屬性


元素內容(實體)

1)標籤內可以有空實體,即空標籤

2)特殊字元不能直接放在元素內容中,需要使用實體引用來代替。XML中5個預定義的實體引用如下:


總結:遵循如下規則的xml文件稱為格式正規的xml文件:

  • 必須有xml宣告語句

  • 必須有且僅有一個根元素

  • 標籤大小寫敏感

  • 屬性值用雙引號

  • 空標籤必關閉

  • 元素正確巢狀

DTD約束

什麼是約束?

在書寫XML文件時,其內容必須滿足某些條件的限制,在XML文件中,定義一套規則來對文件中的內容進行約束,這套約束稱為XML約束。

說白了就是對XML文件的內容進行限制,該寫什麼不該寫什麼。

DTD約束

DTD約束是最早出現的一種XML約束模式語言,根據它建立的檔案字尾一般為(.dtd)檔案,在一個dtd檔案中,可以包含元素的定義,元素之間關係的定義,元素屬性的定義以及實體和符號的定義

DTD的引入

如果想要使用DTD檔案約束XML文件,必須在XML文件中引入DTD檔案。在XML文件中引入外部DTD檔案有兩種方式,具體如下:

<!DOCTYPE 根元素名稱 SYSTEM "外部DTD檔案的URI">
<!DOCTYPE 根元素名稱 PUBLIC "DTD名稱" "外部DTD檔案的URI">

這裡可以結合struts或者hibernate的配置檔案學習

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

DTD語法

看書或者看部落格

Schema約束

XML Schema也是一種用於定義和描述與內容的模式語言。它的檔案字尾名一般為.xsd(XML Schema Definition)。

XML名稱空間

一個XML文件可以引入多個約束文件,但是,由於約束文件中的元素或屬性都是自定義的。當兩個不同的文件使用相同的元素名時,就會發生命名衝突

解決命名衝突的方法一般有:

  1. 使用字首來避免命名衝突

    <h:table>
    <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
    </h:tr>
    </h:table>
    
    <f:table>
    <f:name>African Coffee Table</f:name>
    <f:width>80</f:width>
    <f:length>120</f:length>
    </f:table>
    
  2. XML名稱空間 - xmlns屬性

    <root>
    
    <h:table xmlns:h="http://www.w3.org/TR/html4/">
    <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
    </h:tr>
    </h:table>
    
    <f:table xmlns:f="http://www.w3cschool.cc/furniture">
    <f:name>African Coffee Table</f:name>
    <f:width>80</f:width>
    <f:length>120</f:length>
    </f:table>
    
    </root>
    <!--或者 在他們被使用的元素中或者在 XML 根元素中宣告命名控制元件-->
    <root xmlns:h="http://www.w3.org/TR/html4/"
    xmlns:f="http://www.w3cschool.cc/furniture">
    
    <h:table>
    <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
    </h:tr>
    </h:table>
    
    <f:table>
    <f:name>African Coffee Table</f:name>
    <f:width>80</f:width>
    <f:length>120</f:length>
    </f:table>
    
    </root>
    

這裡重點介紹第二種。

XML名稱空間可以唯一標識一個元素或屬性

預設名稱空間和屬性

重複限定一個要在名稱空間中使用的元素或屬性可能會非常麻煩。這種情況下,可以宣告一個 {預設名稱空間}。記住,無論在任何時候都只能存在一個 {預設名稱空間}。因此,術語“多個預設名稱空間”在實際上是不正確的。

宣告一個 {預設名稱空間} 意味著,如果 {預設名稱空間} 聲明範圍內的任何元素未使用字首顯式限定,則該元素將被隱式限定。與帶字首的名稱空間一樣,{預設名稱空間} 也可以被覆蓋。{預設名稱空間} 宣告如下:

<someElement xmlns="http://www.foo.com"/>
<?xml version="1.0"?>
<Book xmlns="http://www.library.com">
    <Title>Sherlock Holmes</Title>
    <Author>Arthur Conan Doyle</Author>
</Book>

這種情況下,元素 Book、TitleAuthor 與名稱空間 http://www.library.com 關聯。

記住,名稱空間的範圍起始於宣告該名稱空間的元素。因此,元素 Book 還與 {預設名稱空間}關聯,這是因為它沒有字首。

<?xml version="1.0"?>
<Book xmlns="http://www.library.com">
    <Title>Sherlock Holmes - I</Title>
    <Author>Arthur Conan Doyle</Author>
    <purchase xmlns="http://www.otherlibrary.com">
        <Title>Sherlock Holmes - II</Title>
        <Author>Arthur Conan Doyle</Author>
    </purchase>
    <Title>Sherlock Holmes - III</Title>
    <Author>Arthur Conan Doyle</Author>
</Book>

在以上的示例中, Sherlock Holmes - IIISherlock Holmes - I 的元素 BookTitleAuthor 與名稱空間http://www.library.com 關聯, Sherlock Holmes - II 的元素 purchase、 TitleAuthor 與名稱空間http://www.otherlibrary.com 關聯。

預設名稱空間不應用於屬性;因此,要將名稱空間應用於屬性,必須顯式限定該屬性。

引入Schema文件

要想通過XML Schema檔案對某個XML文件進行約束,必須將XML文件與Schema檔案進行關聯。關聯的方式有以下兩種。

1)使用名稱空間引入

在使用名稱空間引入XML Schema文件時,需要通過屬性xsi:schemaLocation來宣告名稱空間的文件,在該屬性中,包含了兩個URI,這兩個URI之間用空格隔開。第一個URI是名稱空間的名稱,第二個URI是文件的位置。

例項

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd>

xsi:schemaLocation屬性是在標準名稱空間http://www.w3.org/2001/XMLSchema-instance定義的,所以在使用xsi:schemaLocation時需要宣告該屬性所屬的名稱空間。

2)不使用名稱空間引入

通過xsi:noNamespaceSchemaLocation屬性直接指定文件。

Schema語法

看書或者看部落格

參考:

XML Namespace 名稱空間

XML名稱空間

總結

開發中XML知識用到的儘管不多,但是我希望學習過XML後,能對xml文件出現的地方有所見解。比如說spring配置檔案,我能知道xmlns:xsixmlns:txxmlns:aop所代表的是什麼意思,為什麼要這樣做。這就是初衷。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/tx
                http://www.springframework.org/schema/tx/spring-tx.xsd
                http://www.springframework.org/schema/aop
                http://www.springframework.org/schema/aop/spring-aop.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context.xsd">

Web基本概念

應用程式

WEB應用程式指供瀏覽器訪問的程式,通常也簡稱為web應用。例如有a.html 、b.html…..多個web資源,這多個web資源用於對外提供服務,此時應把這多個web資源放在一個目錄中,以組成一個web應用(或web應用程式)
  一個web應用由多個靜態web資源和動態web資源組成,如:html、css、js檔案,Jsp檔案、java程式、支援jar包、配置檔案等等。
  Web應用開發好後,若想供外界訪問,需要把web應用所在目錄交給web伺服器管理,這個過程稱之為虛似目錄的對映

WEB應用程式指供瀏覽器訪問的程式,通常也簡稱為web應用。例如有a.html 、b.html…..多個web資源,這多個web資源用於對外提供服務,此時應把這多個web資源放在一個目錄中,以組成一個web應用(或web應用程式)
  一個web應用由多個靜態web資源和動態web資源組成,如:html、css、js檔案,Jsp檔案、java程式、支援jar包、配置檔案等等。
  Web應用開發好後,若想供外界訪問,需要把web應用所在目錄交給web伺服器管理,這個過程稱之為虛似目錄的對映

靜態動態

靜態資源:html、css、js檔案。

動態資源:模板檔案,比如Thymeleaf、Freemarker,需要特定的Web容器進行解析。

靜態Web程式:包含靜態網頁的web站點,客戶端的請求經過Web Server伺服器處理後,從檔案系統找到特定的檔案並返回,相同的請求返回的返回的結果是固定的。

htm、html,這些是網頁的字尾,如果現在在一個伺服器上直接讀取這些內容,那麼意味著是把這些網頁的內容通過網路伺服器展現給使用者。整個靜態WEB操作的過程圖如下:

  在靜態WEB程式中,客戶端使用WEB瀏覽器(IE、FireFox等)經過網路(Network)連線到伺服器上,使用HTTP協議發起一個請求(Request),告訴伺服器我現在需要得到哪個頁面,所有的請求交給WEB伺服器,之後WEB伺服器根據使用者的需要,從檔案系統(存放了所有靜態頁面的磁碟)取出內容。之後通過WEB伺服器返回給客戶端,客戶端接收到內容之後經過瀏覽器渲染解析,得到顯示的效果。

動態Web程式:存在靜態網頁和動態網頁的web站點,客戶端的請求經過Web Server後,需要藉助第三方外掛來完成請求的解析過程比如Servlet容器(tomcat),此時對於相同的請求結果可能就會有所不同。

整個動態WEB操作的過程圖如下:

  動態WEB中,程式依然使用客戶端和服務端,客戶端依然使用瀏覽器(IE、FireFox等),通過網路(Network)連線到伺服器上,使用HTTP協議發起請求(Request),現在的所有請求都先經過一個WEB Server Plugin(伺服器外掛)來處理,此外掛用於區分是請求的是靜態資源(.htm或者是.htm)還是動態資源。

  如果WEB Server Plugin發現客戶端請求的是靜態資源(.htm或者是.htm),則將請求直接轉交給WEB伺服器,之後WEB伺服器從檔案系統中取出內容,傳送回客戶端瀏覽器進行解析執行。

  如果WEB Server Plugin發現客戶端請求的是動態資源(.jsp、.asp/.aspx、.php),則先將請求轉交給WEB Container(WEB容器),在WEB Container中連線資料庫,從資料庫中取出資料等一系列操作後動態拼湊頁面的展示內容,拼湊頁面的展示內容後,把所有的展示內容交給WEB伺服器,之後通過WEB伺服器將內容傳送回客戶端瀏覽器進行解析執行。

Web伺服器

1、Web伺服器是指駐留於因特網上某種型別計算機的程式,是可以向發出請求的瀏覽器提供文件的程式。當Web瀏覽器(客戶端)連到伺服器上並請求檔案時,伺服器將處理該請求並將檔案反饋到該瀏覽器上,附帶的資訊會告訴瀏覽器如何檢視該檔案(即檔案型別)。

2、伺服器是一種被動程式:只有當Internet上執行在其他計算機中的瀏覽器發出請求時,伺服器才會響應。

常見的Web伺服器

WebLogic、WebSphere、IIS、Apache(Tomcat)、Ngix、Redis。

HTTP

介紹

HTTP(HyperText Transfer Protocol):超文字傳輸協議。它是TCP/IP協議的一個應用層協議,定義了Web瀏覽器與伺服器之間資料交換的格式。

HTTP協議的特點

  • 支援BS模式
  • 簡單快速,HTTP伺服器的程式很小,因而通訊速度很快。
  • 靈活,HTTP協議可以傳輸任意型別的資料。
  • 無狀態,HTTP協議是無狀態的。無狀態協議是指對於事務的處理能力沒有記憶能力。

那麼我們儲存⽤戶狀態呢?

Cookie+Session。

Session 機制的存在就是為了解決這個問題, Session 的主要作⽤就是通過服務端記錄⽤戶的狀態。典型的場景是購物⻋,當你要新增商品到購物⻋ 的時候,系統不知道是哪個⽤戶操作的,因為 HTTP 協議是⽆狀態的。服務端給特定的⽤戶建立特定的 Session 之後就可以標識這個⽤戶並且跟蹤這個⽤戶了(⼀般情況下,伺服器會在⼀定時間內儲存這個 Session,過了時間限制,就會銷燬這個Session)。 在服務端儲存 Session 的⽅法很多,最常⽤的就是記憶體和資料庫(⽐如是使⽤記憶體資料庫redis儲存)。 既然 Session 存放在伺服器端,那麼我們如何實現 Session 跟蹤呢?⼤部分情況下,我們都是通過在 Cookie 中附加⼀個 Session ID 來⽅式來跟蹤。

Cookie和Session

Cookie 和 Session都是⽤來跟蹤瀏覽器⽤戶身份的會話⽅式,但是兩者的應⽤場景不太⼀樣。

Cookie一般用來儲存使用者資訊 比如:

①我們在 Cookie 中儲存已經登入過得⽤戶資訊,下次訪問⽹站的 時候⻚⾯可以⾃動幫你登入的⼀些基本資訊給填了;

②⼀般的⽹站都會有保持登入也就是說下次你再訪 問⽹站的時候就不需要重新登入了,這是因為⽤戶登入的時候我們可以存放了⼀個 Token 在 Cookie 中,下次登入的時候只需要根據 Token 值來查詢⽤戶即可(為了安全考慮,重新登入⼀般要將 Token 重寫);

③登入⼀次⽹站後訪問⽹站其他⻚⾯不需要重新登入。

Session 的主要作⽤就是通過服務端記錄⽤戶的狀態。

典型的場景是購物⻋,當你要新增商品到購物⻋的時候,系統不知道是哪個⽤戶操作 的,因為 HTTP 協議是⽆狀態的。服務端給特定的⽤戶建立特定的 Session 之後就可以標識這個⽤戶 並且跟蹤這個⽤戶了。

Cookie 資料儲存在客戶端(瀏覽器端),Session 資料儲存在伺服器端。 Cookie 儲存在客戶端中,⽽Session儲存在伺服器上,相對來說 Session 安全性更⾼。如果要在 Cookie 中儲存⼀些敏感資訊,不要直接寫⼊ Cookie 中,最好能將 Cookie資訊加密然後使⽤到的時 候再去伺服器端解密

http1.0和http1.1

HTTP1.0預設使用短連線,客戶端和伺服器只能進行一次HTTP操作,從資源獲取連線建立到釋放,只能獲取一個web資源。

為了克服HTTP1.0的缺陷,減少建立和關閉連線的消耗和演示,HTTP1.1應運而生,支援長連線,客戶端可以進行多次HTTP操作,當任務執行完畢之後最終關閉連線,不在是請求一次關閉一次。

使用長連線的請求預設會在請求頭上加上

Connection:keep-alive

HTTP請求訊息

HTTP請求訊息包括請求行、若干請求頭、實體內容