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