Java-сервлет Tomcat - инициализация класса при запуске приложения - PullRequest
8 голосов
/ 02 июня 2011

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

Например:

У меня есть MyClass.Когда приложение (tomcat) запускается, я хотел бы, чтобы оно инициализировало мои вычисления следующим образом:

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 ]

20 голосов
/ 02 июня 2011

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

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

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

8 голосов
/ 02 июня 2011

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

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

3 голосов
/ 02 июня 2011

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

...