我想在应用程序启动时调用init方法。
<servlet>
<servlet-name>servletTest</servlet-name>
<servlet-class>com.gateway.Gateway</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
以上是我的代码。但奇怪的是,init方法被调用两次。 下面是我的servlet代码。任何帮助将不胜感激。
@WebServlet("/Gateway")
public class Gateway extends HttpServlet {
private static final long serialVersionUID = 1L;
public Gateway() {
super();
}
public void init(ServletConfig config) throws ServletException {
System.out.println("Init called");
}
public void destroy() {
System.out.println("Destroy called");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Received a Request");
response.getWriter().append("Served at: ").append(request.getContextPath());
}
}
答案 0 :(得分:3)
您实际上正在创建Gateway
Servlet类的两个实例(对象)到web.xml
和一个到@WebServlet
,所以init()
被调用两次(每个实例一个)。默认情况下,servlet类应该有一个实例(除非你想以不同的方式运行)。
所以要解决这个问题,你有两个选择:
(1)移除web.xml
并将loadOnStartup=1
添加到@WebServlet
,如下所示:@WebServlet(urlPatterns="/Gateway", loadOnStartup=1)
(2)删除@WebServlet(urlPatterns="/Gateway")
类中的Gateway
并在web.xml
中配置servlet,如下所示:
<servlet>
<servlet-name>Gateway</servlet-name>
<servlet-class>com.gateway.Gateway</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Gateway</servlet-name>
<url-pattern>/Gateway</url-pattern>
</servlet-mapping>