三、Servlet的生命周期
一個Java servlet具有一個生命周期,這個生命周期定義了一個Servlet如何被載入並被初始化,如何接收請求並作出對請求的響應,如何被從服務中清除。Servlet的生命周期被javax.servlet.Servlet這個接口所定義。
所有的Java Servlet都會直接地或間接地執行javax.servlet.Servlet接口,這樣它才能在一個Servlet引擎中運行。 Servlet引擎是Web 服務器按照Java Servlet API定制的擴展。Servlet引擎提供網絡服務,能夠理解MIME請求,並提供一 個運行Servlet的容器。
javax.servlet.Servlet接口定義了在Servlet的生命周期中特定時間以及特定順序被調用的方法。
Servlet 生命周期:Servlet 加載--->實例化--->服務--->銷毀。
Servlet程序是由WEB服務器調用,web服務器收到客戶端的Servlet訪問請求後:
(Web服務器解析完主機名、web應用,緊接著查找資源,即到該web.xml查詢。
)執行如下過程:
Init(): 使用反射機制,如果該Servlet的實例不存在,加載、創建實例調用init方法將該實例裝載到內存(只調用一次),即進行初始化。
Service(): Web服務器把接收到的Http請求封裝給HttpServletRequest對象(各種信息),作為service參數傳入,service函數會被調用多次(每訪問一次Servlet,service就會被調用一次)
把response(響應給服務器的信息)拆解,形成http響應格式。
destroy():僅執行一次,在服務器端停止且卸載Servlet時執行該方法。當Servlet對象退出生命周期時,負責釋放占用的資源。一個Servlet在運行service()方法時可能會產生其他的線程,因此需要確認在調用destroy()方法時,這些線程已經終止或完成。
Servlet的主要功能在於交互式地浏覽和修改數據,生成動態Web內容。
過程概括如下:
(1)客戶端發送請求至服務器端。
(2)服務器將請求信息內容並將其傳給Server。
(3)Servlet生成響應內容並將其傳給Server。
(4)響應內容動態生成,通常取決於客戶端的請求。
(5)服務器將響應返回給客戶端。
四、繼承GenericServlet
繼承GenericServlet與實現Servlet接口的不同就是把init()與destroy()封裝在service抽象方法中,即繼承GenericServlet可只實現一個方法就好。其它步驟都與實現Servlet接口一樣。
添加文件到classes目錄下,創建文件 MyGenericServlet.java 代碼如下:
package com.focus;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class MyGenericServlet extends GenericServlet
{
public void service(ServletRequest request, ServletResponse
response) throws ServletException, IOException
{
response.getWriter().println("hello world !!!!!");
}
}
配置一下Servlet
在浏覽器輸入:
效果如下:
五、繼承HttpServle
添加文件到classes目錄下,創建文件 MyHttpServlet.java 代碼如下:
package com.focus;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class MyHttpServlet extends HttpServlet
{
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
response.setCharacterEncoding("gbk");
response.getWriter().println("歡迎 "+request.getParameter("username")+" 光臨本網站");
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,IOException
{
response.getWriter().println("i am doGet");
}
}
配置一下Servlet
在ServletTest目錄下創建一個 go.html 代碼如下:
在浏覽器輸入:
效果如下:
證明HttpServlet默認調用的是doGet
在浏覽器輸入:
效果如下:
按提交按鈕,跳轉頁面