重溫Servlet,爲Spring Framework和Spring BOOT之基礎

1、一個Servlet入門項目

使用STS4新建一個空的POM項目:html

(1)建立包com.edisonjava

(2)建立類ServletTest,繼承自HttpServlet,代碼以下:web

image.png 

3)使用mvn compile編譯數據庫

4)到本項目的target目錄下數組

image.png

拷貝classes目錄到tomcatwebapps\ROOT\WEB-INF目錄下:
瀏覽器

image.png

5)打開這個目錄下的web.xml,並增長以下幾行(陰影部分):緩存

image.png 

(6)tomcatbin目錄下,執行startup.battomcat

image.png 

(7)使用瀏覽器測試:安全

image.png 

2Servlet架構和依賴環境

image.png 

Java Servlet 是運行在 HTTP Server或應用服務器(例如:Tomcat上的程序,它是做爲來自 Web browser HTTP server應用程序之間的中間層。服務器

Servlet收集來自網頁表單的用戶輸入,呈現來自數據庫或者其餘源的記錄,還能夠動態建立網頁,這些功能和 CGICommon Gateway Interface,公共網關接口)程序相同

相比於 CGIServlet更容易開發,還有以下特色:

Servlet Web 服務器的地址空間內執行。

Servlet Java 編寫。

Java 安全管理器能保護Servlet

Java 類庫能支撐 Servlet

 

JAVA Web開發框架大部分都是創建在Servlet基礎之上的,好比StructsSpring MVC,前者的ActionServlet和後者的DispatcherServletServlet

Servlet是處理web請求的基本單元,而Filter則是圍繞着Servlet,用於在web請求被處理以前或者以後對web請求(Request)和應答(Response)修改,Filter工做機制以下圖:

image.png 

Servlet Filter 具備以下特色:

Filter能夠做用於Servlet以前、又能夠做用於Servlet以後。Spring Security做用於Servlet以前

FilterRequest到達Servlet以前,能夠直接將Response返回,此功能用於諸如在未登陸的狀況下直接向用戶展現登陸頁面這樣的功能。

多個Filter起做用時有前後順序。

 

Servlet依賴環境包括Web服務器(應用服務器、容器)、servlet規範、JSP規範。

Java Servlet 運行在帶有支持 Java Servlet 規範的Web服務器或者容器上,而Tomcat就是一種支持servlet容器功能的應用服務器

Servlet須要 javax.servlet  javax.servlet.http 支持。

Servlet必須符合Java Servlet 規範 JSP 規範,不一樣容器實現的規範版本不一樣

3Servlet主要功能和生命週期

Servlet用於替代CGI,所以具備CGI相似的功能:

獲取瀏覽器上傳的用戶數據,例如網頁上的 HTML 表單(也能夠是來自 applet 或自定義的 HTTP 客戶端程序的表單)。

獲取瀏覽器上傳的HTTP請求數據包括 cookies、媒體類型和瀏覽器能理解的壓縮格式等等。

處理這些上行數據並生成結果,包括訪問數據庫,執行 RMI CORBA 調用,調用 Web 服務。

下發用戶響應數據到瀏覽器,例如文本文件(HTML XMLJSON)、圖片、流媒體等。

下發 HTTP響應數據到瀏覽器包括返回文檔類型(例如 HTML),設置 cookies 和緩存參數,以及其餘相似的任務。

 

Servlet 生命週期從建立直到毀滅的整個過程,過程包括:

init () 方法初始化,只調用一次

service() 方法處理客戶端的請求,每收到一次請求,服務器新產生一個線程來處理

destroy() 方法: 終止,只調用一次

垃圾回收:JVM 的垃圾回收器負責最後的垃圾回收。

生命週期示意圖以下:

image.png 

 

service() 方法能夠調用的HTTP請求方法:

doGet() 方法

對應HTTP GET 請求來自於一個 URL 的正常請求,或者來自於一個未指定 METHOD HTML 表單

public void doGet(HttpServletRequest request,

                  HttpServletResponse response)

    throws ServletException, IOException {

    // Servlet 代碼}

doPost() 方法

對應HTTP POST 請求來自於一個特別指定了 METHOD POST HTML 表單

public void doPost(HttpServletRequest request,

                   HttpServletResponse response)

    throws ServletException, IOException {

    // Servlet 代碼}

 

4HTTPHTTPS協議介紹

HTTPHyperText Transfer Protocol超文本傳輸協議),是WWWWorld Wide Web,萬維網)的傳輸協議,是TCP/IP模型的應用層協議,負責Web瀏覽器和Web服務器之間傳輸超文本信息(Hypertext),超文本信息能夠描述超媒體( Hypermedia),而超媒體包括文本、圖形、視頻、音頻等多媒體(Multimedia)信息,這些信息以web頁面(Web Page)爲單位,他們之間經過超連接(Hyperlink)相互鏈接。

HTTP協議採用了請求/響應模型。客戶端向服務器發送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求數據。服務器以一個狀態行做爲響應,響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據。

image.png 

 HTTP1.0採用普通交互流程,屢次交互才能完成信息傳輸,以下

1Web瀏覽器鏈接到Web服務器
Web瀏覽器Web服務器的HTTP端口(默認爲80)創建一個TCP套接字鏈接。

2發送HTTP請求
經過TCP套接字,Web瀏覽器Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據組成。

3Web服務器接受請求並返回HTTP響應
Web服務器解析請求,定位請求資源。Web服務器將資源複本寫到TCP套接字,由Web瀏覽器讀取。一個響應由狀態行、響應頭部、空行和響應數據4部分組成。

4釋放鏈接TCP鏈接
鏈接模式爲close,則Web服務器主動關閉TCP鏈接,Web瀏覽器釋放TCP鏈接;鏈接模式爲keepalive,則該鏈接會保持一段時間,在該時間內能夠繼續接收請求;

5Web瀏覽器解析HTML內容
Web瀏覽器首先解析狀態行,查看代表請求是否成功的狀態代碼。而後解析每個響應頭,響應頭告知如下爲若干字節的HTML文檔和文檔的字符集。Web瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,並在Web瀏覽器窗口中顯示。

 

HTTP1.1採用持久鏈接(HTTP Persistent Connections),也稱爲 HTTP keep-alive HTTP connection reuse,只要任意一端沒有明確提出斷開鏈接,則保持TCP鏈接狀態,其交互流程以下:

image.png 

上圖的「客戶端」實際上就是Web瀏覽器,或者定製的特殊Web瀏覽器,上圖的「服務器」就是Web服務器,「創建TCP鏈接」包括三個子步驟,「斷開TCP鏈接」包括四個子步驟。

持久鏈接使得多數請求以管線化(pipelining)方式發送成爲可能,HTTP1.1支持管線化傳輸。管線化技術支持並行發送多個請求。以下圖:

image.png 

HTTPSHTTP基礎上增長了數字簽名和非對稱加解密功能,其交互圖以下:

image.png 

 

HTTP報文包括請求報文和響應報文兩大部分,其中請求報文由請求行(request line)、請求頭(header)、空行和請求體四個部分組成。而響應報文由狀態行、響應頭部、空行和響應體四個部分組成。下圖是一個具體HTTP報文例子:

image.png 

 

HTTP請求類型包括:

image.png 

 

HTTP狀態碼包括:

image.png 

 

 

image.pngspacer.gif 

image.png 

 image.png

HTTP/1.1種規定了47種首部字段(圖表參考《圖解HTTP》)

1通用首部字段

image.png 

2請求首部字段

image.png 

3響應首部字段

image.png 

4實體首部字段

image.png 

5其餘首部字段

CookieSet-CookieContent-DispositionConnectionKeep-AliveProxy-AuthenticateProxy-AuthorizationTrailerTETransfer-EncodingUpgrade etc...

 

5、在Java EE中測試Servlet

這裏提供GETPOST表單請求的例子,步驟以下:

(1)新建web項目

使用STS4建立Dynamic Web新項目:

image.png 

下一步以下:

image.png 

New Runtime」:

image.png 

 

選擇Tomcat7而後Next,再點擊Browse選擇tomcat安裝目錄:

image.png 

選擇目錄後回到先前的界面,而後再選擇JRE

image.png 

而後選擇兩次Next,以下:

image.png 

finish。到左邊的Project Explorer

image.png 

選中src,右鍵菜單new-->servlet,進入以下界面:

image.png 

填寫包和類名後,兩次next後:

image.png 

Finish。生成TestPostMethod.java文件,內容以下:

image.png 

修改doGet,以下:

image.png 

修改doPost,以下:

image.png 

image.png 

Project Explorerweb content目錄下新建目錄:HTML。而後,選中HTML,右鍵菜單new-->html file,彈出「New HTML File」窗口,在File Name中填寫:index.htm,以下:

image.png 

FinishIndex.html代碼以下:

image.png 

修改成:

image.png 

選中WEB-INF目錄,右鍵菜單new-->

image.png 

Next,以下:

image.png 

File Name中,輸入web.xml,點FinishWeb.xml內容爲:

image.png 

修改成:

image.png

 

(2)構建和測試

選中項目,右鍵菜單Run As-->Run on Server:

image.png 

Finish

 

這時候,STS4在右上角自動顯示首頁:

image.png 

在上面輸入:googlewww.google.com,點提交:

image.png 

 

返回後再下面選中物理,點「選擇學科」:

image.png 

 

過程當中遇到一個問題:

[SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:TestPost' did not find a matching property.

image.png 

解決:在STS4的右下角,選中Server,再選中Tomcat,以下圖:

image.png 

而後,右鍵菜單Open,在右上角窗口,把「Publish module contexts to separate XML files」打鉤,以下:

image.png 

關閉並保存。

 

6Servlet請求

Servlet請求類是javax.servlet.http.HttpServletRequest

每當Web瀏覽器請求一個頁面時,Web服務器就會產生一個新的request對象來表明這個請求。 request對象提供了一系列方法來獲取HTTP請求頭,包括表單數據,cookiesHTTP方法等等。

經常使用的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()
返回一個數組,包含客戶端發送該請求的全部的 Cookie 對象。

2

Enumeration getAttributeNames()
返回一個枚舉,包含提供給該請求可用的屬性名稱。

3

Enumeration getHeaderNames()
返回一個枚舉,包含在該請求中包含的全部的頭名。

4

Enumeration getParameterNames()
返回一個 String 對象的枚舉,包含在該請求中包含的參數的名稱。

5

HttpSession getSession()
返回與該請求關聯的當前 session 會話,或者若是請求沒有 session 會話,則建立一個。

6

HttpSession getSession(boolean create)
返回與該請求關聯的當前 HttpSession,或者若是沒有當前會話,且建立是真的,則返回一個新的 session 會話。

7

Locale getLocale()
基於 Accept-Language 頭,返回客戶端接受內容的首選的區域設置。

8

Object getAttribute(String name)
以對象形式返回已命名屬性的值,若是沒有給定名稱的屬性存在,則返回 null。

9

ServletInputStream getInputStream()
使用 ServletInputStream,以二進制數據形式檢索請求的主體。

10

String getAuthType()
返回用於保護 Servlet 的身份驗證方案的名稱,例如,"BASIC" 或 "SSL",若是JSP沒有受到保護則返回 null。

11

String getCharacterEncoding()
返回請求主體中使用的字符編碼的名稱。

12

String getContentType()
返回請求主體的 MIME 類型,若是不知道類型則返回 null。

13

String getContextPath()
返回指示請求上下文的請求 URI 部分。

14

String getHeader(String name)
以字符串形式返回指定的請求頭的值。

15

String getMethod()
返回請求的 HTTP 方法的名稱,例如,GET、POST 或 PUT。

16

String getParameter(String name)
以字符串形式返回請求參數的值,或者若是參數不存在則返回 null。

17

String getPathInfo()
當請求發出時,返回與客戶端發送的 URL 相關的任何額外的路徑信息。

18

String getProtocol()
返回請求協議的名稱和版本。

19

String getQueryString()
返回包含在路徑後的請求 URL 中的查詢字符串。

20

String getRemoteAddr()
返回發送請求的客戶端的互聯網協議(IP)地址。

21

String getRemoteHost()
返回發送請求的客戶端的徹底限定名稱。

22

String getRemoteUser()
若是用戶已經過身份驗證,則返回發出請求的登陸用戶,或者若是用戶未經過身份驗證,則返回 null。

23

String getRequestURI()
從協議名稱直到 HTTP 請求的第一行的查詢字符串中,返回該請求的 URL 的一部分。

24

String getRequestedSessionId()
返回由客戶端指定的 session 會話 ID。

25

String getServletPath()
返回調用 JSP 的請求的 URL 的一部分。

26

String[] getParameterValues(String name)
返回一個字符串對象的數組,包含全部給定的請求參數的值,若是參數不存在則返回 null。

27

boolean isSecure()
返回一個布爾值,指示請求是否使用安全通道,如 HTTPS。

28

int getContentLength()
以字節爲單位返回請求主體的長度,並提供輸入流,或者若是長度未知則返回 -1。

29

int getIntHeader(String name)
返回指定的請求頭的值爲一個 int 值。

30

int getServerPort()
返回接收到這個請求的端口號。

31

int getParameterMap()
將參數封裝成 Map 類型。

 

 

修改前面的servlet入門項目」,以下:

image.png 

測試:

image.png 

7Servlet應答

 Web服務器處理Servlet請求後向Web瀏覽器發送Servlet應答消息,設置HTTP狀態和向WEB瀏覽器發送數據,如CookieHTTP文件頭信息等。

經常使用的應答頭信息以下:

頭信息

描述

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)
爲 sendRedirect 方法中使用的指定的 URL 進行編碼,或者若是編碼不是必需的,則返回 URL 未改變。

2

String encodeURL(String url)
對包含 session 會話 ID 的指定 URL 進行編碼,或者若是編碼不是必需的,則返回 URL 未改變。

3

boolean containsHeader(String name)
返回一個布爾值,指示是否已經設置已命名的響應報頭。

4

boolean isCommitted()
返回一個布爾值,指示響應是否已經提交。

5

void addCookie(Cookie 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)
使用指定的重定向位置 URL 發送臨時重定向響應到客戶端。

15

void setBufferSize(int size)
爲響應主體設置首選的緩衝區大小。

16

void setCharacterEncoding(String charset)
設置被髮送到客戶端的響應的字符編碼(MIME 字符集)例如,UTF-8。

17

void setContentLength(int len)
設置在 HTTP Servlet 響應中的內容主體的長度,該方法設置 HTTP Content-Length 頭。

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入門項目」,以下:

image.png 

 

測試:

image.png

相關文章
相關標籤/搜索