在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"); } } 

但是,当Web应用程序启动时,servlet无法启动。

如何在Servlet Annotation上启动加载?

我的Servlet API是3.0,我使用Tomcat 7

使用当前代码,您需要执行GET请求以查看输出HEREEEE

如果你想在servlet的启动时做一些事情(即元素loadOnStartup的值大于或等于0 ),你需要将代码放在init方法或servlet的构造函数中:

 @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确保web conatainer找到servlet路径。

当为Servlet指定了loadOnStartup ,容器只会加载并预先实例化Servlet实例,以便处理可能出现的任何GET / POST请求。 这本身不会导致doGet()doPost()被触发,因为实际的客户端请求尚未进行处理。 那么,它的用途是什么呢?

好吧, loadOnStartup通常用于具有大量初始化代码的Servlet; 比如,他们可能会进行JNDI调用以获取资源或数据库调用,以使用某些后端值填充本地数据结构。 在没有loadOnStartup的情况下,由于所有这些额外的初始化内容,第一个客户端请求可能会非常缓慢,因此预先实例化它是有意义的。

现在,您的自定义初始化代码(JNDI,JDBC)将进入覆盖的GenericServlet#init()方法,该方法由servlet容器调用,以向servlet指示它正在投入使用。