我有这段代码,
@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
答案 0 :(得分:13)
使用当前代码,您需要执行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");
}
}
有关示例,请参阅我对Share variables between JAX-RS requests问题的回答。
答案 1 :(得分:5)
@WebServlet(name="InitializeResources", urlPatterns="/initializeResources", loadOnStartup=1)
urlPatterns以确保web conatainer找到servlet路径。
答案 2 :(得分:1)
当为Servlet指定loadOnStartup
时,容器只会加载并预先实例化您的Servlet实例,以便处理可能出现的任何GET / POST请求。这本身不会导致doGet()
或doPost()
被解雇,因为实际的客户端请求尚未进行处理。那么,它的用途是什么呢?
嗯,loadOnStartup
通常用于具有大量初始化代码的Servlet;比方说,他们可能会进行JNDI调用以获取资源或数据库调用,以使用一些后端值填充本地数据结构。在没有loadOnStartup
的情况下,由于所有这些额外的初始化内容,第一个客户端请求可能会非常缓慢,因此预先实例化它是有道理的。
现在,您的自定义初始化代码(JNDI,JDBC)将进入覆盖GenericServlet#init()
方法,该方法由servlet容器调用,以向servlet指示它正在投入使用。