2016-11-29 44 views
0

我想在应用程序启动时调用init方法。初始化方法被调用两次java servlet

<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

提供您的通话客户端实现分析您的问题 – ScanQR

+0

ŧ这里很有可能你的servlet已经在两种不同的环境中初始化了。检查你的程序只有一个上下文。 – user1211

+0

@TechBreak浏览器是我的客户端 –

回答

2

你实际上是通过@WebServlet通过web.xml和一个创建Gateway Servlet类一个的两个实例(对象),所以init()正在(从每个实例之一)调用两次。默认情况下,一个servlet类应该有一个实例(除非你想以不同的方式运行)。

所以要解决这个问题,你有两个选择:

(1)拆下web.xml,并添加loadOnStartup=1@WebServlet,如下所示:@WebServlet(urlPatterns="/Gateway", loadOnStartup=1)

(2)在你的Gateway类删除@WebServlet(urlPatterns="/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> 
+0

是的,这是问题所在。谢谢。 –