Posted on 2008-10-20 07:29
梦与桥 阅读(550)
评论(1) 编辑 收藏 所属分类:
jsp程序设计
1、一个Servlet生命周期(Tomcat处理请求中)
从Tomcat处理用户请求,我们可以清晰的看到容器Servlet的生命周期管理过程:
(1)、客户发出请求—>Web 服务器转发到Web容器Tomcat;
(2)、Tomcat主线程对转发来用户的请求做出响应创建两个对象:HttpServletRequest和HttpServletResponse;
(3)、从请求中的URL中找到正确Servlet,Tomcat为其创建或者分配一个线程,同时把2创建的两个对象传递给该线程;
(4)、Tomcat调用Servlet的servic()方法,根据请求参数的不同调用doGet()或者doPost()方法;
(5)、假设是HTTP GET请求,doGet()方法生成静态页面,并组合到响应对象里;
(6)、Servlet线程结束,Tomcat将响应对象转换为HTTP响应发回给客户,同时删除请求和响应对象。
从该过程中,我们可以理解Servlet的生命周期:Servlet类加载(对应3步);Servlet实例化(对应3步);调用init方法(对应3步);调用service()方法(对应4、5步);调用destroy()方法(对应6步)。
2、Servlet中doGet(),doPost(),service()函数的关系
(1),三者之间的关系:doGet()和doPost()是由函数service()调用才执行的。也就是说,当从HttpServlet类继承时可以绕过doGet()和doPost()直接override service()函数,也可以override doGet()和doPost()
(2),service() 该函数使用起来不像duPost()与duGet()那样有约束,但几乎失去了HttpServlet的意义。很类似于GeneratServlet
(3),doGet() 超链接时起作用
(4),doPost() form提交时起作用
如果两者均有,则可用service() 或者
protected void doGet(HttpServletRequest rst, HttpServletResponse resp) throws ServletException , java.io.IOException {
doPost(req,resp);
}
3、为什么程序中覆盖doGet()和doPost()等方法而不覆盖service()方法?
答:当服务器接收到servlet的请求时,服务器会产生一个新的线程调用service()方法。service()方法检查HTTP请求类型,然后相应地调用doGet()、doPost()、doPut()、doDelete()等方法。如果servlet处理POST请示或GET请求方式相同,也可以尝试覆盖service()方法。但这样做并不理想,更好的做法是在doPost()方法中调用doGet()方法,或者反过来。代码多了一些,相比较直接覆盖service()方法,有如下优点:
(1)确保以后可以在子类中添加对其他请求服务的支持,如doPut()等。
(2)可以通过实现getLastModified()方法来增加对修改日期的支持。如果调用了doGet()方法,标准service()方法会用getLastModified()方法设置header的最后修改日期,然后对GET请求作出回应(包括已修改过的header、If-Modified-Since header)。