2014-09-01 70 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

相關問題