1. 程式人生 > >Servlet入門(一)

Servlet入門(一)

Servlet 生命週期

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

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

現在讓我們詳細討論生命週期的方法。

init() 方法

init 方法被設計成只調用一次。它在第一次建立 Servlet 時被呼叫,在後續每次使用者請求時不再呼叫。因此,它是用於一次性初始化,就像 Applet 的 init 方法一樣。

Servlet 創建於使用者第一次呼叫對應於該 Servlet 的 URL 時,但是您也可以指定 Servlet 在伺服器第一次啟動時被載入。

當用戶呼叫一個 Servlet 時,就會建立一個 Servlet 例項,每一個使用者請求都會產生一個新的執行緒,適當的時候移交給 doGet 或 doPost 方法。init() 方法簡單地建立或載入一些資料,這些資料將被用於 Servlet 的整個生命週期。

init 方法的定義如下:

public void init() throws ServletException {
  // 初始化程式碼...
}

service() 方法

service() 方法是執行實際任務的主要方法。Servlet 容器(即 Web 伺服器)呼叫 service() 方法來處理來自客戶端(瀏覽器)的請求,並把格式化的響應寫回給客戶端。

每次伺服器接收到一個 Servlet 請求時,伺服器會產生一個新的執行緒並呼叫服務。service() 方法檢查 HTTP 請求型別(GET、POST、PUT、DELETE 等),並在適當的時候呼叫 doGet、doPost、doPut,doDelete 等方法。

下面是該方法的特徵:

public void service(ServletRequest request, 
                    ServletResponse response) 
      throws ServletException, IOException{
}

service() 方法由容器呼叫,service 方法在適當的時候呼叫 doGet、doPost、doPut、doDelete 等方法。所以,您不用對 service() 方法做任何動作,您只需要根據來自客戶端的請求型別來重寫 doGet() 或 doPost() 即可。

doGet() 和 doPost() 方法是每次服務請求中最常用的方法。下面是這兩種方法的特徵。

doGet() 方法

GET 請求來自於一個 URL 的正常請求,或者來自於一個未指定 METHOD 的 HTML 表單,它由 doGet() 方法處理。

public void doGet(HttpServletRequest request,
                  HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 程式碼
}

doPost() 方法

POST 請求來自於一個特別指定了 METHOD 為 POST 的 HTML 表單,它由 doPost() 方法處理。

public void doPost(HttpServletRequest request,
                   HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 程式碼
}

destroy() 方法

destroy() 方法只會被呼叫一次,在 Servlet 生命週期結束時被呼叫。destroy() 方法可以讓您的 Servlet 關閉資料庫連線、停止後臺執行緒、把 Cookie 列表或點選計數器寫入到磁碟,並執行其他類似的清理活動。

在呼叫 destroy() 方法之後,servlet 物件被標記為垃圾回收。destroy 方法定義如下所示:

  public void destroy() {
    // 終止化程式碼...
  }

架構圖

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

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

Servlet 例項

Servlet 是服務 HTTP 請求並實現 javax.servlet.Servlet 介面的 Java 類。Web 應用程式開發人員通常編寫 Servlet 來擴充套件 javax.servlet.http.HttpServlet,並實現 Servlet 介面的抽象類專門用來處理 HTTP 請求。

Hello World 示例程式碼

下面是 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 部署

預設情況下,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 例項

GET 方法

GET 方法向頁面請求傳送已編碼的使用者資訊。頁面和已編碼的資訊中間用 ? 字元分隔,如下所示:

http://www.test.com/hello?key1=value1&key2=value2

GET 方法是預設的從瀏覽器向 Web 伺服器傳遞資訊的方法,它會產生一個很長的字串,出現在瀏覽器的位址列中。如果您要向伺服器傳遞的是密碼或其他的敏感資訊,請不要使用 GET 方法。GET 方法有大小限制:請求字串中最多隻能有 1024 個字元。

這些資訊使用 QUERY_STRING 頭傳遞,並可以通過 QUERY_STRING 環境變數訪問,Servlet 使用 doGet() 方法處理這種型別的請求。

POST 方法

另一個向後臺程式傳遞資訊的比較可靠的方法是 POST 方法。POST 方法打包資訊的方式與 GET 方法基本相同,但是 POST 方法不是把資訊作為 URL 中 ? 字元後的文字字串進行傳送,而是把這些資訊作為一個單獨的訊息。訊息以標準輸出的形式傳到後臺程式,您可以解析和使用這些標準輸出。Servlet 使用 doPost() 方法處理這種型別的請求。

使用 Servlet 讀取表單資料

Servlet 處理表單資料,這些資料會根據不同的情況使用不同的方法自動解析:

  • getParameter():您可以呼叫 request.getParameter() 方法來獲取表單引數的值。
  • getParameterValues():如果引數出現一次以上,則呼叫該方法,並返回多個值,例如複選框。
  • getParameterNames():如果您想要得到當前請求中的所有引數的完整列表,則呼叫該方法。

使用 URL 的 GET 方法例項

下面是一個簡單的 URL,將使用 GET 方法向 HelloForm 程式傳遞兩個值。

http://localhost:8080/TomcatTest/HelloForm?name=菜鳥教程&url=www.runoob.com

下面是處理 Web 瀏覽器輸入的 HelloForm.java Servlet 程式。我們將使用 getParameter() 方法,可以很容易地訪問傳遞的資訊:

package com.runoob.test;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloForm
 */
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request,
            
           

相關推薦

Servlet入門HTTP協議

前言        本章將和JQuery同步,開啟新的篇章,學習Servlet的相關知識! 方法 在講解之前,首先大家回顧一下MVC架構的內容以及層次關係: 顯示層(JSP、HTML、CSS、JS等):網頁頁面,使用者直接訪問

Servlet入門

Servlet 生命週期 Servlet 生命週期可被定義為從建立直到毀滅的整個過程。以下是 Servlet 遵循的過程: Servlet 通過呼叫 init () 方法進行初始化。 Servlet 呼叫 ser

python入門

html pre uic 程序 添加 -a 控制臺 命令 成了 第一步,我們先來安裝Python,博主選擇的版本是最新的3.4.2版本。windows下面的Python安裝一般是通過軟件安裝包安裝而不是命令行,所以我們首先要在Python的官方主頁上面下載最新的Python

數據庫入門

數據庫入門 數據庫軟件 java平臺 1.數據保存 數據保存在內存: 優點: 存取速度快 缺點: 數據不能永遠保存 數據保存在文件: 優點: 數據永遠保存 缺點:

HTML5入門—— 基本標簽&表格

詳細信息 樣式設置 定位 content 瀏覽器中 解釋 加載 郵箱 常用 一、HTML簡介 超文本標簽語言,即網頁的源碼。而瀏覽器就是翻譯解釋HTML源碼的工具。 二、HTML Head部分 <1>Head的作用

ServiceStack.OrmLite 入門

repo pan ssi database open() clas demo int() mas 軟件環境: Win7 x64 SP1 SQL Server 2008r2 Visual Studio 2017 Professional 目標:取出示例數據庫

磁盤及文件管理系統入門

fs 硬盤 uefi&gpt linux磁盤及文件系統管理初步目錄 1.磁盤及文件系統管理 2.機械磁盤結構 3.mknod命令 4.parted命令 5.GPT分區&UEFI 6.二進制單位Linux系統管理磁盤分區及文件系統管理RAIDLV

Docker入門

docker cgroup aufs unionfs dm md 一、虛擬化技術分類1.內核級別的虛擬化Xen或者Kvm [vm.user] [vm.kern].... //這種虛擬化技術隔離效果最好,但是性能消耗也高 =========== VMM ====== 硬件 vm的us

socket 網絡編程高速入門教你編寫基於UDP/TCP的服務client通信

unix fflush ins tracking ng- main ack ndt accept 由於UNIX和Win的socket大同小異,為了方便和大眾化,這裏先介紹Winsock編程。 socket 網絡編程的難點在入門的時候就是對基本函數的了解和使用,由於

Swift入門——基本的語法

應該 不支持 .text pre each abc add 語法 高精度 近期開始學習swift。把學習的過程和總結整理成一個系列。方便日後回想總結。 基本的語法 基礎語法 swift中每一行結束後不須要加分號。多個語句在同一行內須要用分好

IntelliJ IDEA的使用入門

servers dep exec file idea ont tle cat tex 問題1:Run/Debug Configurations 中點擊“+”號沒有tomcat server選項 解決方法:File--->Setting--->Build,Exec

jaspersoft studio 的初級入門

學習記錄 管理類 設置 準備 idt 開發 空白頁 conn 博客 前言 最近的工作涉及到企業的報表生成功能,於是就想用此篇博客來記錄我的學習歷程。進入Jasperreport項目的官網發現有一個軟件叫Jaspersoft studio的,它的版本也是6.3.1跟Jar包版

動態規劃入門

spa turn color and uil ott c++ erro 大數字 2017-09-01 11:29:43 writer:pprp 看sprout臺灣大學acm教學視頻的第一部分: 裏邊涉及到四道小例題 感覺很好就拿來寫了寫: 題意還有代碼說明都在代碼中: 1、

軟件工程財務知識入門 - 軟件工程常見的財務名詞

今後 工資 一個 產生 幫助 包含 狀況 進行 知識 1.入賬:入帳,就是所有收入和支出都應該記入企業的財務會計帳中,(有些企業不開發票的收入不入帳,沒取得正規發票的支出也不入帳)。 2.記賬:就是把一個企事業單位或者個人家庭發生的所有經濟業務運用一定的記賬方法在賬簿上記錄

Kotlin快速入門基礎

一個表 range fix font 有一個 get() nta 兼容 des Kotlin快速入門(一)基礎 Kotlin學習筆記,主要記錄與Java不同的地方。 1 基本類型 1.1 數字 1)數字沒有隱式擴寬轉換 val b: Byte = 1 // OK, 字面值

netty 入門

釋放資源 netty4 至少 執行 group 沒有 add 客戶端 imp netty Netty提供異步的、事件驅動的網絡應用程序框架和工具,用以快速開發高性能、高可靠性的網絡服務器和客戶端程序。更確切的講是一個組件,沒有那麽復雜。 例子 一 Discard服務器端

【轉】VBA 入門

文件的 方法 記錄 glob 數字 數據 list 目錄 處理 VBA語言的基礎認識 由 vietdung90 創建,最後一次修改 2016-10-18 【轉自W3CSCHOOL】 第一節:標識符 一、定義 標識符是一種標識變量、常量、過程、函數、類等語言構

Apache Spark大數據分析入門

做的 項目 persist fig shell命令 tutorial math 提高 welcom 摘要:Apache Spark的出現讓普通人也具備了大數據及實時數據分析能力。鑒於此,本文通過動手實戰操作演示帶領大家快速地入門學習Spark。本文是Apache Spark

Netty入門:零基礎“HelloWorld”詳細圖文步驟

-a 多線程 obj chan blog 接口文檔 syn 幫助 final 因為接下來的項目要用到netty,所以就了解一下這個程序,奈何網上的教程都是稍微有點基礎的,所以,就寫一篇對於netty零基礎的,順便也記錄一下。 先扔幾個參考學習的網頁: netty 官方

react 入門

需要 三個參數 create 直接 rip containe pan 參數 渲染 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8">