在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指示它正在投入使用。