URI
Uniform Resource Identifier 同一資源標識符
以特定語法標識一個資源的字符串
絕對URI:URI模式+模式特有部分
scheme:scheme-specific-part
scheme分為:
data
file本地文件系統
ftp
http
telnet
urn 統一資源名
scheme-specific-part為:
//authority/path?query
authority是負責解析后面路徑和查詢的授權機構
URI ? ?http://www.powells.com/cgi_bin/biblio?inkey=62-1565928709-0
有兩種類型的URI
URL ?Uniform Resource Locator ?統一資源定位符 ?指向Internet上位于某個位置的某個資源
URN ?Uniform Resource Name ?統一資源名 ?標識資源本身
處理映射于許多不同的位置或已經從一個網站移動到另一個網站的資源。
URN urn:namespace:resource_name
namespace為某個授權機構維護某類資源的集合名
resource_name取決于namespace
URL protocol://username@hostname:port/path/filename?query#fragment
protocol是模式的另一種叫法
username@是可選項
hostname是服務器名或IP
http協議port默認為80
path相對于文檔根目錄
filename指向某個文件
path/filename可省略,此時分3種case:
case1:傳回index.html
case2:文件和文件夾列表
case3:403 拒絕客戶請求
query一般用于http URL,可包含表單信息
fragment ?section ?Ref
如果遠程資源是HTML,則將其稱為anchor
如果遠程資源是XML,則將其稱為XPoint
javafaq.html中包含<A NAME="xtocid1902914">Comments</A>
http://www.cafeaulait.org/javafaq.html#xtoid1902914
從技術上將,包含fragment的是URL引用。
絕對URL ?absolute URL ?完整的URL
相對URL ?relative URL ?繼承所在文檔的協議、主機和路徑
http//www.ibibio.org/javafaq/javatutorial.html
javatutuorial.html中包含
<a href="javafaq.html"> ?繼承文檔協議、主機、路徑
<a href="/boutell/faq/www_faq.html"> ?繼承文檔協議、主機
優點:
(1)少打字
(2)允許一個文檔樹用多種協議來提供,如FTP和HTTP
(3)允許整個文檔樹從一個網站移到另一個網站而不破壞內部鏈接。
HTML
Web文檔使用的主要格式。
所基于的想法是通過含義而不是外觀進行設計。
用來標識文本的標簽不區分大小寫。
可以嵌套,但不能交叉。
以名=值對形式增加附加屬性。屬性值可以引在雙引號或單引號內。引號只有在值包含內嵌空格時才是必須的。
XML?
Extensible Markup Language 可擴展標記語言
一種語義語言,允許網頁作者創建所需的元素,而不是依賴于固有元素。
需要樣式表(stylesheet)來描述每一項應當如何進行顯示。
XML文檔可以有一個DTD(Document Type Definition,文檔類型定義),它可以向有效文檔加入額外的限制。
處理XML要比處理HTML容易的多。
HTTP
Web瀏覽器和Web服務器之間通信的標準協議。
指明客戶端如何與服務器端建立連接、客戶端如何從服務器請求數據,服務器如何相應請求,最后連接如何關閉。
使用TCP/IP協議傳輸數據。
每個從客戶端到服務器的請求都有四個步驟:
1、建立連接,默認通過80端口;
2、進行請求,請求以兩個回車換行對結束,在Java中是\r\n\r\n。
Accept告訴服務器可以處理的數據類型,但服務器常常忽略這一點
User-Agent告訴服務器使用的是何種瀏覽器,允許服務器發送為特定瀏覽器類型而優化的文件
除GET外,HEAD只獲取文件首部,通常用于檢查文件的修改日期,查看緩存是否有效;POST向服務器發送表單數據;PUT向服務器上傳資源;DELETE刪除服務器上的資源。
3、響應
以響應碼開頭,后面是元數據首部、空行和所請求的文檔或錯誤信息
200-299 成功
300-399 重定向
400-499 客戶端錯誤
500-599 服務器錯誤
4、關閉連接,客戶端或服務器兩者都可以關閉連接。
HTTP 1.1最大的改進是連接重用。
HTTP 1.0為每個請求都打開一個新的連接。
實際上,在一個典型的Web會話中,打開和關閉所有連接耗費的時間要超過傳輸數據耗費的時間,尤其是有很多小文檔的會話。
HTTP 1.1允許瀏覽器通過一個連接發送多個不同的請求;連接將在顯式關閉前保持打開狀態。
請求和響應都是異步的,瀏覽器不需要在發送第二個或第三個請求之前,等待第一個請求的響應。但是,客戶端先請求,服務器再響應這個基本模式是不變的。
HTTP 1.1請求包括了一個Host首部字段,這樣一個Web服務器可以很容易地提供不同URL的不同網站。服務器和瀏覽器可以交換壓縮文件和文檔的某一部分內容,這些都能減少網絡流量。
HTTP 1.1可以更好的與代理服務器協作,是HTTP 1.0的超集。
MIME媒體類型
MIME(Multipurpose Internet Mail Extensions)是通過Internet電子郵件發送多部分多媒體數據的開放標準。
MIME最初應用于電子郵件,但已經成為一種描述文件內容的技術,得到廣泛應用,可以使客戶軟件區分不同種類的數據。
例如,Web瀏覽器使用MIME來判斷文件是GIF圖片還是可打印的PostScript文件。
MIME支持100多種預定義的內容類型。內容類型分為兩級:類型/子類型。
如text/html ? ?image/gif ? ?
大多數系統會有一個簡單的文本文件,維護從MIME類型到用于處理此種數據的應用程序的映射,在Unix下是mime.types。
Web服務器使用MIME 標識發送的數據種類,Web客戶端使用MIME標識希望接受的數據種類。
大多數Web服務器和客戶端至少理解兩種MIME文本內容類型text/html ?text/plain,兩種圖片格式image/gif ?image/jpeg。
更新的瀏覽器還理解application/xml和其他幾種圖片格式。
Java依靠MIME類型為數據流選擇適當的內容。
與MIMI兼容的程序不需要理解所有數據類型,它只需識別哪些能處理哪些不能處理就可以了。
許多程序會使用各種助手程序來顯示本身無法理解的內容類型。
MIME允許使用前綴x-定義附加的非標準子類型。如application/x-tex
這些x-類型不能保證除創建程序之外的其他所有程序都能理解。事實上,兩個程序可能使用相同的x-類型表示不同的東西,或者使用不同的x-類型表示相同的東西。
服務器端程序
現在許多Web頁面不再由硬盤上的靜態文件提供,而是由服務器動態地生成,來達到用戶請求的需要。
這些內容可能從數據庫提取,或由程序計算得來。
在Java中,這樣的服務器端程序經常使用servlet或JSP(Java Server Pages)編寫。
也可使用其他語言,如C和Perl,或其他框架,如ASP和PHP。
稍微復雜的服務器端程序會處理HTML表單中的用戶輸入。
HTTP為Java applet及應用程序與遠程系統對話提供了一種易于理解、完全支持的標準方法,因此將介紹如何使用Java接收數據和向服務器發送數據。
Java程序與服務器對話還有其他方法,包括遠程方法調用(RMI)和SOAP。RMI很慢,SOAP相當復雜。
與之相比,HTTP成熟健壯,得到了多種平臺和Web服務器更好的支持,在Web開發社區中更易于被理解。
Web表單本質上只是一種方法,可以從用戶收集輸入,將這些輸入分成整齊的幾部分,再把這些部分傳遞給服務器上的某個程序。
兩個收集名稱和電子郵件消息的字段
當用戶按下“Submit Query”時,用戶在表單中輸入的值將發送回服務器
接收表單數據時運行的程序是/cgi/reg.pl
程序在FORM元素的ACTION屬性中指定,通常是相對URL
Web瀏覽器讀取用戶鍵入的數據,以一種簡單的方式進行編碼。
字段名與其值用等號(=)分隔
不同字段用與號(&)分隔
每個字段名和值都采用x-www-form-url-encoded形式;即所有非ASCII或保留字符都用百分號加該字符在某個字符集中的值的16進制數字所代替
空格用+號
這稱為查詢字符串(query string)。
將查詢字符串發送給服務器有兩種方法:GET和POST
GET將查詢字符串附加到要發送給服務器的URL后面。
POST發送正常首部,后面是一個空行(兩個回車換行對),然后發送查詢字符串。
每個表單都提供一個名和一個編碼的字符串值。
GET請求會在URL中包括所必需的信息,所以可以放入書簽、進行鏈接、用爬蟲索引、在Google中搜索等等。
POST請求的結果卻不能。
GET用于不承擔責任的動作;POST用于有所承諾的動作。
添加購物車應當用GET,下訂單應當用POST。
瀏覽器會在你回到一個使用POST的頁面時要求你的確認。重新發送數據可能會購買兩本一樣的書,并從信用卡中收費兩次。
如果是不向用戶有所保證的安全操作,所有這樣的操作都應當使用GET而不是POST。
只有承諾用戶的操作才應當使用POST。