HttpServlet的生命周期是什么?

GC_*_*GC_ 24 java jsp servlets

基本上,servlet的实例有多长?我有点猜测它是会话范围.但是,我想它可能会有某种超时或垃圾收集来删除旧实例.

Boz*_*zho 38

  • 应用程序启动时(在servlet容器上部署)或首次访问时创建servlet(取决于load-on-startup设置)
  • 当servlet被实例化时,init()调用servlet 的方法
  • 然后servlet(它的唯一实例)处理所有请求(其service()方法由多个线程调用).这就是为什么不建议在其中进行任何同步,并且应该避免使用servlet的实例变量
  • 取消部署应用程序时(servlet容器停止),将destroy()调用该方法.

  • 它大大减慢了它的速度.这意味着每个用户都必须等待另一个用户完成请求 - 这是不可接受的. (6认同)

Wil*_*ung 14

生命周期定义良好,并通过Servlet的init,service和destroy方法中公开的生命周期方法公开.

而且,尽管此处还有其他内容,但您可以依赖规范.基本上,您可以获得这三种方法,并保证Servlet不是线程安全的.可以通过一个或多个请求同时访问单个servlet.

规范中没有任何内容将servlet限制为容器的一个实例,如果容器决定,它可以获取请求,创建servlet,调用它的init,然后服务,然后销毁方法,并将其设置为垃圾收集.

单个容器具有可能不同的实现.

大多数容器都会创建一个实例.但规范并不保证,所以你不应该依赖它.

另外,请考虑像Google App Engine这样的东西.GAE是非常积极的,不断到期并关闭整个没有流量的网络应用程序.如果你有一个轻松旅行的网站,你可以期望整个应用程序启动,初始化它的所有服务,初始化任何加载启动servlet,执行请求,然后关闭所有内容.因此,在GAE上,您必须拥有一个非常快速的应用程序启动,以保持任何表面性能.

因此,简单地说,您可以依赖的是规范所说的内容.单个容器可以提供不同的运行时体验.


dea*_*mon 5

Servlet与应用程序一样有效。

  • 不,Grae-用户都使用相同的servlet实例。 (7认同)