2014-09-01 51 views
1

我有一个简单的Servlet,看起来像这样:Servlet的服务和init方法被调用,但不是的doGet

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class Bla extends HttpServlet { 

    private static final long serialVersionUID = 16252534; 

    @Override 
    public void init() throws ServletException { 
     System.out.println("init"); 
    } 
    @Override 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
     System.out.println("doGet"); 
     resp.setContentType("text/html"); 
     PrintWriter out = resp.getWriter(); 
     out.println("<html><h1>It works!!</h1></html>"); 
    } 

    @Override 
    public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException { 
     System.out.println("service"); 

    } 

    @Override 
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     System.out.println("doPost"); 
    } 

    @Override 
    public void destroy() { 
     System.out.println("Destroy servlet"); 
    } 
} 

的web.xml,看起来像这样:

<?xml version="1.0" encoding="UTF-8" ?> 

<web-app> 
    <display-name>Archetype Created Web Application</display-name> 

    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 

    <servlet> 
     <servlet-name>Bla</servlet-name> 
     <servlet-class>instrurental_proj.servlets.Bla</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Bla</servlet-name> 
     <url-pattern>/bla</url-pattern> 
    </servlet-mapping> 
</web-app> 

当我访问url http://localhost:8080/instrurental/bla时,在控制台中打印出以下内容:

init 
service 

,但不是我所期望的doGet。另外,浏览器中没有任何东西被打印出来! (我期待它说“它有效”)。

自昨天以来,我一直在努力解决这个问题。有没有人有任何建议,问题是什么?

+3

问题是你重载'服务'基本上破坏了servlet的正常流程。如果你添加'super.service(req,resp)'到你重写的方法,它就会起作用。 – 2014-09-01 14:56:53

+0

@ M.Deinum谢谢!它现在有效! – CodyBugstein 2014-09-01 15:01:26

回答

4

为什么你重写服务方法。这是没有必要的。删除否则打电话

super.service(request,response); 

原因
尝试看看的HttpServlet的类的源代码。在那里您会看到,根据用于调用servlet的方法,即GET/POST,将调用必要的方法doGet()或doPost()。当容器实际收到一个请求时,它启动一个新线程,并通过调用service()方法为客户端服务。因此,如果你重写它,并且不调用超类的服务方法或定义你自己的策略,那么GET将被调用,doGet()方法将永远不会被调用。你的请求永远不会调用doGet()方法,它调用它的service()方法。

+0

接受,和+1的解释 – CodyBugstein 2014-09-01 15:30:31

相关问题