Servlet相關(guān)知識

1 什么是Servlet?

Servlet是運(yùn)行在Web服務(wù)器上的Java程序,作為來自Web瀏覽器或者其他HTTP客戶端的請求與HTTP服務(wù)器上的數(shù)據(jù)庫和應(yīng)用程序之間的中間層。
Servlet在服務(wù)器端只要完成以下任務(wù):
(1)獲取客戶端瀏覽器通過HTML表單提交的數(shù)據(jù)及相關(guān)信息。
(2)創(chuàng)建并返回對客戶端的動態(tài)響應(yīng)頁面。
(3)訪問服務(wù)器端資源,如文件、數(shù)據(jù)庫。
(4)為JSP頁面準(zhǔn)備動態(tài)數(shù)據(jù),與JSP一起協(xié)作創(chuàng)建響應(yīng)頁面。

2 Servlet的生命周期

Servlet的生命周期主要由3個過程組成:
(1)init()方法:服務(wù)器初始化。首次創(chuàng)建Servlet時才會調(diào)用init()方法。要注意的是,init方法用于初始化,而不是創(chuàng)建。
(2)service()方法:初始化完畢,Servlet對象調(diào)用該方法響應(yīng)客戶的請求。對于每次請求,Servlet引擎都會調(diào)用該方法。該方法聲明如下:

public void service(ServletRequest request, ServletResponse response)

其中,request和response對象有Servlet容器創(chuàng)建并傳遞給service方法,service方法根據(jù)HTTP的請求類型,調(diào)用相應(yīng)的doGet()或doPost()方法。Service方法可以被調(diào)用多次。
(3)destroy()方法:銷毀Servlet對象。

3 Servlet的技術(shù)特點(diǎn):

3.1 有效性

相比傳統(tǒng)的CGI程序,Servlet更加有效。主要有兩點(diǎn):
(1)傳統(tǒng)CGI對于每一項(xiàng)請求都會啟動新進(jìn)程,而Servlet只是使用Java線程來處理每一項(xiàng)請求,Servlet的開銷較小。
(2)傳統(tǒng)CGI程序完成請求的處理工作時,就會終止程序,而Servlet在完成響應(yīng)后仍然保留在內(nèi)存在中,因此可以在請求之間存儲任意復(fù)雜的數(shù)據(jù)。

3.2 方便性

Servlet包含擴(kuò)展基礎(chǔ)結(jié)構(gòu),能夠自動對HTML表單數(shù)據(jù)進(jìn)行分析和解碼、讀取和設(shè)置HTTP頭、處理C歐凱而、跟蹤會話以及實(shí)現(xiàn)許多其他類似的高級功能。

3.3 功能強(qiáng)大性

Servlet支持幾種常規(guī)CGI難以或無法實(shí)現(xiàn)的功能。例如,直接與Web服務(wù)器對話;多個Servlet之間能共享數(shù)據(jù);Servlet還可以保留不同請求的信息。

3.4 可移植性

3.5 安全性

3.6 便宜

4 Servlet和JSP的區(qū)別

(1)編程方式不同。Servlet是按照J(rèn)ava規(guī)范編寫的Java程序,JSP是按照Web規(guī)范編寫的腳本語言。
(2)編譯方式不同。Servlet每次修改后需要重新編譯才能運(yùn)行,JSP被JSP容器編譯為Servlet文件。
(3)運(yùn)行速度不同,由于JSP要被編譯成Servlet,所以Servlet被JSP快。
(4)作用不同。JSP 是在Servlet的基礎(chǔ)上推出的新技術(shù),但JSP更注重頁面的表示,而Servlet則更加注重業(yè)務(wù)邏輯的實(shí)現(xiàn)。

5 Servlet部署

部署描述符文件(web.xml)可配置Servlet的參數(shù),它是Java EE程序的重要組成部分,其主要功能如下:
(1)用于Servlet和Web應(yīng)用程序的初始化。
(2)Servlet/JSP定義。在Web應(yīng)用程序中的每個Servlet和預(yù)編譯的JSP文件都應(yīng)在部署描述符文件中定義。
(3)MIME類型定義。
(4)安全控制??梢允褂貌渴鹈枋龇募刂茖?yīng)用程序的訪問。
一個部署描述符文件的例子:

<?xml version="1.0" encoding="UTF-8"?>     
<web-app  
        version="3.0"  
        xmlns="http://java.sun.com/xml/ns/javaee"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  

<servlet>
    <!-- 指定servlet的名稱 -->
    <servlet-name>FirstServlet</servlet-name>
    <!-- 指定servlet編譯生成的.class文件的相對路徑,區(qū)分大小寫 -->
    <servlet-class>servlet.FirstServlet</servlet-class>
</servlet>   

<!-- 在解析到<url-pattern>中的路徑請求時,由<servlet-name>指定的servlet來處理;
    <servlet-mapping>用于對<servlet>中指定的servlet映射路徑 -->
<servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>

</web-app> 

6 重定向與轉(zhuǎn)發(fā)

重定向的功能是將用戶從當(dāng)前頁面或者Servlet重定向到另外一個JSP頁面或者Servlet;轉(zhuǎn)發(fā)的功能是將用戶對當(dāng)前JSP頁面或者Servlet對象的請求轉(zhuǎn)發(fā)給另外一個JSP頁面或者Servlet對象。在Servlet類中可以使用HttpServletResponse類的重定向方法sendRedirect(),以及RequestDispatcher類的轉(zhuǎn)發(fā)方法forward()。盡管兩者都能讓瀏覽器獲得另外一個URL所指向的的資源,但兩者的內(nèi)部運(yùn)行機(jī)制有很大的區(qū)別:
(1)forward()只能講將請求轉(zhuǎn)發(fā)給同一個Web應(yīng)用中的組件;而sendRedirect()不僅可以重定向到當(dāng)前應(yīng)用程序中的其他資源,還可以重定向到同一個站點(diǎn)上的其他應(yīng)用程序中的資源,甚至是使用絕對URL重定向到其他站點(diǎn)的資源。對于相對URL中的“/”,在sendRedirect中表示整個Web站點(diǎn)的根目錄,如:http://127.0.0.1/ ,而forward中則表示當(dāng)前應(yīng)用程序的根目錄:如:http://127.0.0.1/test
(2)調(diào)用sendRedirect()方法結(jié)束后,瀏覽器顯示URL會變成重定向的目標(biāo)URL;而forward()會保持原地址不變。
(3)使用sendRedirect的時候,瀏覽器向目的URL發(fā)送一次請求,
目的URL使用sendRedirect響應(yīng),返回新的URL地址,然后瀏覽器再次向新的URL發(fā)送請求,新的URL再返回response到瀏覽器,期間瀏覽器和服務(wù)器端完成了兩次請求響應(yīng);使用forward的時候,瀏覽器向目的URL發(fā)送請求,目的URL向該請求發(fā)送到新的URL,最后由目的URL返回response到瀏覽器,期間瀏覽器和服務(wù)器只完成了一次請求響應(yīng)。
(4)無論是forward還是sendRedirect,在調(diào)用之前,都不能有內(nèi)容已經(jīng)被實(shí)際輸出到客戶端,如果緩沖區(qū)已經(jīng)有了一些內(nèi)容,這些內(nèi)容將被從緩沖區(qū)中清除。

7 Servlet編程接口

7.1 與Servlet實(shí)現(xiàn)相關(guān)的接口

7.1.1 Servlet接口

該接口是所有Sevlet類都必須直接或間接實(shí)現(xiàn)的接口,它包含以下方法:
(1)public void init(ServletConfig config):用來初始化Servlet。
(2)pubic void service(ServletRequest request, ServletResponse response):處理傳來的請求,是運(yùn)行應(yīng)用程序邏輯的入口點(diǎn)。
(3)public void destroy():當(dāng)所有線程結(jié)束時,調(diào)用此方法,釋放Servlet所占資源。
(4)public ServletConfig getServletConfig():返回在init()方法執(zhí)行時傳送給Servlet的ServletConfig對象。
(5)public String getServletInfo():返回一個String類型的對象,包含Servlet信息,如作者、版本號等。

7.1.2 GenericServlet類

GenericServlet類提供了對Servlet接口的基本實(shí)現(xiàn),它是一個抽象類,它的子類需要實(shí)現(xiàn)service方法。

public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serialiable

除了實(shí)現(xiàn)覆蓋了接口中的方法外,GenericServlet類還包括一些方法:
(1)public void init():用來初始化Servlet,可重寫的便捷方法,不必重寫init(ServletConfig config),只要重寫該方法即可,init(ServletConfig config)將會調(diào)用該方法。
(2)public void log(String message):把Servlet的名稱和message參數(shù)寫入到日志中。
(3)public void log(String message, Throwable t):記錄Servlet的名稱和消息,包括對Throwable異常的跟蹤信息。

7.1.3 HttpServlet類

HttpServlet類是針對使用HTTP的Web服務(wù)器的Servlet類,提供了Servlet的HTTP實(shí)現(xiàn),是Servlet類的擴(kuò)展。HttpServlet繼承了GenericServlet類,是一個抽象類,但是并沒有抽象方法。
HttpServlet類包含以下方法:
(1)protected void doGet(HttpServletRequest request, HttpServletResponse response):處理HTTP get請求。
(2)protected void doPost(HttpServletRequest request, HttpServletResponse response):處理HTTP post請求。
(3)protected void doPut(HttpServletRequest request, HttpServletResponse response):處理HTTP put請求。
(4)protected void doDelete(HttpServletRequest request, HttpServletResponse response):處理HTTP delete請求。
(5)long getLastModified(HttpServletRequest request):返回一個以毫秒為單位的時間,是Servlet上一次被修改以來的時間。默認(rèn)返回一個負(fù)數(shù)(-1),表示修改時間未知。

7.2 與ServletConfig配置相關(guān)的接口

ServletConfig接口代表了Servlet的配置。由Servlet容器建立的ServletConfig獨(dú)享,用于初始化期間向Servlet傳遞信息。Servlet的配置包括Servlet的名字、Servlet的初始化參數(shù)和Servlet上下文。主要有以下方法:
(1)public String getServletName():返回一個在Servlet的部署描述符中指定給Servlet的名字。如果Servlet沒有定義這個名字,則返回Servlet類的名字。
(2)ServletContext getServletContext():返回與執(zhí)行的Servlet相聯(lián)系的ServletContext的應(yīng)用。
(3)Enumeration getInitParameterNames():返回Servlet初始化參數(shù)名稱列表。如果沒有定義初始化參數(shù),則返回一個空的枚舉集合。
(4)public String getInitParameter(String name):返回參數(shù)指定的初始化參數(shù)值,若不存在則返回null。

7.3 與Servlet異常相關(guān)的接口

7.3.1 ServletException類

ServletException是一個通用的異常類,可以被init()、service()、destroy()方法拋出。

7.3.2 UnavailableException類

7.4 與請求和響應(yīng)相關(guān)的接口

7.4.1 HttpServletRequest 接口

該接口的聲明如下:

public interface HttpServletRequest extends ServletRequest

該接口包括以下方法:
(1)getCookies()
(2)getSession():如果沒有給客戶端分配Session,則返回null。
(3)getSession(boolean create):返回和客戶端關(guān)聯(lián)的Session,如果create為true且沒有給客戶端分配Session,則創(chuàng)建一個新的Session并返回;如果create為false且沒有給客戶端分配Session,則返回null。
(4)getParameter(String name)
(5)getParameterValues(String name):返回請求中名為name的參數(shù)值,這個值往往是checkbox或者是select控件提交的,獲取的值是一個String數(shù)值。

7.4.2 HttpServletResponse接口

該接口的聲明如下:

public interface HttpServletResponse extends ServletResponse

該接口包括以下方法:
(1)addCookies()
(2)encodeURL(String URL):使用URL和一個session Id重寫這個URL
(3)sendRedirect(String location)
(4)setContentType(String type):設(shè)置相應(yīng)的MIME類型
(5)setCharacterEncoding(String charset):設(shè)置響應(yīng)的字符編碼類型

7.5 會話管理

HttpSession接口被Servlet引擎用來實(shí)現(xiàn)HTTP客戶端和HTTP會話兩者之間的關(guān)聯(lián)。Session用來在無狀態(tài)的HTTP下越過多個請求頁面來維持狀態(tài)和識別用戶。使用Session的過程如下:
(1)使用HttpServletRequest中的getSession方法得到或者創(chuàng)建新的Session。
(2)使用HttpSession.setAttribute(name, value)方法來向Session中寫入信息。
(3)使用HttpSession.getAttribute(name)來讀取Session中一個變量值,要注意的是,讀取出來的值的類型為Object,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換才能使用。
(4)關(guān)閉Session??梢哉{(diào)用session.invalidate()方法關(guān)閉Session,但這并不是必須的,應(yīng)為Servlet引擎會在一段時間之后自動關(guān)閉Session。

7.6 Servlet上下文相關(guān)

該接口的常用方法有:
(1)getAttribute(String name)
(2)setAttribute(String name, Object obj)
(3)removeAttribute(String name)

參考:《JSP程序設(shè)計技術(shù)教程(第2版)》 張志鋒、甘勇、黃敏等編著

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Servlet學(xué)習(xí)的大綱 servlet概念及相關(guān)接口簡介 servet 執(zhí)行過程 servlet映射路徑 缺省s...
    奮斗的老王閱讀 1,286評論 1 51
  • 簡介 Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務(wù)程序或服務(wù)連接器,用...
    寒橋閱讀 2,375評論 0 10
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,628評論 18 399
  • 一 servlet概述 狹義的Servlet指javax.servlet包中的一個接口,而廣義的Servlet則是...
    靜慎獨(dú)閱讀 584評論 0 0
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,762評論 11 349

友情鏈接更多精彩內(nèi)容