Java中Servlet的生命周期詳解
Web基礎(chǔ)和HTTP協(xié)議
┌─────────┐
┌─────────┐ │?????????│
│O ???????│ ├─────────┤
├─────────┤ │?????????│
│ │ ├─────────┤
│ │ │?????????│
└─────────┘ └─────────┘
│ request 1 │
│─────────────────────>│
│ request 2 │
│─────────────────────>│
│ response 1 │
│<─────────────────────│
│ request 3 │
│─────────────────────>│
│ response 3 │
│<─────────────────────│
│ response 2 │
│<─────────────────────│
▼ ▼我們注意到HTTP協(xié)議是一個請求-響應(yīng)協(xié)議,它總是發(fā)送一個請求,然后接收一個響應(yīng)。能不能一次性發(fā)送多個請求,然后再接收多個響應(yīng)呢?HTTP 2.0可以支持瀏覽器同時發(fā)出多個請求,但每個請求需要唯一標識,服務(wù)器可以不按請求的順序返回多個響應(yīng),由瀏覽器自己把收到的響應(yīng)和請求對應(yīng)起來。可見,HTTP 2.0進一步提高了傳輸效率,因為瀏覽器發(fā)出一個請求后,不必等待響應(yīng),就可以繼續(xù)發(fā)下一個請求。
HTTP 3.0為了進一步提高速度,將拋棄TCP協(xié)議,改為使用無需創(chuàng)建連接的UDP協(xié)議,目前HTTP 3.0仍然處于實驗推廣階段。
什么是Servlet
在JavaEE平臺上,處理TCP連接,解析HTTP協(xié)議這些底層工作統(tǒng)統(tǒng)扔給現(xiàn)成的Web服務(wù)器去做,我們只需要把自己的應(yīng)用程序跑在Web服務(wù)器上。為了實現(xiàn)這一目的,JavaEE提供了Servlet API,我們使用Servlet API編寫自己的Servlet來處理HTTP請求,Web服務(wù)器實現(xiàn)Servlet API接口,
實現(xiàn)底層功能.
// WebServlet注解表示這是一個Servlet,并映射到地址 hello.do
@WebServlet(urlPatterns = "/hello.do")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 設(shè)置響應(yīng)類型:
resp.setContentType("text/html");
// 獲取輸出流:
PrintWriter pw = resp.getWriter();
// 寫入響應(yīng):
pw.write("<h1>Hello, world!</h1>");
// 最后不要忘記flush強制輸出:
pw.flush();
}
}一個Servlet總是繼承自HttpServlet,然后覆寫doGet()或doPost()方法。注意到doGet()方法傳入了HttpServletRequest和HttpServletResponse兩個對象,分別代表HTTP請求和響應(yīng)。我們使用Servlet API時,并不直接與底層TCP交互,也不需要解析HTTP協(xié)議,因為HttpServletRequest和HttpServletResponse就已經(jīng)封裝好了請求和響應(yīng)。以發(fā)送響應(yīng)為例,我們只需要設(shè)置正確的響應(yīng)類型,然后獲取PrintWriter,寫入響應(yīng)即可。
而這樣的一個項目最終會打包成一個*.war文件,運行這個文件,需要使用支持ServletAPI的Web容器(Web服務(wù)器)。
因此,我們首先要找一個支持Servlet API的Web服務(wù)器。
常用的服務(wù)器有:
- Tomcat:由Apache開發(fā)的開源免費服務(wù)器;
- Jetty:由Eclipse開發(fā)的開源免費服務(wù)器;
- GlassFish:一個開源的全功能JavaEE服務(wù)器。
Servlet的生命周期
在通過一個URL路徑發(fā)起對一個Servlet請求的過程中,其本質(zhì)是在調(diào)用執(zhí)行Servlet實例的doXXX()方法。該Servlet實例創(chuàng)建和使用的過程,被稱為Servlet的生命周期。整個生命周期包括:實例化、初始化、服務(wù)、銷毀。
- 實例化:根據(jù)
Servlet請求的路徑(例如:home.do),查找該Servlet的實例。如果實例不存在,則通過調(diào)用構(gòu)造方法,完成Servlet實例的創(chuàng)建。 - 初始化:通過該
Servlet的實例,調(diào)用init()方法,執(zhí)行初始化的邏輯。 - 服務(wù):通過該
Servlet的實例,調(diào)用service()方法,如果子類沒有重寫該方法,則調(diào)用HttpServlet父類的service()方法,在父類的該方法中進行請求方式的判斷,如果是GET請求,則調(diào)用doGet()方法;如果是POST請求,則調(diào)用doPost()方法;
如果子類重寫doXXX()方法,則調(diào)用子類重寫后的doXXX()方法;
如果子類沒有重寫doXXX()方法,則調(diào)用父類的doXXX()方法,在父類的方法實現(xiàn)中,返回一個405狀態(tài)碼的錯誤頁面。
405狀態(tài)碼:代表請求的方式服務(wù)器不提供支持。
4.銷毀:服務(wù)器關(guān)閉或重啟時,會銷毀所有的Servlet實例,會調(diào)用Servlet實例的destroy()方法。

package com.my.hyz.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//@WebServlet("/home.do")
public class HomeServlet extends HttpServlet {
public HomeServlet() {
System.out.println("實例化");
}
@Override
public void init() throws ServletException {
System.out.println("初始化");
//super.init();
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("調(diào)用Service實例");
}
@Override
public void destroy() {
System.out.println("銷毀咯?。。?!");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("哎呦get到了"+this.hashCode());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("哎呦post到了");
}
}
到此這篇關(guān)于Java中Servlet的生命周期詳解的文章就介紹到這了,更多相關(guān)Java Servlet 生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 裝飾模式(Decorator Pattern)詳解及實例代碼
裝飾器模式(Decorator Pattern)允許向一個現(xiàn)有的對象添加新的功能,同時又不改變其結(jié)構(gòu)。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個包裝2016-10-10
SpringBoot 使用@WebMvcTest測試MVC Web Controller
這篇文章主要介紹了SpringBoot 使用@WebMvcTest測試MVC Web Controller,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
spring cloud實現(xiàn)前端跨域問題的解決方案
這篇文章主要介紹了 spring cloud實現(xiàn)前端跨域問題的解決方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
在Java中以及Spring環(huán)境下操作Redis的過程
文章介紹了在Java和Spring環(huán)境下操作Redis的基本方法,在Java環(huán)境下,使用Maven創(chuàng)建項目并導入Jedis依賴,通過配置端口轉(zhuǎn)發(fā)訪問Redis,文章總結(jié)了Redis的基本命令和類別,如String、list、hash、set和zset,感興趣的朋友跟隨小編一起看看吧2025-03-03
Spring?容器初始化?register?與?refresh方法
這篇文章主要介紹了Spring?容器初始化?register?與?refresh方法,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07
Java使用synchronized實現(xiàn)互斥鎖功能示例
這篇文章主要介紹了Java使用synchronized實現(xiàn)互斥鎖功能,結(jié)合實例形式分析了Java使用synchronized互斥鎖功能簡單實現(xiàn)方法與操作技巧,需要的朋友可以參考下2020-05-05

