Servlet < load-on-start > 值表示什么

我有点糊涂了。在我们的应用程序中,我们定义了一些 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>的值必须是一个正整数才能自动加载。我在谷歌上查了一下,但是我看到的回复只是增加了我的困惑。

281857 次浏览

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

如果 load-on-start 大于或等于零,那么当容器启动时,它将按照您放在那里的启动值的负载升序启动该 servlet (即0,1,2,5,10等等)。

树脂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 容器的文档。可能会有些不同

Servlet 生命周期

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

  1. 如果 servlet 的一个实例不存在,Web 容器:

    A 加载 servlet 类

    B 创建 servlet 类的实例

    C 通过调用 init 方法初始化 servlet 实例(初始化在 创建和初始化 Servlet中讨论)

  2. 容器调用服务方法,传递请求和响应对象。

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

简短回答 : value > = 0意味着在部署 web-app 或服务器启动时加载 servlet。 值 < 0: 只要容器需要,就加载 servlet。

长答案 (来自规范) :

Load-on-start 元素指示 应该加载 servlet (实例化并具有 它的 init ()在 Web 启动时被调用 应用程序。这些 元素中的顺序必须是一个整数 应该加载哪个 servlet 是一个负整数,或者该元素不是 现在,容器可以自由加载 servlet 只要它选择。如果值是正的 128 整数或0,则容器必须加载和 像应用程序那样初始化 servlet 容器必须保证 加载用较低整数标记的 servlet 在用较高的整数标记的 servlet 之前 集装箱可以选择装货的顺序 具有相同启动加载值的 servlet。

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

如果两个 servlet 具有相同的启动时加载值,那么它们将如何在 web.xml 中从上到下地加载。在 web.xml 中第一个加载的 servlet 将首先加载,其他的将在此之后加载。

Servlet 容器在启动期间或发出第一个请求时加载 servlet。Servlet 的加载依赖于“ web.xml”文件中的属性“ load-on-start”。如果属性有一个正整数(0到128) ,那么 servlet 将随着容器的加载一起加载,否则它将在第一个服务请求到来时加载。

当 servlet 在获得请求后被加载时,它被称为“惰性加载”。

如果值 < 0,则在请求到来时实例化 serlet,否则容器将按值的递增顺序加载 else > = 0。如果2个或多个 servlet 具有相同的值,那么 web.xml 中声明的 servlet 的顺序。

正如在其他答案中所说的那样,这个 启动加载文章0是可以接受的,并且在没有其他 servlet 的情况下,这将在部署期间优先加载和加载。最好的使用加载上的状态是加载 servlet,它需要更长的时间来初始化之前,第一个请求来像 servlet,创建连接池或进行网络调用或持有庞大的资源,这将显着减少响应时间的最初几个请求。

(没有启动加载)标签 首先,在服务器中部署 servlet 时,服务器负责创建 servlet 对象。 例如: 假设 Servlet 部署在服务器中(Servlet 对象在服务器中不可用) ,客户端首次向 Servlet 发送请求,然后服务器在缺省构造函数的帮助下创建 Servlet 对象 并立即调用 init ()。从那时起,当任何客户端发送请求时,只有服务方法将得到执行,因为对象已经可用

如果在部署描述符中使用 load-on-start 标签: 在部署本身时,服务器根据标记之间提供的正值为 servlet 创建 servlet 对象。Servlet 类的对象创建将从0到128 将首先创建数字为0的 servlet,然后创建其他数字。

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

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

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

如果我们不在 web.xml 中的 start 标记上使用 load,那么当每个客户机首次发送请求时,服务器将创建对象,并且服务器负责调用其生命周期方法,那么将部署 project。那么如果。类在服务器中被修改(tomcat)。 客户机再次发送修改后的 servlet 请求,但是在 tomcat 不会创建新对象的情况下,除非重新启动服务器,否则服务器将使用现有对象。 但是在网络逻辑课上。类文件在服务器中被修改,如果它接收到一个请求,服务器就会调用现有 servlet 上的销毁方法,创建一个新的 servlet 对象并调用 init ()进行初始化。

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

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

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

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