servlet的<load-on-startup>值表示什么意思?

180

我有点困惑了。在我们的应用程序中,我们定义了几个servlet。以下是一个servlet在web.xml文件中的摘录:

<servlet>
    <servlet-name>AxisServlet</servlet-name>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-class>com.foo.framework.axis2.http.FrameworkServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet> 

据我理解,<load-on-startup> 的值必须是正整数,才能自动加载。我在谷歌上查找了一下,但是我看到的回复只让我更加困惑。

11个回答

195

Resin 3.0文档记录了这种行为:

load-on-startup可以指定一个(可选)整数值。如果该值为0或更大,则表示Servlet的加载顺序,数字较高的Servlet会在数字较低的Servlet之后加载。

JSP 3.1规范(JSR 340)在第14-160页上写道:

load-on-startup元素指示应在Web应用程序启动时加载(实例化并调用其init())。该元素的元素内容必须是一个表示Servlet应该加载的顺序的整数。如果该值是负整数或元素不存在,则容器可以自由选择何时加载Servlet。如果该值为正整数或0,则容器必须在应用程序部署时加载和初始化Servlet。容器必须保证标记有较低整数的Servlet在标记有较高整数的Servlet之前加载。容器可以选择相同load-on-startup值的Servlet的加载顺序。

您可能不仅要检查JSR,还要检查您的Web容器文档。因为可能存在差异。


Cletus的答案是错误的。你应该考虑编辑这篇文章。 - Alboz
3
如果没有指定“启动时加载”的选项,会发生什么? - Nirmal
1
@Nirmal 第二段指定,如果元素不存在,则具有与负数相同的行为,即容器可以在任何时候自由加载servlet。 - Finnegan

134

简短回答:value >= 0 表示 servlet 在 Web 应用程序部署或服务器启动时加载。 value < 0:servlet 将在容器自行决定的时间加载。

详细回答(来自规范):

load-on-startup 元素表示此 servlet 应在 Web 应用程序启动时加载(实例化并调用其 init())。此元素的可选内容必须是一个整数,表示应加载 servlet 的顺序。如果值为负整数或未出现该元素,则容器可以在任何时候加载 servlet。如果值为正整数或 0,则容器必须在应用程序部署时加载和初始化 servlet。容器必须保证标记有较低整数的 servlet 在标记有较高整数的 servlet 之前加载。容器可以选择以相同 load-on-start-up 值加载 servlet 的顺序。


1
这就是为什么我们在DispatcherServlet中标记0,以便在应用程序启动时首先加载它的原因。 - Lucky

11

这表示直到有请求尝试访问它时,Servlet才会被启动。

如果load-on-startup大于或等于零,则当容器启动时,它将按照你设置的load-on-startup值(即0、1、2、5、10等)升序启动该Servlet。


7
如果这个值为正整数或0,容器必须在应用被部署时加载和初始化servlet。零也会引起加载。只有负值不能被保证。 - marabol
1
@cletus 我认为最好将“大于零”修改为“大于或等于零”,因为许多用户根据已接受的答案所示来阅读您的答案。提前致谢。 - Tarik

9

Servlet Life Cycle

Servlet的生命周期由其所在的容器控制。当请求映射到一个Servlet时,容器执行以下步骤:

  1. 如果Servlet的实例不存在,则Web容器:

    a. 加载Servlet类

    b. 创建Servlet类的实例

    c. 通过调用init方法来初始化Servlet实例(该初始化在创建和初始化Servlet中进行了介绍)

  2. 容器调用service方法,传递请求和响应对象。服务方法将在编写服务方法中讨论。

load-on-startup上设置0表示当请求到达该Servlet时执行第1步。其他值表示在容器启动时执行第1步。


完美的答案! - Gaurav

2
  1. 如果两个servlet的值相同,则它们将按照在web.xml文件中声明的顺序加载。
  2. 如果为0或负整数,则Servlet将在容器感觉需要加载它们时加载。
  3. 保证Web容器通过加载、初始化和调用servlet的init()方法来加载。
  4. 如果任何servlet没有元素,则它们将在Web容器决定加载它们时加载。

1

如其他回答和此load-on-startup article所述,零是被接受的。在没有任何其他servlet的情况下,这将具有加载和部署期间优先级的作用。load-on-startup的最佳用法是加载需要较长时间才能初始化的servlet,比如创建连接池或进行网络调用或持有庞大资源的servlet,这将显著缩短前几个请求的响应时间。


0

是的,它们可以有相同的值...将load-on-startup赋予数字的原因是为了定义服务器加载所有servlet的顺序。具有0 load-on-startup值的servlet将首先加载,而具有值1的servlet将在此之后加载。

如果两个servlet具有相同的load-on-startup值,则它们将按照在web.xml中从上到下声明的顺序进行加载。在web.xml中排名靠前的servlet将首先加载,其他servlet将在其之后加载。


0

--> (缺少load-on-start-up标签) 首先,每当servlet在服务器上部署时,服务器负责创建servlet对象。 例如:假设Servlet已部署在服务器上,(Servlet对象在服务器中不可用)客户端第一次向servlet发送请求,然后服务器使用默认构造函数创建servlet对象并立即调用init()。从那时起,只要对象已经可用,每当客户端发送请求,就会执行服务方法。

如果在部署描述符中使用了load-on-start-up标记: 服务器根据标记之间提供的正值为基础,在部署时为servlet创建servlet对象。 servlet类的对象创建将按0-128的顺序进行 首先将创建编号为0的servlet,然后是其他编号。

如果我们在web.xml中为两个servlet提供相同的值,则对象的创建也将根据web.xml中的类位置而变化,这也因服务器而异。

如果我们在load on start up标记之间提供负值,则服务器不会创建servlet对象。

服务器创建servlet对象的其他场景。

如果我们在web.xml中不使用load on start up标签,则项目将在客户端首次发送请求时部署,服务器创建对象并负责调用其生命周期方法。然后,如果在服务器(tomcat)中修改了.class文件,则客户端再次发送请求以获取修改后的servlet,但在tomcat的情况下,新对象将不会被创建,服务器将利用现有对象,除非重新启动服务器。 但是,在web-logic的类中,如果在服务器上修改了.class文件而没有重新启动服务器,如果它收到请求,则服务器会调用现有servlet上的destroy方法并创建一个新的servlet对象,并调用其init()进行初始化。

-1

如果值小于0,则请求到来时实例化serlet,否则大于等于0时,容器将按值的递增顺序加载。如果有2个或更多的servlet具有相同的值,则按照在web.xml中声明的servlet的顺序进行排序。


-2

Servlet容器在启动时或第一次请求时加载servlet。servlet的加载取决于“web.xml”文件中的“load-on-startup”属性。如果该属性具有正整数(0到128),则servlet将随容器的加载而加载,否则它将在第一次请求服务时加载。

当servlet加载一次并获得请求后,它被称为“惰性加载”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接