Servlet生命周期分為3個階段:
1,初始化階段 調用init()方法
2,響應客戶要求階段 調用service()方法
3,終止階段 調用destroy()方法
Servlet初始化階段:
在以下時刻Servlet容器裝載Servlet:
1,Servlet容器啟動時自動裝載某些Servlet,實現它只需要在web.XML文件中的<Servlet></Servlet>之間添加以下代碼:
<loadon-startup> 1 </loadon-startup>
|
2,在Servlet容器啟動后,客戶首次向Servlet發送要求
3,Servlet類文件被更新后,重新裝載Servlet
Servlet被裝載后,Servlet容器創建1個Servlet實例并且調用Servlet的init()方法進行初始化。在Servlet的全部生命周期內,init()方法只被調用1次。
Servlet工作原理:
首先簡單解釋1下Servlet接收和響應客戶要求的進程,首先客戶發送1個要求,Servlet是調用service()方法對要求進行響應的,通過源代碼可見,service()方法中對要求的方式進行了匹配,選擇調用doGet,doPost等這些方法,然后再進入對應的方法中調用邏輯層的方法,實現對客戶的響應。在Servlet接口和GenericServlet中是沒有doGet,doPost等等這些方法的,HttpServlet中定義了這些方法,但是都是返回error信息,所以,我們每次定義1個Servlet的時候,都必須實現doGet或doPost等這些方法。
每個自定義的Servlet都必須實現Servlet的接口,Servlet接口中定義了5個方法,其中比較重要的3個方法觸及到Servlet的生命周期,分別是上文提到的init(),service(),destroy()方法。GenericServlet是1個通用的,不特定于任何協議的Servlet,它實現了Servlet接口。而HttpServlet繼承于GenericServlet,因此HttpServlet也實現了Servlet接口。所以我們定義Servlet的時候只需要繼承HttpServlet便可。
Servlet接口和GenericServlet是不特定于任何協議的,而HttpServlet是特定于HTTP協議的類,所以HttpServlet中實現了service()方法,并將要求ServletRequest,ServletResponse強轉為HttpRequest和HttpResponse。
public void service(ServletRequest
req,ServletResponse res) throws ServletException,IOException { HttpRequest
request; HttpResponse
response; try { req
= (HttpRequest)request; res
= (HttpResponse)response; } catch (ClassCastException
e) { throw new ServletException( "non-HTTP
request response" );
} service(request,response); } |
代碼的最后調用了HTTPServlet自己的service(request,response)方法,然后根據要求去調用對應的doXXX方法,由于HttpServlet中的doXXX方法都是返回毛病信息,
protected void doGet(HttpServletRequest
res,HttpServletResponse resp) throws ServletException,IOException { String
protocol = req.getProtocol(); String
msg = IStrings.getString( "http.method_get_not_supported" ); if (protocol.equals( "1.1" )) { resp.sendError(HttpServletResponse.SC.METHOD.NOT.ALLOWED,msg); }
生活不易,碼農辛苦
------分隔線----------------------------
上一篇 項目感想記錄 分享到:
------分隔線----------------------------
|