Tomcat Java Servlet-инициализировать класс при запуске приложения

у меня есть класс, который занимает немного времени для запуска (делает некоторые вызовы JNI, а что нет), поэтому невозможно инициализировать этот класс каждый раз, когда загружается страница. Можно ли инициализировать этот класс при запуске приложения, а затем получить доступ к его методам по мере обслуживания страниц?

Например:

у меня есть MyClass. Когда приложение (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>");
    }
}

это возможно?

3 ответов


у вас есть два варианта:

  1. инициализируйте свой класс в init() метод. Вы можете добавить <load-on-startup> атрибут, чтобы убедиться, что сервлет создан при запуске приложения, а не при первом доступе.

  2. добавить ServletContextListener и использовать contextInitialized() метод обратного вызова. Использовать ServletContext#setAttribute для хранения созданного объекта для дальнейшего использования.


если вы хотите, чтобы это произошло один раз для всего приложения и произошло до запуска любого сервлета, реализуйте ServletContextListener и поместите свой код запуска в contextInitialized(). Затем настройте свой web.xml чтобы указать класс в качестве слушателя.

в противном случае вы можете сделать то, что говорит другой ответ, и поместить его в init() метод сервлета.


вы можете выполнить инициализацию класса внутри init метод.
init() метод вызывается при загрузке экземпляра сервлета, поэтому он является хорошим местом для дорогостоящих операций.