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文件可以引入多個約束文件,但是,由於約束文件中的元素或屬性都是自定義的。當兩個不同的文件使用相同的元素名時,就會發生命名衝突。
解決命名衝突的方法一般有:
-
使用字首來避免命名衝突
<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>
-
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、Title
和 Author
與名稱空間 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 - III
和 Sherlock Holmes - I
的元素 Book
、 Title
和 Author
與名稱空間http://www.library.com
關聯, Sherlock Holmes - II
的元素 purchase、 Title
和 Author
與名稱空間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知識用到的儘管不多,但是我希望學習過XML後,能對xml文件出現的地方有所見解。比如說spring配置檔案,我能知道xmlns:xsi
、xmlns:tx
、xmlns: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請求訊息包括請求行、若干請求頭、實體內容。