Servlet运行机制与生命周期
2016-05-24 09:03
405 查看
Servlet的运行机制和生命周期
一、Servlet的运行机制
当浏览器发送给服务器一个Servlet的请求时,如果这个Servlet是第一次被调用,那么服务器将会自动创建一个Servlet实例,并运行它;而如果这个Servlet已经被实例化,那么服务器只是会新启动一个线程来运行它。所以,多个线程有可能会去访问共享的全局变量,因此,在使用这些全局变量时,一定要特别小心,让这些线程不会访问到不同步的数据。除非是需要共享的信息。
下面我们使用例子进行演示Servlet的运行过程,说明只创建一个实例,而进行多次线程调用,首先给这个Servlet增建一个构造函数,并在doGet()函数中也打印一个标记,重新部署,看看界面的显示,代码如下所示:
运行后在控制台出现如下结果:
第一次进入的显示:
图1 第一次进入时的显示
图2 刷新后的显示
从上面显示效果可以看出:Servlet第一次被调用,那么服务器将会自动创建一个Servlet实例,并运行它;而如果这个Servlet已经被实例化,那么服务器只是会新启动一个线程来运行它
二、Servlet的生命周期
从前面的例子可以看出,一个Servlet在服务器上最多只会驻留一个实例,在此期间会涉及到HttpServlet的方法,如下所示:
在编写Servlet程序时,都是让它继承HttpServlet这个类,然后根据需要去覆盖HttpServlet中的方法。比较常用的方法有:init()、doGet()、doPost()、service()、destroy().
(1)doGet()/doPost()/service()
service()方法
如果客户端有一个对Servlet的请求发送过来,那么服务器端会产生一个新的线程,并且让它调用Servlet的service()方法。service()方法根据收到的客户端请求类型,决定调
doGet()还是doPost()还是其他的doXXX()方法。
如果不能确定客户端的请求方式到底是GET还是POST方式,那么可以在Servlet中同时定义这两个方法,如下方式让另一个来调用其中一个:
对Servlet做一些初始化工作,这个方法只会被调用一次,不会对每次连接都调用,可以将一些初始化代码放在该函数中
(3)destroy()方法
如果要删除某个Servlet实例,那么在删除之前服务器会先调用destroy()方法。可以在这个方法中执行一些清理动作,比如释放数据库连接,关闭打开的文件等。
综上,Servlet的生命周期如下图所示:
图 Servlet生命周期图
以上就是Servlet运行机制和生命周期的总结
一、Servlet的运行机制
当浏览器发送给服务器一个Servlet的请求时,如果这个Servlet是第一次被调用,那么服务器将会自动创建一个Servlet实例,并运行它;而如果这个Servlet已经被实例化,那么服务器只是会新启动一个线程来运行它。所以,多个线程有可能会去访问共享的全局变量,因此,在使用这些全局变量时,一定要特别小心,让这些线程不会访问到不同步的数据。除非是需要共享的信息。
下面我们使用例子进行演示Servlet的运行过程,说明只创建一个实例,而进行多次线程调用,首先给这个Servlet增建一个构造函数,并在doGet()函数中也打印一个标记,重新部署,看看界面的显示,代码如下所示:
package servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ShoeServlet2 extends HttpServlet { public ShoeServlet2() { System.out.println("ShoeServlet2:构造函数"); } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); try (PrintWriter out = response.getWriter()) { System.out.println("ShoeServlet2:processRequest"); } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("ShoeServlet2:doGet"); processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("ShoeServlet2:doPost"); processRequest(request, response); } @Override public String getServletInfo() { System.out.println("ShoeServlet2:getServletInfo"); return "Short description"; }// </editor-fold> }
运行后在控制台出现如下结果:
第一次进入的显示:
图1 第一次进入时的显示
图2 刷新后的显示
从上面显示效果可以看出:Servlet第一次被调用,那么服务器将会自动创建一个Servlet实例,并运行它;而如果这个Servlet已经被实例化,那么服务器只是会新启动一个线程来运行它
二、Servlet的生命周期
从前面的例子可以看出,一个Servlet在服务器上最多只会驻留一个实例,在此期间会涉及到HttpServlet的方法,如下所示:
在编写Servlet程序时,都是让它继承HttpServlet这个类,然后根据需要去覆盖HttpServlet中的方法。比较常用的方法有:init()、doGet()、doPost()、service()、destroy().
(1)doGet()/doPost()/service()
service()方法
如果客户端有一个对Servlet的请求发送过来,那么服务器端会产生一个新的线程,并且让它调用Servlet的service()方法。service()方法根据收到的客户端请求类型,决定调
doGet()还是doPost()还是其他的doXXX()方法。
如果不能确定客户端的请求方式到底是GET还是POST方式,那么可以在Servlet中同时定义这两个方法,如下方式让另一个来调用其中一个:
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { //处理doGet请求 } public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ doGet(request,reponse); }(2)init()方法
对Servlet做一些初始化工作,这个方法只会被调用一次,不会对每次连接都调用,可以将一些初始化代码放在该函数中
(3)destroy()方法
如果要删除某个Servlet实例,那么在删除之前服务器会先调用destroy()方法。可以在这个方法中执行一些清理动作,比如释放数据库连接,关闭打开的文件等。
综上,Servlet的生命周期如下图所示:
图 Servlet生命周期图
以上就是Servlet运行机制和生命周期的总结
相关文章推荐
- Ubuntu 16.04 LTS的这十项新功能,每个Ubuntu用户必须要知道!
- 强悍的 Linux —— 强悍的 vim (二)
- Comet4J 相关
- 关于登录模块的心得体会
- JAVA队列之优先队列
- 按两次返回键退出程序
- 动态规划详解
- 一键生成 ios 和安卓各尺寸截屏、图标
- 153. Find Minimum in Rotated Sorted Array
- 文件硬链接和软链
- javaweb学习路之一--web项目搭建
- 【代码笔记】iOS-伸缩式动画
- fedora各个版本的下载地址archive
- (已解决scientificlinux 与windows7的双系统问题)在linux下修复/添加windows启动/引导项
- 端口的概念
- linux gcc编译undefined reference to `stricmp'问题
- 详解Java中的迭代迭代器Iterator与枚举器Enumeration
- 【代码笔记】伸缩式动画
- 一天一点MySQL复习——获取数据库系统时间、变量赋值、变量比较
- 表格UITableViewCell定制和使用