Web的基本工作原理、HTTP協議和URL說明
Web工作原理
客戶端和Web服務器通過HTTP協議進行通信。Web服務器有是也叫HTTP服務器或Web容器。HTTP協議采用的是請求/響應模式。即客戶端發起HTTP請求,web服務器接收並解析處理HTTP請求,然後將HTTP響應發送給客戶端。
Web服務器
Web服務器指的是一個軟件程序,例如Apache Tomcat、Jboos等。它們的作用就是管理Web應用,當客戶端發出一個HTTP請求,相應的Web服務器接收HTTP請求後,調用相應的web應用處理請求,然後Web服務器再將響應結果返回給客戶端。
額外說明:服務器是一個硬件概念,指的是24小時不間斷運行的主機。簡單來說就是一臺電腦,裏面配置好了Web服務器和web應用。客戶端就可以通過URL地址向該服務器發出HTTP請求,訪問Web應用的資源文件了。
URL(Uniform Resource Location 統一資源定位器)
當客戶端(瀏覽器)輸入一個URL地址,就能接收到Web服務器發送過來的數據。這個過程就是在使用HTTP協議通信。
URL格式:protocol://[host.]domain[:port][/context][/resource][?query string] 其中只有協議和域名是必需的,其他都是可選的。
應用層協議://主機IP或域名:端口/資源所在路徑/文件名?請求參數
URL各參數的說明:
協議:采用何種方式進行通信。 IP和域名是一樣的,域名映射一個IP地址。作用就是標識一臺計算機地址,這裏就用於確定服務器地址。 端口:找到計算機後,通過端口確定一個計算機上的程序。例如Tomcat的默認端口就是8080 [/context][/resource]:Web應用中指定資源的路徑。 [?query string]:表單提交的數據作為請求參數,就是這裏的查詢字符串
以一個Tomcat配置的Web應用為例。瀏覽器輸入URL地址:http://localhost:8080/MyWebProgram/index.jsp?admin=abc&info=123456 【URL地址中,?之後是參數,多個參數之間用&分開】
瀏覽器發出一個訪問/MyWebProgram/index.jsp 資源的HTTP請求,8080端口的程序,即Web服務器(Tomcat)接收並解析HTTP請求後,將index.jsp作為響應主體發送給瀏覽器。這樣,一次請求/響應的通信過程就結束了。當然,這裏的index.jsp會先被編譯成Servlet,然後轉成HTML文檔才發送過去。關於Servlet/JSP這裏不詳述。
HTTP協議
HTTP通信不受限於特定的系統平臺和編程語言,因為HTTP協議嚴格規定了HTTP請求和HTTP響應的數據格式。所以HTTP客戶端(瀏覽器)和Web服務器遵守HTTP協議,那麽就可以看懂雙方的數據,從而順利地通信。
HTTP協議的請求格式和響應格式
HTTP請求格式由三部分組成:
請求方法、URI和HTTP協議版本
請求頭(Request Header):包含許多客戶端環境和請求正文的有用信息。
請求主體(正文)(Request Content):包含請求參數。它和請求頭之間用空格隔開,用於表示請求頭結束。
以一個Servlet為例,向該Servlet發起請求,獲取HTTP請求信息:
GET /TestServlet/testRequestHeaders HTTP/1.1
-------Request Header Infomation--------
accept---application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
accept-language---zh-CN
ua-cpu---AMD64
accept-encoding---gzip, deflate
user-agent---Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
host---localhost:8089
connection---Keep-Alive
這個例子描述了HTTP請求包含那些信息。這裏采用的GET請求方法。關於各類請求方法的區別,後面會說到。 本例的Servlet代碼如下:
@WebServlet(urlPatterns= {"/testRequestHeaders"} , name="requestHeaderTest") public class RequestFormat extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter pw = resp.getWriter(); resp.setContentType("text/html"); resp.setCharacterEncoding("UTF-8"); pw.write("<html><head></head><body>"); //HTTP請求首行部分 pw.write(req.getMethod() + req.getRequestURI() + req.getProtocol() + "<br>"); //HTTP請求頭 pw.println("-------Request Header Infomation--------<br>"); Enumeration<String> headers = req.getHeaderNames(); //獲取所有請求頭的名稱 while(headers.hasMoreElements()) { String header = (String)headers.nextElement(); pw.write(header + "---" + req.getHeader(header) + "<br>"); } pw.write("</body></html>"); } }
HTTP請求方法
HTTP請求方法有七種,最常用的當屬GET和POST方法,關於另外5種這裏不介紹了,因為不常用。
GET方式:
POST方式:
HTTP響應格式,由三部分組成:
HTTP協議版本 、狀態代碼和描述
響應頭(Response Header)
響應主體/內容(Response Content)
這裏的響應主體是HTML文檔。大部分情況下都是HTML文檔作為響應,前面的Servlet例子中,生成的HTML文檔就是響應主體,由Web服務器發送給客戶端(瀏覽器)。但有時候響應主體不是HTML文檔,例如是一個DOC文檔,那麽瀏覽器就可能會借助本機的WORD程序來打開。如果是一個rar壓縮文檔,那麽就會下載該文檔。所以根據不同的響應內容類型,瀏覽器會采用不同的方式。要設置響應內容類型,Servlet中調用:response.setContextType()。該方法很重要,熟記!
Web的基本工作原理、HTTP協議和URL說明