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); }
生活不易,码农辛苦
------分隔线----------------------------
上一篇 项目感想记录 分享到:
------分隔线----------------------------
|