1. 程式人生 > >JavaEE基礎(01):Servlet實現方式,生命週期執行過程

JavaEE基礎(01):Servlet實現方式,生命週期執行過程

本文原始碼:GitHub·點這裡 || GitEE·點這裡

一、Servlet簡介

Java編寫的伺服器端程式,具有獨立於平臺和協議的特性,主要功能在於互動式地瀏覽和生成資料,生成動態Web內容。使用Servlet,可以收集來自網頁表單的使用者輸入,呈現來自資料庫或者其他源的記錄,還可以動態建立網頁。

二、實現方式

1、繼承HttpServlet

  • API簡介

繼承自 GenericServlet. 遵守 HTTP協議實現,以設計模式的角度看,HttpServlet擔任抽象模板角色,模板方法:由service()方法擔任。基本方法:由doPost()、doGet()等方法擔任。service()方法流程,省略了部分判斷邏輯。該方法呼叫七個do方法中的一個或幾個,完成對客戶端請求的響應。這些do方法需要由HttpServlet的具體子類提供,這種API封裝是典型的模板方法模式。

  • 程式碼案例
public class ServletOneImpl extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("執行:doGet");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("執行:doPost");
    }
}

2、繼承GenericServlet

  • API 簡介

Servlet 介面和 ServletConfig 介面的實現類. 一個抽象類. 其中的 service 方法為抽象方法。

  • 程式碼案例
public class ServletTwoImpl extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse)
            throws ServletException, IOException {
        HttpServletResponse response = (HttpServletResponse)servletResponse ;
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("執行:service");
    }
}

3、實現Servlet介面

  • API 簡介

Servlet是一個介面,其中包含init、getServletConfig、service、getServletInfo、destroy幾個核心方法。

  • 程式碼案例
public class ServletThreeImpl implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        servletConfig.getServletName();
        System.out.println("init 被呼叫...");
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse)
            throws ServletException, IOException {
        System.out.println("ThreadId:"+Thread.currentThread().getId());
        System.out.println("service 被呼叫...");
        HttpServletResponse response = (HttpServletResponse)servletResponse ;
        response.getWriter().print("Servlet.Life");
    }
    @Override
    public void destroy() {
        System.out.println("destroy 被呼叫...");
    }
    @Override
    public ServletConfig getServletConfig() {
        System.out.println("getServletConfig 被呼叫...");
        return null;
    }
    @Override
    public String getServletInfo() {
        System.out.println("getServletInfo 被呼叫...");
        return null;
    }
}

三、生命週期

  • 載入和例項化

當Servlet容器啟動或客戶端傳送請求時,Servlet容器會查詢是否存在該Servlet例項,若存在,則直接讀取該例項響應請求;如果不存在,就建立一個Servlet例項(屬於單例設計模式)。load-on-startup 可以配置建立時序。

  • 初始化:init()

例項化後,Servlet容器將呼叫init方法一次,初始化當前 Servlet。

  • 服務:service()

初始化後,Servlet處於響應請求的就緒狀態。當接收到客戶端請求時,呼叫service()的方法處理客戶端請求,HttpServlet的service()方法會根據不同的請求 呼叫不同的模板方法。

  • 銷燬:destroy()

當Servlet容器關閉時,Servlet例項也隨時銷燬。關閉 Tomcat 服務時可以通過日誌列印看到該方法的執行。

四、執行配置

1、web.xml配置

<servlet>
    <servlet-name>servletOneImpl</servlet-name>
    <servlet-class>com.node01.servlet.impl.ServletOneImpl</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>servletOneImpl</servlet-name>
    <url-pattern>/servletOneImpl</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>servletTwoImpl</servlet-name>
    <servlet-class>com.node01.servlet.impl.ServletTwoImpl</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>servletTwoImpl</servlet-name>
    <url-pattern>/servletTwoImpl</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>servletThreeImpl</servlet-name>
    <servlet-class>com.node01.servlet.impl.ServletThreeImpl</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>servletThreeImpl</servlet-name>
    <url-pattern>/servletThreeImpl</url-pattern>
</servlet-mapping>

請求:http://localhost:6003/servletOneImpl 測試。

  • servlet-name:Servlet 註冊名稱。
  • servlet-class:Servlet 全路徑類名。
  • serlvet-mapping:同一個Servlet可以被對映到多個URL上。
  • url-pattern:Servlet 訪問的對映路徑。

2、執行緒池執行

觀察上述第三種Servlet實現方式的日誌列印:Thread.currentThread().getId());

ThreadId:32
ThreadId:33
ThreadId:32
ThreadId:31
ThreadId:32

這裡不難發現,Servlet以執行緒池的方式執行的。

五、原始碼地址

GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent

相關推薦

JavaEE基礎(01)Servlet實現方式生命週期執行過程

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、Servlet簡介 Java編寫的伺服器端程式,具有獨立於平臺和協議的特性,主要功能在於互動式地瀏覽和生成資料,生成動態Web內容。使用Servlet,可以收集來自網頁表單的使用者輸入,呈現來自資料庫或者其他源的記錄,還可以動態建立網頁。 二

django基礎-01軟件框架MVC框架MVT

應用 視圖 web開發 相互 del elf news go基礎 you 1. 軟件框架   一個公司是由公司中的各部部門來組成的,每一個部門擁有特定的職能,部門與部門之間通過相互的配合來完成讓公司運轉起來。   一個軟件框架是由其中各個軟件模塊組成的,每一個模塊都有特

Spring 框架基礎(01)核心元件總結基礎環境搭建

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、Spring框架 1、框架簡介 Spring是一個開源框架,框

JavaEE基礎(02)Servlet核心API用法詳解

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、核心API簡介 1、Servlet執行流程 Servlet是JavaWeb的三大元件之一(Servlet、Filter、Listener),它屬於動態資源。Servlet的作用是處理請求,伺服器會把接收到的請求交給Servlet來處理,在Se

JavaEE基礎(04)會話跟蹤技術Session和Cookie詳解

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、會話跟蹤 1、場景描述 比如登入某個購物網站,身份識別成功後,在網站下單,支付 等操作,這些操作中當前登入使用者資訊必須是共享的,這樣這些操作結果才能和登入使用者做關聯。 2、概念簡介 可以把會話理解為客戶端與伺服器之間的一次互動,在一次互動

JavaEE基礎(06)Servlet整合C3P0資料庫連線池

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、C3P0連線池 1、C3P0簡介 C3P0是一個開源的JDBC連線池,應用程式根據C3P0配置來初始化資料庫連線,可以自動回收空閒連線的功能。 2、核心依賴 <dependency> <groupId>mysq

Spring 框架基礎(05)事務管理機制實現方式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、Spring事務管理 1、基礎描述 Spring事務管理的本質就是封裝了資料庫對事務支援的操作,使用JDBC的事務管理機制,就是利用java.sql.Connection物件完成對事務的提交和回滾。 Connection conn = Drive

Go基礎系列Go實現工作池的兩種方式

worker pool簡介 worker pool其實就是執行緒池thread pool。對於go來說,直接使用的是goroutine而非執行緒,不過這裡仍然以執行緒來解釋執行緒池。 線上程池模型中,有2個佇列一個池子:任務佇列、已完成任務佇列和執行緒池。其中已完成任務佇列可能存在也可能不存在,依據實際需

Java設計模式(二)單例模式的5種實現方式以及在多執行緒環境下5種建立單例模式的效率

這段時間從頭溫習設計模式。記載下來,以便自己複習,也分享給大家。 package com.iter.devbox.singleton; /** * 餓漢式 * @author Shearer * */ public class SingletonDemo1 {

JavaEE基礎(03)Http請求詳解握手揮手流程簡介

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、Http協議簡介 1、概念說明 HTTP超文字傳輸協議,是用於從全球資訊網伺服器傳輸超文字到本地瀏覽器的傳送協議,基於TCP/IP通訊協議來傳遞資料:HTML檔案、圖片、查詢資料等。HTTP協議基於客戶端-服務端架構模式。瀏覽器作為HTTP客

Java併發程式設計(01)執行緒的建立方式狀態週期管理

> 本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/java-base-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/java-base-parent) # 一、併發程式設計簡介 ##

01第一次作業生成四則運算的小程序

例如 程序 個數 調試 校招 進行 http .cn 得到 對於這次的作業。 由於之前數據類型考慮錯誤,我之前認為隨機生成的運算數只是整數類型,經過加減後會產生分數的結果,並且沒對計算結果的產生的假分數進行轉化成真分數,於是對之前的代碼進行了重構。 關於前後兩次的變化:  

SSM-MyBatis-01IDEA的安裝永久註冊和簡單的MyBatis用例

code 程序 over cli 引用 support 路徑 div 其中 一,IDEA的安裝和永久註冊   1.安裝:     那到安裝包,下一步,選路徑,上面可以選操作系統64/32位,下面是程序的默認打開方式,可以不必勾選,也可以全選     路徑一定不包含中文,

Python裏面幾種排序算法的比較sorted的底層實現雖然我們知道sorted的實現方式但是

增長 歸並排序 sha __main__ 代碼 復雜 位置 好的 strong 算法與數據結構基礎 原文鏈接:http://note.youdao.com/noteshare?id=7b9757930ce3cc9e0a5e61e4d0aa9ea2&sub=2726FFA02

比特幣的機制1記賬的方式交易的語法比特幣指令碼P2PKH交易

原文連結:郭老師的備課資料 比特幣的共識機制生成了一個append-only的賬本,一旦交易在賬本中,再也不能更改。礦工——也即一些有較高計算力的節點,生成區塊,並且驗證交易是正確的(簽名是正確的、幣沒有重複花費)等。賬本和區塊鏈網路使得比特幣成為一種貨幣。在本文中,將介紹一些細節。

bootstrap 多選按鈕實現方式js,jQuery刪除陣列中指定元素

bootstrap有許多,非常漂亮的設計,不用自己苦惱於css 的使用。 bootstrap使用,實現多選方法: 1、使用bootstrap的表格標籤,表格內容為PHP返回前端資料, <table class="table table-hover table-bordered"

懸浮佈局的最差實現方式懸浮頭部實現viewpager巢狀滑動

給部分程式碼看個大概實現,繼承 linearLayout,自己處理滑動,自己計運算元佈局中第一個佈局為摺疊部分。 其實,用scrollview,將listview以及懸浮部分高度設定為螢幕高度,效果直接,省事,滑動體驗更好。巢狀佈局也沒有滑動衝突 public class Scrollabl

單例模式最好的單例實現方式靜態內部類的方式

單例模式的優點: 1.在記憶體中只有一個物件,節約記憶體 2.避免頻繁的建立和銷燬物件,可以提高效能 3.避免對共享資源的多重佔用 4.可以全域性訪問 適用場景: 1.需要頻繁例項化然後銷燬的物件 2.

Linux基礎01基本命令操作

linux的命令 幫助命令 man + COMMAND 按q退出(mini版沒有man這個命令) info + COMMAND 按q退出 COMMAND + -help 或者 --help pwd:列印當前工作目錄 cd 切換工作目錄 cd+新的路徑 ----切換到新的目錄下

lua中class的一種實現方式單例擴充

方式 tab 方法 span 實用 ble 核心 攔截 說我 先上代碼 1 local _class={} 2 3 function class(super,singleton) 4 local class_type={} 5