servlet <load-on-startup>值表示什么


174

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

<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>必须为正整数才能自动加载。我查了一下google,但遇到的回应只会使我感到困惑。

Answers:


186

树脂3.0记录了此行为:

启动时加载可以指定一个(可选)整数值。如果该值为0或更大,则表示要加载servlet的顺序,编号较高的servlet将在编号较小的servlet之后加载。

JSP 3.1规范(JSR 340)说,这14-160页:

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

您可能不仅要检查JSR,还要检查Web容器的文档。可能会有差异


Cletus的回答是错误的。您应该考虑编辑帖子。
Alboz 2015年

3
如果未指定启动时的负载会怎样?
Nirmal

1
@Nirmal第二段说明,如果不存在该元素,则其行为与否定相同,即,容器可以随时选择加载servlet。
Finnegan

129

简短答案:value> = 0表示在部署Web应用程序或服务器启动时加载了Servlet。值<0:只要有容器感觉,就加载servlet。

长答案(来自规范):

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


1
这就是我们对DispatcherServlet的标志0序先加载应用程序启动时..
幸运

11

它指示在请求尝试访问它之前不会启动该servlet。

如果启动时负载大于或等于零,那么当容器启动时,它将以您放置在启动值上的加载值的升序(即0、1、2、5、10,依此类推)启动servlet。 。


7
零也会导致加载。仅禁止使用负值:“ [...]如果值是正整数或0,则容器必须在部署应用程序时加载并初始化Servlet。[...]”
marabol,2010年

1
@cletus我认为最好将大于零修改为 大于或等于零,因为许多用户按照接受的答案阅读您的答案。在此先感谢
Tarik 2015年

9

Servlet生命周期

Servlet的生命周期由已部署Servlet的容器​​控制。当请求映射到servlet时,容器执行以下步骤。

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

    一个。加载servlet类

    b。创建servlet类的实例

    C。通过调用init方法初始化servlet实例(创建和初始化Servlet中涉及了初始化

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

值为0 load-on-startup表示当请求到达该servlet时执行点1。其他值表示在容器启动时执行点1。


完美的答案!
gaurav

1

如在其他答案中所述,在启动时加载文章中,零是可以接受的,并且在没有其他任何servlet的情况下,它将在加载和部署期间优先进行加载。加载状态的最佳用法是加载Servlet,这会花费较长的时间在第一个请求到来之前就很好地进行初始化,就像Servlet创建连接池或进行网络调用或保留大量资源一样,这将大大减少前几个请求的响应时间。


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

0

是的,它可以具有相同的值。...为启动时赋值的原因是为服务器定义一个序列,以加载所有servlet。加载值为0的servlet将首先加载,加载值为1的servlet之后将加载。

如果两个servlet的启动时值与加载时的值相同,则它们如何在web.xml中上下声明。将首先加载web.xml中最先出现的servlet,然后再加载另一个。


0

->(缺少启动时加载)标记首先,在服务器中部署servlet时,创建servlet对象是服务器的责任。例如:假设Servlet部署在服务器中,(Servlet对象在服务器中不可用)客户端第一次将请求发送到Servlet,然后服务器在默认构造函数的帮助下创建Servlet对象,并立即调用init()。从那时起,每当客户端发送请求时,仅服务方法将被执行,因为对象已经可用

如果部署描述符中使用了启动时加载标记:在部署本身时,服务器将根据标记之间提供的正值为Servlet创建Servlet对象。Servlet类的对象创建将在0-128之间进行。0号将首先创建servlet,然后再创建其他编号。

如果我们为web.xml中的两个servlet提供相同的值,则将根据web.xml中类的位置完成对象的创建,每个服务器的情况也不同。

如果我们在启动标记之间提供负值,则服务器将不会创建servlet对象。

服务器为servlet创建对象的其他方案。

如果我们不使用web.xml中的start标签上的load,那么当客户端第一次发送请求时,服务器就会创建项目,并且服务器负责调用其生命周期方法。然后,如果在服务器(tomcat)中修改了.class。再次,客户端发送对修改后的servlet的请求,但是在tomcat的情况下,将不会创建新对象,并且服务器将利用现有对象,除非重新启动服务器。但是在Web逻辑类中,只要在服务器中修改了.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一旦获得请求而被加载,则称为“延迟加载”。


-6

这很简单,因为您甚至都没有想到。

如果该值为正,则在容器启动时加载

如果该值不为正,则在发出请求时将加载servelet。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.