Servlet的运行机制和生命周期

当浏览器发送给服务器一个Servlet请求时,如果这个Servlet是第一次被调用,那么服务器将会自动创建一个Servlet实例,并运行它;而如果这个Servlet已经被实例化,那么服务器只是会新启动一个线程来运行它。所以,多个线程有可能会去访问共享的全局变量,因此,在使用这些全局变量时,一定要特别小心,让这些线程不会访问到不同步的数据。除非是需要共享的信息。
下面我们使用例子进行演示Servlet的运行过程,说明只创建一个实例,而进行多次线程调用,首先给这个Servlet增建一个构造函数,并在doGet()函数中也打印一个标记,重新部署,看看界面的显示,代码如下所示:

@WebServlet(name = "ServletAge")
public class ServletAge extends HttpServlet {

    public ServletAge() {
        System.out.println("ServletAge:构造函数");
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        System.out.println("ServletAge:processRequest");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("ServletAge:doGet");
        processRequest(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("ServletAge:doPost");
        processRequest(req, resp);
    }

    @Override
    public String getServletInfo() {
        System.out.println("ServletAge:getServletInfo");
        return "Short description";
    }
}

web运行结果:

刷新再次访问

说明服务器只会创建一个servlet实例,对于多次访问,每次之创建一个新的线程进行处理。 

生命周期

一个Servlet在服务器上最多只会创建一个实例,在此期间会涉及到HttpServlet的方法,在编写Servlet程序时,都是让它继承HttpServlet这个类,然后根据需要去覆盖HttpServlet中的方法。比较常用的方法有:init()、doGet()、doPost()、service()、destroy().

(1)doGet()/doPost()/service()

service()方法

如果客户端有一个对Servlet的请求发送过来,那么服务器端会产生一个新的线程,并且让它调用Servlet的service()方法。service()方法根据收到的客户端请求类型,决定调doGet()还是doPost()还是其他的doXXX()方法。

(2)init()方法

           对Servlet做一些初始化工作,这个方法只会被调用一次,不会对每次连接都调用,可以将一些初始化代码放在该函数中
(3)destroy()方法

         如果要删除某个Servlet实例,那么在删除之前服务器会先调用destroy()方法。可以在这个方法中执行一些清理动作,比如释放数据库连接,关闭打开的文件等。

综上,Servlet的生命周期如下图所示:

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值