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() метод вызывается при загрузке экземпляра сервлета, поэтому он является хорошим местом для дорогостоящих операций.