我在这里有点困惑。在我们的应用程序中,我们定义了一些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>
的值必须是一个正整数才能自动加载。我在谷歌上查了一下,但我遇到的回复只会增加我的困惑。
Resin 3.0记录了这种行为:
load-on-startup可以指定(可选)整数值。如果值为0或更大,则表示要加载servlet的顺序,具有较高编号的servlet在具有较低编号的servlet之后加载。
JSP 3.1 spec(JSR 340)在第14-160页说明了这一点:
元素
load-on-startup
表示应该在Web应用程序的启动时加载(实例化并且调用其init())。此元素的元素内容必须是一个整数,指示应加载servlet的顺序。如果值是负整数,或者元素不存在,则容器可以随时加载servlet。如果值为正整数或0,则容器必须在部署应用程序时加载并初始化servlet。容器必须保证在标记有更高整数的servlet之前加载标有较低整数的servlet。容器可以选择具有相同load-on-startup
值的servlet的加载顺序。
您可能不仅要检查JSR,还要检查Web容器的文档。可能存在差异
servlet容器在启动期间或第一个请求发出时加载servlet。 servlet的加载取决于“web.xml”文件中的“load-on-startup”属性。如果属性具有正整数(0到128),那么servlet将加载容器,否则在第一个请求进入服务时加载。
当servlet被请求加载后,它被称为“延迟加载”。
这很简单,你甚至没想到。
如果值为正,则在容器启动时加载
如果值不是正值,则在发出请求时加载servlet。
简答:value> = 0表示在部署Web应用程序或服务器启动时加载servlet。 value <0:只要容器有问题,就会加载servlet。
答案很长(来自规范):
load-on-startup元素指示应该在Web应用程序的启动时加载(实例化并且调用其init())。这些元素的可选内容必须是一个整数,表示servlet的加载顺序。如果值是负整数,或者元素不存在,则容器可以随时加载servlet。如果值为正128或0,则容器必须在部署应用程序时加载并初始化servlet。容器必须保证在标记有更高整数的servlet之前加载标有较低整数的servlet。容器可以选择具有相同加载启动值的servlet的加载顺序。
它表示在请求尝试访问它之前不会启动servlet。
如果load-on-startup大于或等于零,那么当容器启动时,它将按照您放在那里的启动时的负载的升序开始该servlet(即0,1然后2然后5然后10等等) 。
servlet的生命周期由部署了servlet的容器控制。当请求映射到servlet时,容器执行以下步骤。
- 如果servlet的实例不存在,则Web容器: 一个。加载servlet类 湾创建servlet类的实例 C。通过调用init方法初始化servlet实例(初始化在Creating and Initializing a Servlet中介绍)
- 容器调用服务方法,传递请求和响应对象。服务方法在Writing Service Methods中讨论。
load-on-startup
上的0值表示当请求到达该servlet时执行第1点。其他值表示在容器启动时执行第1点。
正如其他答案中所述,这个load-on-startup article零是可以接受的,并且在没有任何其他servlet的情况下,这将在部署期间优先加载和加载。加载statup的最佳用法是加载servlet,这需要花费更长的时间在第一次请求之前初始化,就像创建连接池或进行网络调用或保持庞大资源的servlet一样,这将显着减少前几个请求的响应时间。
是的,它可以具有相同的值....给启动时加载数字的原因是为服务器定义一个序列来加载所有的servlet。具有0 load-on-startup值的servlet将首先加载,而值为1的servlet将在此之后加载。
如果两个servlet具有相同的启动加载值,那么它们将从上到下在web.xml中声明它们的加载方式。首先加载web.xml中的servlet,然后加载另一个。
- >(没有load-on-start-up)标签首先,当servlet部署在服务器中时,服务器负责创建servlet对象。例如:假设Servlet部署在服务器中,(Servlet Object在服务器中不可用)客户端第一次将请求发送到servlet,然后服务器在默认构造函数的帮助下创建servlet对象并立即调用init()。从那时客户端发送请求时,只有对象已经可用时才会执行服务方法
如果在部署描述符中使用了load-on-start-up标记:在部署本身时,服务器会根据标记之间提供的正值为servlet创建servlet对象。 servlet类的对象的创建将遵循0-128 0将首先创建数字servlet,然后是其他数字。
如果我们在web.xml中为两个servlet提供相同的值,那么将根据web.xml中类的位置来创建对象,这也因服务器而异。
如果我们在启动标记的负载之间提供负值,则服务器不会创建servlet对象。
如果我们不在web.xml中的启动标记上使用load,那么当客户端第一次发送请求时,就会部署项目服务器创建对象,服务器负责调用其生命周期方法。然后,如果在服务器(tomcat)中修改了.class。客户端再次发送修改后的servlet请求,但是在tomcat的情况下,不会创建新对象,服务器会使用现有对象,除非重新启动服务器。但是在Web逻辑类中,如果在服务器中修改了.class文件而没有重新启动服务器,如果收到请求,则服务器调用现有servlet上的destroy方法并创建一个新的servlet对象并调用init()进行初始化。
如果值<0,则在请求到来时实例化serlet,否则> = 0,容器将按值的递增顺序加载。如果2个或更多servlet具有相同的值,则在web.xml中声明servlet的顺序。