在web.xml中的load-on-startup是否可用于在启动时加载任意类?

17

我该如何在Tomcat启动时加载一个自定义的类? 我看到了web.xml文件中的load-on-startup标签,但我该怎样使用它并实现我的类呢?

<servlet-name>??</servlet-name>
<servlet-class>??</servlet-class>
<load-on-startup>10</load-on-startup>
4个回答

31

这些参数用于指定Servlet的加载顺序。然而,Servlet更多地用于控制、预处理和/或后处理HTTP请求/响应,而您似乎更想在Web应用程序启动时寻找挂钩。在这种情况下,您需要一个ServletContextListener

@WebListener
public class Config implements ServletContextListener {
    public void contextInitialized(ServletContextEvent event) {
        // Do your thing during webapp's startup.
    }
    public void contextDestroyed(ServletContextEvent event) {
        // Do your thing during webapp's shutdown.
    }
}

如果你还没使用Servlet 3.0(因此无法使用@WebListener),那么你需要在web.xml中手动注册它,如下所示:

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>

参见:


如果我想使用特定的servlet(无法作为静态页面)启动我的应用程序,这是唯一的方法吗?我会使用您的ContextListener进行转发吗? - lony

8

元素 load-on-startup 表示此servlet应在Web应用程序启动时加载(实例化并调用其init()函数)。此元素的元素内容必须是一个整数,表示应该加载servlet的顺序。换句话说,容器按升序加载servlet , 其中0值首先被加载,然后是1、2、3等。

下面通过以下示例理解它:

web.xml

<web-app>  
 ....  
  //=====================servlet 1==============
  <servlet>  
   <servlet-name>servlet1</servlet-name>  
   <servlet-class>com.javatpoint.FirstServlet</servlet-class>  
   <load-on-startup>0</load-on-startup>  //value given 0(zero)
  </servlet>  

  //=====================servlet 2==============
  <servlet>  
   <servlet-name>servlet2</servlet-name>  
   <servlet-class>com.javatpoint.SecondServlet</servlet-class>  
   <load-on-startup>1</load-on-startup>   //value given 1(one)  
  </servlet>  

 ...  
</web-app>  

有两个servlet被定义了,这两个servlet都会在项目部署或服务器启动时加载。但是,servlet1会先于servlet2加载。

传递负值: 如果您传递负值,servlet将在请求时间加载,在第一次请求时。


3

enfix,

您的XML看起来很好。

您应该在您的servlet类中放置一个init()方法,在服务器启动时调用。doGet、doPost和do方法只有在有传入请求时才会被调用。

public class YourServlet extends HttpServlet
{
    public void init()
    {
        //initialize( or add a log statement to debug)
    }
}

这是最好的答案,因为使用load-on-startup整数可以控制您的servlet在所有其他load-on-startup servlet之后启动。如果您不关心顺序,则应使用ServletContextListener,在所有这些启动servlet之前运行。 - koem

1
这是Tomcat 7.0的解决方案 步骤1: 创建Web应用/Servlet的war文件。 如果您使用Eclipse,则选择 文件->导出->Web->WAR文件,并将其保存到已知位置。
步骤2: 找到Tomcat的主目录。 为此,请转到tomcat/apache-tomcat-7.0.41/bin并执行./startup.sh。 这将打印出一些全局变量名。请记下CATALINA_HOME的变量名。
步骤3: 将步骤1中的war文件复制到CATALINA_HOME/webapps中。
步骤4: 接下来,在CATALINA_HOME/conf/{Engine}/localhost/MyServlets.xml中创建一个XML文件:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<Context deployOnStartup="true" docBase="/home/ubuntu/Downloads/apache-tomcat-7.0.42/webapps/" reloadable="true">
<Manager pathname=""/>
</Context>

将docBase更改为你在第三步中复制war文件的位置。
现在,你可以进入tomcat/apache-tomcat-7.0.41/bin并执行./startup.sh。 你的servlet将自动启动。 希望这可以帮到你。

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