有關Servlet和JSP的梳理(一)
大二第一學期的時候有學JSP的課,但是因為在開學之前做過JSP的小項目,所以一個學期的課也沒聽,直到期末考試成績出來了,才回想JSP的內容還有多少記得,沒想到模模糊糊也記不起多少,趕緊回頭學回來。接下來是關於Servlet和JSP的梳理。
-------------------------------------------------------------------------------------------------------------------------------------------------
Servlet是一個Java程序,一個Servlet應用有一個或多個Servlet程序,而且JSP頁面也會被轉換和編譯成Servlet程序。
Servlet應用無法獨立運行,必須運行在Servlet容器中。Servlet容器將用戶的請求傳遞給Servlet應用,並將結果返回給用戶。由於大部分Servlet應用都包含多個JSP頁面,因此更準確地說是“Servlet/JSP應用”。
其中,Servlet API是開發Servlet的主要技術。而Servlet API有以下4個Java包:
Java包 |
包含的內容 |
javax.servlet |
定義Servlet和Servlet容器之間契約的類和接口 |
javax.servlet.http |
定義HTTP Servlet和Servlet容器之間契約的類和接口 |
javax.servlet.annotation |
標註Servlet、Filter、Listener的標註。它還被標註原件定義元數據 |
javax.servlet.descriptor |
包含提供程序化登陸web應用程序的配置信息的類型。 |
Servlet技術的核心是Servlet,它是所有Servlet類必須直接或間接實現的一個接口,而Servlet接口定義了Servlet與Servlet容器之間的契約。這個契約歸結起來就是,Servlet容器將Servlet類載入內存,並在Servlet實例上調用具體的方法。當用戶的請求使得Servlet容器調用Servlet的Service方法,會傳入一個ServletRequest實例和一個ServletResponse實例,其中,ServletRequest中封裝了當前的HTTP請求,而ServletResponse表示當前用戶的HTTP響應。對於每一個應用程序,Servlet容器還會創建一個ServletContext實例,這個對象中封裝了上下文(應用程序)的環境詳情。每個上下文只有一個ServletContext,而且每個Servlet實例都有一個配置的ServletConfig。
Servlet的生命周期方法:
Servlet容器的生命周期方法 |
作用 |
init |
該方法在Servlet第一次被請求的時候,Servlet就會調用這個方法,而後不再被調用,所以可以用這個方法進行初始化工作。調用這個方法時,Servlet容器會傳入一個ServletConfig。 |
Service |
每當請求Servlet時,Servlet容器就會調用這個方法。第一次請求Servlet時,Servlet容器調用init方法和Service方法。後續的請求將只調用Service方法。 |
destroy |
當要銷毀Servlet時,Servlet容器就會調用這個方法。一般會在這個方法中編寫清除代碼。 |
在介紹一個Servlet中另外兩個非生命周期的方法:
Servlet容器的非生命周期方法 |
作用 |
getServletInfo |
這個方法會返回Servlet的描述 |
getServletConfig |
這個方法會返回由Servlet容器傳給init方法的ServletConfig。 但是為了讓getServletConfig返回一個非null值,必須將傳給init方法的ServletConfig賦給一個類級變量。 |
-------------------------------------------------------------------------------------------------------------------------------------------------
接下來是Servlet的各類接口:
ServletRequest
接口 |
說明 |
ServletRequest |
對於每一個HTTP請求,Servlet容器都會創建一個ServletRequest實例,並將它傳給Servlet的Service方法。ServletRequest封裝了關於這個請求的信息。 |
常用的方法有:
方法 |
說明 |
public int getContentLength() |
返回請求主體的字節數。 |
public java.lang.String getContentType() |
返回請求主體的MIME類型。 |
public java.lang.String getParameter(java.lang.String name) |
返回指定請求參數的值 |
public java.lang.String getProtocol() |
返回這個HTTP請求的協議名稱和版本 |
ServletResponse
接口 |
說明 |
ServletResponse |
該接口表示一個Servlet響應。在調用Servlet的Service方法前,Servlet容器首先創建一個ServletResponse,並將它作為第二個參數傳給Service方法。ServletResponse隱藏了向瀏覽器發送響應的復雜過程。 |
常用的方法:
方法 |
說明 |
getWriter() |
返回了一個可以向客戶端發送文本的java.io.PrintWriter。默認情況下,PrintWriter對象使用ISO-8859-1編碼。 |
setContentType(“type”) |
設置響應的內容類型,並將”text/html”作為一個參數傳入。如果沒有設置相應內容類型,有些瀏覽器就會將HTML標簽顯示為普通文本。 |
ServletConfig
接口 |
說明 |
ServletConfig |
用於存儲關於Servlet的配置信息。 當Servlet容器初始化Servlet時,Servlet容器會給Servlet的init()方法傳入一個ServletConfig。ServletConfig封裝可以通過@WebServlet或描述符傳給Servlet的配置信息。 |
常用的方法:
方法 |
說明 |
java.lang.String getInitParameter(java,lang.String name) |
為了從Servlet內部獲取到初始參數的值,要在Servlet容器傳給Servlet的init方法的ServletConfig中調用getInitParameter方法。 |
java.util.Enumration<java.lang.String> getInitParameterNames() |
返回所有初始參數名稱的一個Enumeration。 |
String contactName = servletConfig.getInitParameter(“contactName”) |
獲取contactName參數值 |
ServletContext
接口 |
說明 |
ServletContext |
每個Web應用程序只有一個上下文,所以ServletContext可以存儲這個上下文,並且ServletContext還可以共享從應用程序中的所有資料處訪問到的信息,並且可以動態註冊Web對象,而且是用ServletContext內部的Map保存。 |
常用的方法:
方法 |
說明 |
getServletContext().getInitParameter(String name) |
獲取在項目下的web.xml中設置context的初始化參數 |
this.getServletContext().log(“測試”) |
在web.xml文件中,使用logger元素來設置日誌文件 |
getAttribute(String name)/get AttributeNames() |
獲取ServletContext中的屬性 |
setAttribute(String name, Object object) |
設置ServletContext中的屬性 |
removeAttribute(String name) |
移除ServletContext中的屬性 |
GenericServlet
接口 |
說明 |
GenericServlet |
GenericServlet實現了Servlet和ServletConfig接口。將init方法中的ServletConfig賦給一個類級變量,以便可以通過getServletConfig獲取,為Servlet接口中的所有方法提供默認的實現,而且提供包括ServletConfig中的方法。 |
Http Servlets
接口 |
說明 |
HttpServlet |
HttpServlet類覆蓋了javax.servlet.GenericServlet類。使用HttpServlet時,還要借助分別代表Servlet請求和Servlet響應的HttpServletRequest和HttpServletResponse對象。而HttpServlet與GenericServlet的差別在於,HttpServlet覆蓋的是doGet或者doPost方法,而不是Service方法,而且使用的是HttpServletRequest和HttpServletResponse,而不是ServletRequest和ServletResponse。 |
HttpServletRequest |
表示HTTP環境中的Servlet請求 |
HttpServletResponse |
表示HTTP環境中的Servlet響應 |
各個接口常用的方法如下:
接口 |
方法 |
說明 |
HttpServletRequest |
java.lang.String getContextPath() |
返回表示請求上下文的請求URI部分。 |
HttpServletRequest |
Cookie[] getCookies() |
返回一個Cookie對象的數組。 |
HttpServletRequest |
java.lang.String getHeader(java.lang.String name) |
返回指定HTTP標題的值。 |
HttpServletRequest |
java.lang.String getMethod() |
返回生成這個請求的HTTP方法名稱 |
HttpServletRequest |
java.lang.String getQueryString() |
返回請求URL中的查詢字符串。 |
HttpServletRequest |
HttpSession getSession() |
返回與這個請求相關的會話對象。如果沒有,將創建一個新的會話對象。 |
HttpServletRequest |
HttpSession getSession(Boolean create) |
返回與這個請求相關的繪畫對象,如果有,並且create參數為True,將創建一個新的會話對象。 |
HttpServletResponse |
void addCookie(Cookie cookie) |
給這個響應對象添加一個cookie。 |
HttpServletResponse |
void addHeader(java.lang.String name, java.lang.String value) |
給這個響應對象添加一個header。 |
HttpServletResponse |
void sendRedirect(java.lang.String location) |
發送一條響應碼,將瀏覽器跳轉到指定的位置。 |
-------------------------------------------------------------------------------------------------------------------------------------------------
當用戶提交HTML表單時,在表單元素中輸入的值就會被當作請求參數發送到服務器。HTML輸入域(文本域、隱藏域或者密碼域)或者文本區的值,會被當作字符串發送到服務器。空的輸入域或者文本區會發送空的字符串。
包含多個值的select元素發出一個字符串數組,可以通過ServletRequest.getParameterValues進行處理。
核查過的復選框會發送字符串"on"到服務器,未經核查的復選框則不向服務器發送任何內容,ServletRequest.getParameter(fieldName)返回null。
單選框將被選中按鈕的值發送到服務器。如果沒有選擇任何按鈕,將沒有任何內容被發送到服務器,並且ServletRequest.getParameter(fieldName)返會null。
如果一個表單中包含多個輸入同名的元素,那麽所有值都會被提交,並且必須利用ServletRequest.getParameterValues來獲取它們。ServletRequest.getParameter將只返回最後一個值。
有關Servlet和JSP的梳理(一)