Servlet 入門教程
總結 《Servlet、JSP 和 Spring MVC 初學指南》 一書。
1. HTTP 協議
HTTP 第一個版本是0.9,之後是HTTP1.0,現在是HTTP1.1,Web 服務器7x24 不間斷運行,並等待HTTP客戶端(瀏覽器)來連接並請求資源。由客戶端發起請求,服務器不會主動連接客戶端。
1.1 URL 和 URI 的區別
URL = host 地址 + URI,如 http://example.com/test/index.html,host 地址是http://example.com,URI 則是 /test/index.html。可以理解爲URL是在互聯中請求的地址,URI 則是資源路徑。
1.2 HTTP 請求
一個HTTP請求包含三部分內容:
①. 方法-URI-協議/版本
②. 請求頭信息
③. 請求正文
如下爲一個具體的示例:
POST example/default.jsp HTTP/1.1
Accept: text/plain; text/html
Accept-Language: en-us
Connection: Keep-Alive
…
lastName=Blanks&firstName=Mike
請求的第一行即是方法-URI-協議/版本,請求方法爲post,URI 爲 /example/default.jsp,協議是HTTP,版本是1.1 。HTTP 1.1 協議規定了7種方法,一般常用的是get和post,URI 定義了一個互聯網資源,通常解析爲服務器根目錄的相對路徑(例如 在tomcat 的 webapps 會部署項目),因此通常用/符號開頭,另外URL 是 URI的一個具體類型(後續的servlet的request中,有兩種方法分別可以獲取請求的uri 和 url)。
HTTP請求頭所包含的信息包含關於客戶端環境和實體內容等非常有用的信息。例如,瀏覽器所設置的語言實體,內容長度,內容類型等,每個header 用回車/換行(CRLF)分隔。
HTTP請求頭和請求正文用個空行分隔,HTTP 服務器根據此判斷請求正文的起始位置。
1.3 HTTP 響應
同HTTP請求一樣,HTTP響應包含三部分
①. 協議-狀態碼-描述
②. 響應頭信息
③. 響應正文
響應頭信息和請求頭信息一樣,響應正文和響應頭之間也是用一個空行分隔。
附:請求頭中的MIME 類型,MIME 類型即是指文件類型,在請求頭和響應頭的 Content-Type 中。
MIME 百度百科解釋:MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型。是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。多用於指定一些客戶端自定義的文件名,以及一些媒體文件打開方式。它是一個互聯網標準,擴展了電子郵件標準,常見的MIME類型:
超文本標記語言文本 .html,.html text/html
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
GIF圖形 .gif image/gif
JPEG圖形 .ipeg,.jpg image/jpeg
au聲音文件 .au audio/basic
MIDI音樂文件 mid,.midi audio/midi,audio/x-midi
RealAudio音樂文件 .ra, .ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
用jmeter 或者 postman 工具發送http 請求有時需要設置Content-Type,才能請求成功。
2 Servlet
2.1 Servlet 接口中的方法
Servlet 技術的核心是Servlet,它是所有Servlet 必須直接或間接實現的一個接口,它有5個方法,其中三個是生命週期方法,另外兩個是獲取Servlet 信息。
2.1.1 生命週期相關方法
- init 方法:當Servlet 第一次被請求時,調用該方法,做一些初始化工作,調用這個方法時,Servlet 容器會傳入一個 ServletConfig,一般來說會將ServletConfig 賦給一個累計變量,這個變量可以直接通過Servlet 類來訪問。
- service 方法:每當請求Servlet 時,Servlet 容器就會調用這個方法。
- destroy 方法:銷燬Servlet 時會調用該方法。
2.1.2 非生命週期相關方法
- getServletInfo 方法:返回Servlet 的描述,可以返回有意義的信息。 getServletConfig 方法:這個方法會返回由Servlet
- 容器傳給init方法的ServletConfig,但是爲了讓該方法返回一個非null值,必須將init方法的ServletConfig賦給一個類變量。
2.2 ServletRequest
對於一個Servlet 請求,Servlet 容器都會創建一個ServletRequest 實例,並將它傳給Servlet的service 方法,ServletRequest的一些方法:
- getContentLength(): 返回請求主題的字節數,int類型;
- getContentType(): 返回請求主題的MIME類型;
- getParameter(id): 返回請求的參數,是比較常用的方法,通過參數名來獲取參數,還有類似的getParameters、getParameterMap、getParameterValues 獲取表單域名、值以及查詢字符串。
2.3 ServletResponse
在調用 service 方法前,servlet 容器會先創建一個 ServletResponse 對象,並作爲第二個參數傳給service方法。ServletResponse 比較常用的2個方法是 getWriter 方法,向客戶端發送文本,getOutputStream 用於發送二進制數據。在發送文本前要先設置內容類型,爲防止出現中文亂碼,還要設置字符編碼,如:
response.setContentType("text/html; charset = utf-8");
2.4 ServletConfig
對於每一個應用程序,Servlet 容器還會創建一個ServletContext實例,這個對象封裝了上下文的應用詳情,每個上下文只有一個ServletContext,每一個 Servlet實例也都有一個封裝Servlet配置的ServletConfig。
當 Servlet 容器初始化Servlet 時,容器會給init方法傳入一個ServletConfig ,ServletConfig 的封裝可以通過@WebServlet 或者部署描述符傳給Servlet 的配置信息,這樣傳入的每一條信息都叫一個初始參數,由key-value 組成,可以在ServleConfig通過調用getInitParameter 獲得,例如:
@WebServlet(name = "ServletConfigDemoServlet",
urlPatterns = {
"/servletconfigdemo" },
initParams = {
@WebInitParam(name="admin", value = "xcc"),
@WebInitParam(name="email", value = "[email protected]")
})
public class ServletConfigDemoServlet implements Servlet {
private static final long serialVersionUID = 1L;
private transient ServletConfig servletConfig;
初始參數 name 的值可以定義爲任意需要的值。
2.5 ServletContext
ServletContext 表示Servlet應用程序上下文,每個Servlet只有一個ServletContext,在一個應用程序部署到分佈式環境中,每個java 虛擬機上的web應用都會有一個ServletContext 對象,通過在ServletConfig中調用getServletContext方法可以獲得ServletContext對象,有了ServletContext,就可以共享從應用程序的所有資料處訪問到的信息,並且可以動態註冊web對象。
2.6 HttpServlet
HttpServlet 繼承至GenericServlet 類,GenericServlet 是實現了Servlet的一個抽象類,複寫了Servlet的所有方法,並且新增了有關http method 的幾個方法,如常用的doGet 和 doPost 方法,平常開發中經常使用的是HttpServlet,相應的請求中傳遞的參數爲HttpServletRequest 和 HttpServletResponse。