您好,登錄后才能下訂單哦!
使用STS4新建一個空的POM項目:
(1)創建包com.edison
(2)創建類ServletTest,繼承自HttpServlet,代碼如下:
?
(3)使用mvn compile編譯
(4)到本項目的target目錄下
拷貝classes目錄到tomcat的webapps\ROOT\WEB-INF目錄下:
(5)打開這個目錄下的web.xml,并增加如下幾行(陰影部分):
?
(6)到tomcat的bin目錄下,執行startup.bat
?
(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狀態碼包括:
?
?
代碼 | 消息 | 描述 |
100 | Continue | 只有請求的一部分已經被服務器接收,但只要它沒有被拒絕,客戶端應繼續該請求。 |
101 | Switching Protocols | 服務器切換協議。 |
200 | OK | 請求成功。 |
201 | Created | 該請求是完整的,并創建一個新的資源。 |
202 | Accepted | 該請求被接受處理,但是該處理是不完整的。 |
203 | Non-authoritative Information | |
204 | No Content | |
205 | Reset Content | |
206 | Partial Content | |
300 | Multiple Choices | 鏈接列表。用戶可以選擇一個鏈接,進入到該位置。最多五個地址。 |
301 | Moved Permanently | 所請求的頁面已經轉移到一個新的 URL。 |
302 | Found | 所請求的頁面已經臨時轉移到一個新的 URL。 |
303 | See Other | 所請求的頁面可以在另一個不同的 URL 下被找到。 |
304 | Not Modified | |
305 | Use Proxy | |
306 | Unused | 在以前的版本中使用該代碼。現在已不再使用它,但代碼仍被保留。 |
307 | Temporary Redirect | 所請求的頁面已經臨時轉移到一個新的 URL。 |
400 | Bad Request | 服務器不理解請求。 |
401 | Unauthorized | 所請求的頁面需要用戶名和密碼。 |
402 | Payment Required | 您還不能使用該代碼。 |
403 | Forbidden | 禁止訪問所請求的頁面。 |
404 | Not Found | 服務器無法找到所請求的頁面。. |
405 | Method Not Allowed | 在請求中指定的方法是不允許的。 |
406 | Not Acceptable | 服務器只生成一個不被客戶端接受的響應。 |
407 | Proxy Authentication Required | 在請求送達之前,您必須使用代理服務器的驗證。 |
408 | Request Timeout | 請求需要的時間比服務器能夠等待的時間長,超時。 |
409 | Conflict | 請求因為沖突無法完成。 |
410 | Gone | 所請求的頁面不再可用。 |
411 | Length Required | "Content-Length" 未定義。服務器無法處理客戶端發送的不帶 Content-Length 的請求信息。 |
412 | Precondition Failed | 請求中給出的先決條件被服務器評估為 false。 |
413 | Request Entity Too Large | 服務器不接受該請求,因為請求實體過大。 |
414 | Request-url Too Long | 服務器不接受該請求,因為 URL 太長。當您轉換一個 "post" 請求為一個帶有長的查詢信息的 "get" 請求時發生。 |
415 | Unsupported Media Type | 服務器不接受該請求,因為媒體類型不被支持。 |
417 | Expectation Failed | |
500 | Internal Server Error | 未完成的請求。服務器遇到了一個意外的情況。 |
501 | Not Implemented | 未完成的請求。服務器不支持所需的功能。 |
502 | Bad Gateway | 未完成的請求。服務器從上游服務器收到無效響應。 |
503 | Service Unavailable | 未完成的請求。服務器暫時超載或死機。 |
504 | Gateway Timeout | 網關超時。 |
505 | HTTP Version Not Supported | 服務器不支持"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入門項目”,如下:
?
?
測試:
?
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。