Servlet概述

Yy_Gg發表於2019-03-27

Servlet概述

學號:201631062509

姓名:楊菓

 

1.Servlet 是什麼?

 

Java Servlet 是執行在 Web 伺服器或應用伺服器上的程式,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 伺服器上的資料庫或應用程式之間的中間層。

 

使用 Servlet,您可以收集來自網頁表單的使用者輸入,呈現來自資料庫或者其他源的記錄,還可以動態建立網頁。

 

Java Servlet 通常情況下與使用 CGI(Common Gateway Interface,公共閘道器介面)實現的程式可以達到異曲同工的效果。但是相比於 CGI,Servlet 有以下幾點優勢:

 

  • 效能明顯更好。
  • Servlet 在 Web 伺服器的地址空間內執行。這樣它就沒有必要再建立一個單獨的程式來處理每個客戶端請求。
  • Servlet 是獨立於平臺的,因為它們是用 Java 編寫的。
  • 伺服器上的 Java 安全管理器執行了一系列限制,以保護伺服器計算機上的資源。因此,Servlet 是可信的。
  • Java 類庫的全部功能對 Servlet 來說都是可用的。它可以通過 sockets 和 RMI 機制與 applets、資料庫或其他軟體進行互動。

 

2.Servlet 架構

 

下圖顯示了 Servlet 在 Web 應用程式中的位置。

 

Servlet 架構

 

3.Servlet 任務

 

Servlet 執行以下主要任務:

 

  • 讀取客戶端(瀏覽器)傳送的顯式的資料。這包括網頁上的 HTML 表單,或者也可以是來自 applet 或自定義的 HTTP 客戶端程式的表單。
  • 讀取客戶端(瀏覽器)傳送的隱式的 HTTP 請求資料。這包括 cookies、媒體型別和瀏覽器能理解的壓縮格式等等。
  • 處理資料並生成結果。這個過程可能需要訪問資料庫,執行 RMI 或 CORBA 呼叫,呼叫 Web 服務,或者直接計算得出對應的響應。
  • 傳送顯式的資料(即文件)到客戶端(瀏覽器)。該文件的格式可以是多種多樣的,包括文字檔案(HTML 或 XML)、二進位制檔案(GIF 影象)、Excel 等。
  • 傳送隱式的 HTTP 響應到客戶端(瀏覽器)。這包括告訴瀏覽器或其他客戶端被返回的文件型別(例如 HTML),設定 cookies 和快取引數,以及其他類似的任務。

 

4.Servlet 包

 

Java Servlet 是執行在帶有支援 Java Servlet 規範的直譯器的 web 伺服器上的 Java 類。

 

Servlet 可以使用 javax.servletjavax.servlet.http 包建立,它是 Java 企業版的標準組成部分,Java 企業版是支援大型開發專案的 Java 類庫的擴充套件版本。

 

這些類實現 Java Servlet 和 JSP 規範。在寫本教程的時候,二者相應的版本分別是 Java Servlet 2.5 和 JSP 2.1。

 

Java Servlet 就像任何其他的 Java 類一樣已經被建立和編譯。在您安裝 Servlet 包並把它們新增到您的計算機上的 Classpath 類路徑中之後,您就可以通過 JDK 的 Java 編譯器或任何其他編譯器來編譯 Servlet。

5.環境設定

已經在上一個作業中設定過環境,所以就不再闡述。

6.Servlet 生命週期

Servlet 生命週期可被定義為從建立直到毀滅的整個過程。以下是 Servlet 遵循的過程:

  • Servlet 通過呼叫 init () 方法進行初始化。
  • Servlet 呼叫 service() 方法來處理客戶端的請求。
  • Servlet 通過呼叫 destroy() 方法終止(結束)。
  • 最後,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的。

架構圖

下圖顯示了一個典型的 Servlet 生命週期方案。

  • 第一個到達伺服器的 HTTP 請求被委派到 Servlet 容器。
  • Servlet 容器在呼叫 service() 方法之前載入 Servlet。
  • 然後 Servlet 容器處理由多個執行緒產生的多個請求,每個執行緒執行一個單一的 Servlet 例項的 service() 方法。
Servlet 生命週期

7.工作原理

 

Tomcat容器—>Servlet容器—>Context容器

 

 

 

  所以,真正管理 Servlet 的容器是 Context 容器,一個 Context 對應一個 Web 工程(非使用者),新建一個servlet的時候,就會新建一個context的,同時載入它所需要的config,容器的配置屬性由應用的 web.xml 指定。tomcat是基於觀察者模式設計的,
與 Servlet 主動關聯的是三個類,分別是 ServletConfig、ServletContext 、ServletRequest 和 ServletResponse。這三個類都是通過容器傳遞給 Servlet 的。ServletConfig:獲取這個 Servlet 的一些配置屬性。ServletContext :交易場景就由 ServletContext 來描述,而定製的引數集合就由 ServletConfig 來描述。
啟動tomcat時,Servlet容器被建立,每一個web應用都會對應於一個context容器。客戶端發起了一次請求的時候,請求根據url地址指定的ip和埠號就能夠找到tomcat伺服器,然後根據後面工程名也能找到對應的web服務,此時建立一個執行緒,根據ServletRequest進行請求的發起,servlet只是作為控制器而存在,然後根據頁面的請求內容,查詢相應的服務,將結果通過servletResonse返回給客戶端。注意這裡是每個請求一個執行緒,不是每個使用者一個執行緒,容器並不關心是誰發起的請求。servlet一般只會存在一個例項,是單例模式設計的,如果容器使用了群集,即將容器佈置在多個JVM上,那麼每個JVM也只會有一個Servlet例項。

1、Web Client 向Servlet容器(Tomcat)發出Http請求

2、Servlet容器接收Web Client的請求

3、Servlet容器建立一個HttpRequest物件,將Web Client請求的資訊封裝到這個物件中

4、Servlet容器建立一個HttpResponse物件

5、Servlet容器呼叫HttpServlet物件的service方法,把HttpRequest物件與HttpResponse物件作為引數

     傳給 HttpServlet物件

6、HttpServlet呼叫HttpRequest物件的有關方法,獲取Http請求資訊

7、HttpServlet呼叫HttpResponse物件的有關方法,生成響應資料

8、Servlet容器把HttpServlet的響應結果傳給Web Client

8.例項

下面是 Servlet 輸出 Hello World 的示例原始碼:

 

// 匯入必需的 java 庫
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// 擴充套件 HttpServlet 類
public class HelloWorld extends HttpServlet {
 
  private String message;

  public void init() throws ServletException
  {
      // 執行必需的初始化
      message = "Hello World";
  }

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 設定響應內容型別
      response.setContentType("text/html");

      // 實際的邏輯是在這裡
      PrintWriter out = response.getWriter();
      out.println("<h1>" + message + "</h1>");
  }
  
  public void destroy()
  {
      // 什麼也不做
  }
}

 

編譯 Servlet

 

讓我們把上面的程式碼寫在 HelloWorld.java 檔案中,把這個檔案放在 C:\ServletDevel(在 Windows 上)或 /usr/ServletDevel(在 UNIX 上)中,還需要把這些目錄新增到 CLASSPATH 中。

 

進入 ServletDevel 目錄,並編譯 HelloWorld.java,如下所示:

 

$ javac HelloWorld.java

 

如果 Servlet 依賴於任何其他庫,必須在 CLASSPATH 中包含那些 JAR 檔案。在這裡,只包含了 servlet-api.jar JAR 檔案,因為沒有在 Hello World 程式中使用任何其他庫。

 

該命令列使用 Sun Microsystems Java 軟體開發工具包(JDK)內建的 javac 編譯器。為使該命令正常工作,您必須 PATH 環境變數中使用的 Java SDK 的位置。

 

如果一切順利,上面編譯會在同一目錄下生成 HelloWorld.class 檔案。

 

Servlet 部署

 

預設情況下,Servlet 應用程式位於路徑 <Tomcat-installation-directory>/webapps/ROOT 下,且類檔案放在 <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes 中。

 

有一個完全合格的類名稱 com.myorg.MyServlet,那麼這個 Servlet 類必須位於 WEB-INF/classes/com/myorg/MyServlet.class 中。

 

現在,把 HelloWorld.class 複製到 <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes 中,並在位於 <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/ 的 web.xml 檔案中建立以下條目:

 

<web-app>      
    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>HelloWorld</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/HelloWorld</url-pattern>
    </servlet-mapping>
</web-app>

 

上面的條目要被建立在 web.xml 檔案中的 <web-app>...</web-app> 標籤內。

 

使用 <Tomcat-installation-directory>\bin\startup.bat(在 Windows 上)或 <Tomcat-installation-directory>/bin/startup.sh(在 Linux/Solaris 等上)啟動 tomcat 伺服器,最後在瀏覽器的位址列中輸入 http://localhost:8080/HelloWorld

得到結果:

 

Servlet 例項

 

 

 

 

相關文章