什么是Servlet
Servlet是JavaWeb的三大組件之一,它屬於動態資源。Servlet的作用是處理請求,服務器會把接收到的請求交給Servlet來處理,在Servlet中通常需要:
- 接收請求數據;
- 處理請求;
- 完成響應。
例如客戶端發出登錄請求,或者輸出注冊請求,這些請求都應該由Servlet來完成處理!Servlet需要我們自己來編寫,每個Servlet必須實現javax.servlet.Servlet接口。
Servlet的生命周期
所謂xxx的生命周期,就是說xxx的出生、服務,以及死亡。Servlet生命周期也是如此!與Servlet的生命周期相關的方法有:
- void init(ServletConfig);
- void service(ServletRequest,ServletResponse);
- void destroy();
Servlet在第一次請求的時候,由Tomcat來創建, 馬上調用init()方法, 用戶每請求一次,都會調用一次service(),
當服務器關閉之前, 先銷毀Servlet, 在銷毀Servlet之前,調用destroy()方法.
實現Servlet有三種方式:
- 實現javax.servlet.Servlet接口;
- 繼承javax.servlet.GenericServlet類;
- 繼承javax.servlet.http.HttpServlet類;(推薦)
第一種方式: 實現javax.servlet.Servlet接口
1) 編寫一個類實現Servlet接口
2) 在web.xml文件中,對Servlet進行配置, 綁定url
3) 訪問:http://服務器ip:服務器端口/項目名/servlet的url
訪問這個servlet的url:http://localhost:8888/les02/hello
Servlet是一個線程不安全的, Tomcat會為每一次請求創建一個線程, 我們web項目是一個多線程的項目
默認情況: Servlet的創建是在第一次請求這個Servlet的時候,創建, 為了Tomcat啟動快, 從用戶角度來看: 第一個訪問的用戶耗時多一點, 耗費創建Servlet的時間, 第一次懲罰
Tomcat:第一步判斷這個Servlet類有沒有創建對象如果對象。
直接通過這個類的對象調用service0方法處理用戶請求
如果沒有: Tomcat先創建這個類的對象,然后通過對象調用service()
第二種方式: 繼承GenericServlet類
GenericServlet這個類是Servlet的一個實現類, 它是一個抽象類, service()沒有重寫
第三種方式: 繼承HttpServlet類 (推薦)
HttpServlet是GenericServlet的子類, 也是一個抽象類
1) 編寫一個類繼承HttpServlet, 重寫doGet()以及doPost()
doGet() 處理Get請求
doPost() 處理Post請求
2) 在web.xml中配置Servlet
Servlet接口相關類型
在Servlet接口中還存在三個我們不熟悉的類型:
- ServletRequest:service() 方法的參數,它表示請求對象,它封裝了所有與請求相關的數據,它是由服務器創建的;
- ServletResponse:service()方法的參數,它表示響應對象,在service()方法中完成對客戶端的響應需要使用這個對象;
- ServletConfig:init()方法的參數,它表示Servlet配置對象,它對應Servlet的配置信息,那對應web.xml文件中的<servlet>元素。
ServletRequest對象常用的方法: getParamenter(String name) 獲取請求參數, 通過請求參數名獲取請求參數的值
ServletResponse對象常用的方法: getWriter() / getOutputStream() 響應對象方法: 后台把數據響應給前端, 使用輸出流 (兩個流只能選一個)
ServletConfig對象常用的方法: 獲取指定的Servlet的配置信息,每一個Servlet都有自己的配置信息,

@Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { //獲取請求參數 String name = req.getParameter("name"); System.out.println("前端傳遞的參數name的值:"+name); //給客戶端響應: 響應到客戶端瀏覽器上 類似於js, document.write() //得到響應輸出流 res.getWriter().write("<h1>hello client</h1>"); //獲取Servlet初始化參數 String servletName = config.getServletName(); String encoding = config.getInitParameter("encoding"); String age = config.getInitParameter("age"); res.getWriter().print("<h1>"+servletName+","+encoding+","+age+"</h1>"); }
- getServletContext() :獲取ServletContext對象
- getServletName() : 獲取Servlet的name
- getInitParament(String name) : 獲取Servlet的初始化參數(在<servlet>中配置的參數)
- getInitParaments() : 獲取Servlet請求參數所有的name的值,返回的是一個集合,
HttpServlet調用源碼分析
三種創建方式的關系可用下圖表示: