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 ответов
у вас есть два варианта:
инициализируйте свой класс в
init()
метод. Вы можете добавить<load-on-startup>
атрибут, чтобы убедиться, что сервлет создан при запуске приложения, а не при первом доступе.добавить
ServletContextListener
и использоватьcontextInitialized()
метод обратного вызова. ИспользоватьServletContext#setAttribute
для хранения созданного объекта для дальнейшего использования.
если вы хотите, чтобы это произошло один раз для всего приложения и произошло до запуска любого сервлета, реализуйте ServletContextListener
и поместите свой код запуска в contextInitialized()
. Затем настройте свой web.xml
чтобы указать класс в качестве слушателя.
в противном случае вы можете сделать то, что говорит другой ответ, и поместить его в init()
метод сервлета.
вы можете выполнить инициализацию класса внутри init
метод.init()
метод вызывается при загрузке экземпляра сервлета, поэтому он является хорошим местом для дорогостоящих операций.