使用STS4新建一個空的POM項目:html
(1)建立包com.edisonjava
(2)建立類ServletTest,繼承自HttpServlet,代碼以下:web
(3)使用mvn compile編譯數據庫
(4)到本項目的target目錄下數組
拷貝classes目錄到tomcat的webapps\ROOT\WEB-INF目錄下:
瀏覽器
(5)打開這個目錄下的web.xml,並增長以下幾行(陰影部分):緩存
(6)到tomcat的bin目錄下,執行startup.battomcat
(7)使用瀏覽器測試:安全
Java Servlet 是運行在 HTTP Server或應用服務器(例如:Tomcat)上的程序,它是做爲來自 Web browser和 HTTP server應用程序之間的中間層。服務器
Servlet收集來自網頁表單的用戶輸入,呈現來自數據庫或者其餘源的記錄,還能夠動態建立網頁,這些功能和 CGI(Common Gateway Interface,公共網關接口)程序相同。
相比於 CGI,Servlet更容易開發,還有以下特色:
l Servlet 在 Web 服務器的地址空間內執行。
l Servlet 用 Java 編寫。
l Java 安全管理器能保護Servlet。
l Java 類庫能支撐 Servlet。
JAVA Web開發框架大部分都是創建在Servlet基礎之上的,好比Structs和Spring MVC,前者的ActionServlet和後者的DispatcherServlet都是Servlet。
Servlet是處理web請求的基本單元,而Filter則是圍繞着Servlet,用於在web請求被處理以前或者以後對web請求(Request)和應答(Response)修改,Filter工做機制以下圖:
Servlet Filter 具備以下特色:
l Filter既能夠做用於Servlet以前、又能夠做用於Servlet以後。而Spring Security做用於Servlet以前
l Filter在Request到達Servlet以前,能夠直接將Response返回,此功能用於諸如在未登陸的狀況下直接向用戶展現登陸頁面這樣的功能。
l 多個Filter起做用時有前後順序。
Servlet依賴環境包括Web服務器(應用服務器、容器)、servlet規範、JSP規範。
Java Servlet 運行在帶有支持 Java Servlet 規範的Web服務器或者容器上,而Tomcat就是一種支持servlet容器功能的應用服務器。
Servlet須要 javax.servlet 和 javax.servlet.http 包支持。
Servlet必須符合Java Servlet 規範和 JSP 規範,不一樣容器實現的規範版本不一樣。
Servlet用於替代CGI,所以具備CGI相似的功能:
l 獲取瀏覽器上傳的用戶數據,例如網頁上的 HTML 表單(也能夠是來自 applet 或自定義的 HTTP 客戶端程序的表單)。
l 獲取瀏覽器上傳的HTTP請求數據,包括 cookies、媒體類型和瀏覽器能理解的壓縮格式等等。
l 處理這些上行數據並生成結果,包括訪問數據庫,執行 RMI 或 CORBA 調用,調用 Web 服務。
l 下發用戶響應數據到瀏覽器,例如文本文件(HTML 、XML、JSON)、圖片、流媒體等。
l 下發 HTTP響應數據到瀏覽器,包括返回文檔類型(例如 HTML),設置 cookies 和緩存參數,以及其餘相似的任務。
Servlet 生命週期是從建立直到毀滅的整個過程,過程包括:
l init () 方法:初始化,只調用一次。
l service() 方法:處理客戶端的請求,每收到一次請求,服務器新產生一個線程來處理。
l destroy() 方法: 終止,只調用一次。
l 垃圾回收:JVM 的垃圾回收器負責最後的垃圾回收。
生命週期示意圖以下:
service() 方法能夠調用的HTTP請求方法:
l doGet() 方法
對應HTTP GET 請求,來自於一個 URL 的正常請求,或者來自於一個未指定 METHOD 的 HTML 表單:
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代碼}
l doPost() 方法
對應HTTP POST 請求,來自於一個特別指定了 METHOD 爲 POST 的 HTML 表單:
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代碼}
HTTP(HyperText Transfer Protocol超文本傳輸協議),是WWW(World Wide Web,萬維網)的傳輸協議,是TCP/IP模型的應用層協議,負責Web瀏覽器和Web服務器之間傳輸超文本信息(Hypertext),超文本信息能夠描述超媒體( Hypermedia),而超媒體包括文本、圖形、視頻、音頻等多媒體(Multimedia)信息,這些信息以web頁面(Web Page)爲單位,他們之間經過超連接(Hyperlink)相互鏈接。
HTTP協議採用了請求/響應模型。客戶端向服務器發送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求數據。服務器以一個狀態行做爲響應,響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據。
HTTP1.0採用普通交互流程,屢次交互才能完成信息傳輸,以下:
(1)Web瀏覽器鏈接到Web服務器
Web瀏覽器與Web服務器的HTTP端口(默認爲80)創建一個TCP套接字鏈接。
(2)發送HTTP請求
經過TCP套接字,Web瀏覽器向Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據等組成。
(3)Web服務器接受請求並返回HTTP響應
Web服務器解析請求,定位請求資源。Web服務器將資源複本寫到TCP套接字,由Web瀏覽器讀取。一個響應由狀態行、響應頭部、空行和響應數據4部分組成。
(4)釋放鏈接TCP鏈接
若鏈接模式爲close,則Web服務器主動關閉TCP鏈接,Web瀏覽器釋放TCP鏈接;若鏈接模式爲keepalive,則該鏈接會保持一段時間,在該時間內能夠繼續接收請求;
(5)Web瀏覽器解析HTML內容
Web瀏覽器首先解析狀態行,查看代表請求是否成功的狀態代碼。而後解析每個響應頭,響應頭告知如下爲若干字節的HTML文檔和文檔的字符集。Web瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,並在Web瀏覽器窗口中顯示。
HTTP1.1採用持久鏈接(HTTP Persistent Connections),也稱爲 HTTP keep-alive 或 HTTP connection reuse,只要任意一端沒有明確提出斷開鏈接,則保持TCP鏈接狀態,其交互流程以下:
上圖的「客戶端」實際上就是Web瀏覽器,或者定製的特殊Web瀏覽器,上圖的「服務器」就是Web服務器,「創建TCP鏈接」包括三個子步驟,「斷開TCP鏈接」包括四個子步驟。
持久鏈接使得多數請求以管線化(pipelining)方式發送成爲可能,HTTP1.1支持管線化傳輸。管線化技術支持並行發送多個請求。以下圖:
HTTPS在HTTP基礎上增長了數字簽名和非對稱加解密功能,其交互圖以下:
HTTP報文包括請求報文和響應報文兩大部分,其中請求報文由請求行(request line)、請求頭(header)、空行和請求體四個部分組成。而響應報文由狀態行、響應頭部、空行和響應體四個部分組成。下圖是一個具體HTTP報文例子:
HTTP請求類型包括:
HTTP狀態碼包括:
在HTTP/1.1種規定了47種首部字段(圖表參考《圖解HTTP》):
(1)通用首部字段
(2)請求首部字段
(3)響應首部字段
(4)實體首部字段
(5)其餘首部字段
Cookie、Set-Cookie、Content-Disposition、Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade etc...
這裏提供GET和POST表單請求的例子,步驟以下:
(1)新建web項目
使用STS4建立Dynamic Web新項目:
下一步以下:
點「New Runtime」:
選擇Tomcat7,而後Next,再點擊Browse選擇tomcat安裝目錄:
選擇目錄後回到先前的界面,而後再選擇JRE:
而後選擇兩次Next,以下:
點finish。到左邊的Project Explorer:
選中src,右鍵菜單new-->servlet,進入以下界面:
填寫包和類名後,兩次next後:
點Finish。生成TestPostMethod.java文件,內容以下:
修改doGet,以下:
修改doPost,以下:
在Project Explorer的web content目錄下新建目錄:HTML。而後,選中HTML,右鍵菜單new-->html file,彈出「New HTML File」窗口,在File Name中填寫:index.htm,以下:
點Finish。Index.html代碼以下:
修改成:
選中WEB-INF目錄,右鍵菜單new-->
點Next,以下:
在File Name中,輸入web.xml,點Finish。Web.xml內容爲:
修改成:
(2)構建和測試
選中項目,右鍵菜單Run As-->Run on Server:
點Finish。
這時候,STS4在右上角自動顯示首頁:
在上面輸入:google和www.google.com,點提交:
返回後再下面選中物理,點「選擇學科」:
過程當中遇到一個問題:
[SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:TestPost' did not find a matching property.
解決:在STS4的右下角,選中Server,再選中Tomcat,以下圖:
而後,右鍵菜單Open,在右上角窗口,把「Publish module contexts to separate XML files」打鉤,以下:
關閉並保存。
Servlet請求類是javax.servlet.http.HttpServletRequest。
每當Web瀏覽器請求一個頁面時,Web服務器就會產生一個新的request對象來表明這個請求。 request對象提供了一系列方法來獲取HTTP請求頭,包括表單數據,cookies,HTTP方法等等。
經常使用的HTTP請求頭以下:
頭信息 |
描述 |
Accept |
這個頭信息指定瀏覽器或其餘客戶端能夠處理的 MIME 類型。值 image/png 或 image/jpeg 是最多見的兩種可能值。 |
Accept-Charset |
這個頭信息指定瀏覽器能夠用來顯示信息的字符集。例如 ISO-8859-1。 |
Accept-Encoding |
這個頭信息指定瀏覽器知道如何處理的編碼類型。值 gzip 或 compress 是最多見的兩種可能值。 |
Accept-Language |
這個頭信息指定客戶端的首選語言,在這種狀況下,Servlet 會產生多種語言的結果。例如,en、en-us、ru 等。 |
Authorization |
這個頭信息用於客戶端在訪問受密碼保護的網頁時識別本身的身份。 |
Connection |
這個頭信息指示客戶端是否能夠處理持久 HTTP 鏈接。持久鏈接容許客戶端或其餘瀏覽器經過單個請求來檢索多個文件。值 Keep-Alive 意味着使用了持續鏈接。 |
Content-Length |
這個頭信息只適用於 POST 請求,並給出 POST 數據的大小(以字節爲單位)。 |
Cookie |
這個頭信息把以前發送到瀏覽器的 cookies 返回到服務器。 |
Host |
這個頭信息指定原始的 URL 中的主機和端口。 |
If-Modified-Since |
這個頭信息表示只有當頁面在指定的日期後已更改時,客戶端想要的頁面。若是沒有新的結果可使用,服務器會發送一個 304 代碼,表示 Not Modified 頭信息。 |
If-Unmodified-Since |
這個頭信息是 If-Modified-Since 的對立面,它指定只有當文檔早於指定日期時,操做纔會成功。 |
Referer |
這個頭信息指示所指向的 Web 頁的 URL。例如,若是您在網頁 1,點擊一個連接到網頁 2,當瀏覽器請求網頁 2 時,網頁 1 的 URL 就會包含在 Referer 頭信息中。 |
User-Agent |
這個頭信息識別發出請求的瀏覽器或其餘客戶端,並能夠向不一樣類型的瀏覽器返回不一樣的內容。 |
Servlet請求類詳細狀況以下:
序號 |
方法 & 描述 |
1 |
Cookie[] getCookies() |
2 |
Enumeration getAttributeNames() |
3 |
Enumeration getHeaderNames() |
4 |
Enumeration getParameterNames() |
5 |
HttpSession getSession() |
6 |
HttpSession getSession(boolean create) |
7 |
Locale getLocale() |
8 |
Object getAttribute(String name) |
9 |
ServletInputStream getInputStream() |
10 |
String getAuthType() |
11 |
String getCharacterEncoding() |
12 |
String getContentType() |
13 |
String getContextPath() |
14 |
String getHeader(String name) |
15 |
String getMethod() |
16 |
String getParameter(String name) |
17 |
String getPathInfo() |
18 |
String getProtocol() |
19 |
String getQueryString() |
20 |
String getRemoteAddr() |
21 |
String getRemoteHost() |
22 |
String getRemoteUser() |
23 |
String getRequestURI() |
24 |
String getRequestedSessionId() |
25 |
String getServletPath() |
26 |
String[] getParameterValues(String name) |
27 |
boolean isSecure() |
28 |
int getContentLength() |
29 |
int getIntHeader(String name) |
30 |
int getServerPort() |
31 |
int getParameterMap() |
修改前面的「servlet入門項目」,以下:
測試:
Web服務器處理Servlet請求後向Web瀏覽器發送Servlet應答消息,設置HTTP狀態和向WEB瀏覽器發送數據,如Cookie、HTTP文件頭信息等。
經常使用的應答頭信息以下:
頭信息 |
描述 |
Allow |
這個頭信息指定服務器支持的請求方法(GET、POST 等)。 |
Cache-Control |
這個頭信息指定響應文檔在何種狀況下能夠安全地緩存。可能的值有:public、private 或 no-cache 等。Public 意味着文檔是可緩存,Private 意味着文檔是單個用戶私用文檔,且只能存儲在私有(非共享)緩存中,no-cache 意味着文檔不該被緩存。 |
Connection |
這個頭信息指示瀏覽器是否使用持久 HTTP 鏈接。值 close 指示瀏覽器不使用持久 HTTP 鏈接,值 keep-alive 意味着使用持久鏈接。 |
Content-Disposition |
這個頭信息可讓您請求瀏覽器要求用戶以給定名稱的文件把響應保存到磁盤。 |
Content-Encoding |
在傳輸過程當中,這個頭信息指定頁面的編碼方式。 |
Content-Language |
這個頭信息表示文檔編寫所使用的語言。例如,en、en-us、ru 等。 |
Content-Length |
這個頭信息指示響應中的字節數。只有當瀏覽器使用持久(keep-alive)HTTP 鏈接時才須要這些信息。 |
Content-Type |
這個頭信息提供了響應文檔的 MIME(Multipurpose Internet Mail Extension)類型。 |
Expires |
這個頭信息指定內容過時的時間,在這以後內容再也不被緩存。 |
Last-Modified |
這個頭信息指示文檔的最後修改時間。而後,客戶端能夠緩存文件,並在之後的請求中經過 If-Modified-Since 請求頭信息提供一個日期。 |
Location |
這個頭信息應被包含在全部的帶有狀態碼的響應中。在 300s 內,這會通知瀏覽器文檔的地址。瀏覽器會自動從新鏈接到這個位置,並獲取新的文檔。 |
Refresh |
這個頭信息指定瀏覽器應該如何儘快請求更新的頁面。您能夠指定頁面刷新的秒數。 |
Retry-After |
這個頭信息能夠與 503(Service Unavailable 服務不可用)響應配合使用,這會告訴客戶端多久就能夠重複它的請求。 |
Set-Cookie |
這個頭信息指定一個與頁面關聯的 cookie。 |
Servlet應答類是javax.servlet.http.HttpServletResponse類,而Response對象是HTTP應答類的一個實例。Web服務器處理Request對象後會建立Response對象。
Response對象定義了處理建立HTTP信息頭的接口。經過這個對象處理cookie,時間戳,HTTP狀態碼等等。
HTTP應答類的詳細狀況以下:
序號 |
方法 & 描述 |
1 |
String encodeRedirectURL(String url) |
2 |
String encodeURL(String url) |
3 |
boolean containsHeader(String name) |
4 |
boolean isCommitted() |
5 |
void addCookie(Cookie cookie) |
6 |
void addDateHeader(String name, long date) |
7 |
void addHeader(String name, String value) |
8 |
void addIntHeader(String name, int value) |
9 |
void flushBuffer() |
10 |
void reset() |
11 |
void resetBuffer() |
12 |
void sendError(int sc) |
13 |
void sendError(int sc, String msg) |
14 |
void sendRedirect(String location) |
15 |
void setBufferSize(int size) |
16 |
void setCharacterEncoding(String charset) |
17 |
void setContentLength(int len) |
18 |
void setContentType(String type) |
19 |
void setDateHeader(String name, long date) |
20 |
void setHeader(String name, String value) |
21 |
void setIntHeader(String name, int value) |
22 |
void setLocale(Locale loc) |
23 |
void setStatus(int sc) |
修改前面的「servlet入門項目」,以下:
測試: