Servlet入門到入土——生命週期

Servlet入門到入土——生命週期

通過本篇博客您將學到如下知識:Servlet生命週期、客戶端HTTP請求、編寫過濾器、

生命週期

  • 加載Servlet。當Tomcat第一次訪問Servlet的時候,Tomcat會負責創建Servlet的實例
  • 初始化。當Servlet被實例化後,Tomcat會調用init()方法初始化這個對象
  • 處理服務。當瀏覽器訪問Servlet的時候,Servlet 會調用service()方法處理請求
  • 銷燬。當Tomcat關閉時或者檢測到Servlet要從Tomcat刪除的時候會自動調用destroy()方法,讓該實例釋放掉所佔的資源。一個Servlet如果長時間不被使用的話,也會被Tomcat自動銷燬
  • 卸載。當Servlet調用完destroy()方法後,等待垃圾回收。如果有需要再次使用這個Servlet,會重新調用init()方法進行初始化操作

​ 簡單來說:只要訪問Servlet,service()就會被調用。init()只有第一次訪問Servlet的時候纔會被調用。destroy()只有在Tomcat關閉的時候纔會被調用。

init()方法

  • 只能調用一次,在第一次創建servlet時被調用

  • Servlet創建於用於第一次調用該Servlet的URL時,也可以是指定Servlet在服務器第一次啓動時被加載

  • 當用戶公用一個Servlet時,就會創建一個Servlet實例,每一個用戶請求都會產生一個新的線程,適當的時候移交給doGet或者doPost方法。

  • 定義

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

servlet()方法

  • 其是執行實際任務的主要方法。
  • Servlet容器(Web服務器)調用servlet()方法來處理來自客戶端的請求,並把格式化的響應寫回給客戶端
  • 每次服務器接收到一個Servlet請求時,服務器都會產生一個新的線程並調用服務。Service()方法會檢查HTTP的請求類型(Get、Post、Put、DELETE等),然後在合適的時候調用相應的方法

下面是該方法的特徵:

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

doGet()方法

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

doPost()方法

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

destroy()方法

  • 也是隻會調用一次,在Servlet生命週期結束時被調用。
  • 可以讓Servlet關閉數據庫連接,停止後臺線程,把Cookie列表或點擊計數器寫到磁盤中,並執行其他類似的清理活動

客戶端HTTP請求

  • 可以使用方法在Servlet程序中讀取HTTP頭,這些方法通過 HttpServletRequest 對象可用
  • 使用 getHeaderNames() 方法讀取 HTTP 頭信息。該方法返回一個枚舉,包含與當前的 HTTP 請求相關的頭信息。
  • 我們可以以標準方式循環枚舉,使用 hasMoreElements() 方法來確定何時停止,使用 nextElement() 方法來獲取每個參數的名稱。

Http狀態碼

  • 方法:
    • public void setStatus ( int statusCode ):該方法設置一個任意的狀態碼。setStatus 方法接受一個 int(狀態碼)作爲參數。如果您的響應包含了一個特殊的狀態碼和文檔,請確保在使用 PrintWriter 實際返回任何內容之前調用 setStatus。
    • public void sendRedirect(String url)
      該方法生成一個 302 響應,連同一個帶有新文檔 URL 的 Location 頭。
    • public void sendError(int code, String message)
      該方法發送一個狀態碼(通常爲 404),連同一個在 HTML 文檔內部自動格式化併發送到客戶端的短消息。

編寫過濾器

  • Servlet過濾器作用:可以動態地攔截請求和響應,以變換或使用包含在請求或響應中的信息。
    • 在客戶端的請求訪問後端資源之前,攔截這些請求
    • 在服務器的響應發送到客戶端之前,處理這些響應
  • 過濾器通過Web部署描述符中的xml標籤來聲明,然後映射到Servlet或者URL模式。當Web容器啓動Web應用時,會在聲明的每一個過濾器創建一個實例
  • Filter的執行順序與它在web.xml配置文件中的配置順序一致,一般把Filter配置在所有Servlet之前

FilterConfig使用

  • xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">


    <filter>
        <filter-name>LogFilter</filter-name>
        <filter-class>LogfiLtertest</filter-class>
        <init-param>
            <param-name>Site</param-name>
            <param-value>冢狐</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>LogFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>demo</servlet-name>
        <servlet-class>demo</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>

</web-app>
  • Servlet過濾器實例
/**
 * Created with IntelliJ IDEA
 * Description:
 * Author: sun mingzhi
 * Date:  2019/10/30 15:41
 * Company: Inspur
 */
import javax.servlet.*;
import java.util.*;

//實現 Filter 類
public class LogfiLtertest implements Filter  {
    public void  init(FilterConfig config) throws ServletException {
        // 獲取初始化參數
        String site = config.getInitParameter("Site");

        // 輸出初始化參數
        System.out.println("網站名稱sdas: " + site);
    }
    public void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {

        // 輸出站點名稱
        System.out.println("站點網址:https://blog.csdn.net/issunmingzhi");

        // 把請求傳回過濾鏈
        chain.doFilter(request,response);
    }
    public void destroy( ){
        /* 在 Filter 實例被 Web 容器從服務移除之前調用 */
    }
}

效果圖:

在這裏插入圖片描述

  • web.xml配置各節點說明
    • 指定一個過濾器。
      • <filter-name>用於爲過濾器指定一個名字,該元素的內容不能爲空。
      • <filter-class>元素用於指定過濾器的完整的限定類名。
      • <init-param>元素用於爲過濾器指定初始化參數,它的子元素<param-name>指定參數的名字,<param-value>指定參數的值。
      • 在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數。
    • 元素用於設置一個 Filter 所負責攔截的資源。一個Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源訪問的請求路徑
      • <filter-name>子元素用於設置filter的註冊名稱。該值必須是在<filter>元素中聲明過的過濾器的名字
      • <url-pattern>設置 filter 所攔截的請求路徑(過濾器關聯的URL樣式)
    • <servlet-name>指定過濾器所攔截的Servlet名稱。
    • <dispatcher>指定過濾器所攔截的資源被 Servlet 容器調用的方式,可以是REQUEST,INCLUDE,FORWARDERROR之一,默認REQUEST。用戶可以設置多個<dispatcher>子元素用來指定 Filter 對資源的多種調用方式進行攔截。
    • 子元素可以設置的值及其意義
      • REQUEST:當用戶直接訪問頁面時,Web容器將會調用過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問時,那麼該過濾器就不會被調用。
      • INCLUDE:如果目標資源是通過RequestDispatcher的include()方法訪問時,那麼該過濾器將被調用。除此之外,該過濾器不會被調用。
      • FORWARD:如果目標資源是通過RequestDispatcher的forward()方法訪問時,那麼該過濾器將被調用,除此之外,該過濾器不會被調用。
      • ERROR:如果目標資源是通過聲明式異常處理機制調用時,那麼該過濾器將被調用。除此之外,過濾器不會被調用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章