Загрузка при запуске с использованием аннотации в JAVA
У меня есть этот код,
@WebServlet(value="/initializeResources", loadOnStartup=1)
public class InitializeResources extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("HEREEEE");
}
}
но сервлет не запускается при запуске веб-приложения.
Как использовать загрузку при запуске аннотации сервлета?
мой API сервлета 3.0, и я использую Tomcat 7
3 ответов
С вами текущий код, вам нужно сделать запрос GET для просмотра вывода HEREEEE
.
если вы хотите что-то сделать при запуске сервлета (т. е. элемента loadOnStartup
со значением, большим или равным нулю,0
), вам нужно поместить код в метод init или в конструктор сервлета:
@Override
public void init() throws ServletException {
System.out.println("HEREEEE");
}
может быть удобнее использовать прослушиватель для запуска ресурса в область применения (в ServletContext
).
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class InitializeListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("On start web app");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("On shutdown web app");
}
}
например, см. Мой ответ на вопрос доля переменных между запросами JAX-RS.
@WebServlet(name="InitializeResources", urlPatterns="/initializeResources", loadOnStartup=1)
urlPatterns, чтобы убедиться, что веб-conatainer находит путь сервлета.
, когда loadOnStartup
указывается для сервлета, контейнер будет загружать и предварительно создавать экземпляр вашего сервлета, готовый к обработке любых запросов GET/POST, которые могут прийти. Это само по себе не вызовет doGet()
или doPost()
быть уволенным, потому что фактический запрос клиента еще не пришел для обработки. Тогда какой от него прок?
Ну loadOnStartup
обычно используется для сервлетов с тяжелым кодом инициализации; скажем, они могут сделать вызов JNDI для получения ресурса или вызов базы данных для заполнения локальной структуры данных некоторыми бэкэнд-значениями. В отсутствие loadOnStartup
самый первый запрос клиента может быть болезненно медленным из-за всех этих дополнительных инициализационных материалов и, следовательно, предварительного создания экземпляра имеет смысл.
теперь ваш пользовательский код инициализации (JNDI, JDBC) будет переопределен GenericServlet#init()
метод, который вызывается контейнером сервлета, чтобы указать сервлету, что он вводится в эксплуатацию.