【问题标题】:Tomcat Java Servlet - Initialize Class on Application StartupTomcat Java Servlet - 在应用程序启动时初始化类
【发布时间】:2011-06-01 20:05:37
【问题描述】:

我有一个类需要一些时间来启动(进行一些 JNI 调用等等),所以每次加载页面时都初始化这个类是不可行的。是否可以在应用程序启动时初始化此类,然后在提供页面时访问其方法?

例如:

我有我的班级。当应用程序(tomcat)启动时,我希望它按如下方式初始化我的 calss:

MyClass myClassInstance = new MyClass("arg1", "arg2");

然后当一个页面被调用时,比如说/testpage,我想调用myClassInstance:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import MyClass;

public class TestPage extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
    {
        String myResult = myClassInstance.getResult("whatever");

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Test</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>" +myResult +"</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

这可能吗?

【问题讨论】:

标签: java tomcat classloader


【解决方案1】:

你有两个选择:

  1. 在 servlet 的 init() 方法中初始化您的类。您可以添加 &lt;load-on-startup&gt; 属性以确保您的 servlet 是在应用程序启动时创建的,而不是在首次访问时创建的。

  2. 添加ServletContextListener并使用contextInitialized()回调方法。使用ServletContext#setAttribute 存储创建的对象以供将来使用。

【讨论】:

【解决方案2】:

如果您希望它在整个应用程序中发生一次,并且在任何 servlet 运行之前发生,请实现 ServletContextListener 并将您的启动代码放入 contextInitialized()。然后设置您的 web.xml 以将您的班级指定为侦听器。

否则,您可以按照其他答案所说的去做,并将其放入 servlet 的 init() 方法中。

【讨论】:

    【解决方案3】:

    您可以在 servlet 的 init 方法中对类进行初始化。
    init() 方法在加载 servlet 实例时调用,因此它是执行昂贵操作的好地方。

    【讨论】:

      猜你喜欢
      • 2019-09-06
      • 2011-11-17
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 2011-04-24
      相关资源
      最近更新 更多