【问题标题】:Servlet's service and init method are being called, but not doGet正在调用 Servlet 的 service 和 init 方法,但没有调用 doGet
【发布时间】:2014-09-01 14:55:15
【问题描述】:

我有一个简单的 Servlet,如下所示:

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,正如我所料。此外,浏览器中没有打印任何内容! (我希望它会说“它有效”)。

从昨天开始,我一直在努力解决这个问题。有没有人有任何建议,可能是什么问题?

【问题讨论】:

  • 问题是你覆盖service基本上破坏了servlet的正常流程。如果将 super.service(req, resp) 添加到覆盖的方法中,它将起作用。
  • @M.Deinum 谢谢!现在可以使用了!

标签: java eclipse servlets


【解决方案1】:

你为什么要覆盖服务方法。没有必要这样做。删除它,否则调用

super.service(request,response);

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

【讨论】:

  • 接受,并为解释 +1
猜你喜欢
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 2015-06-02
  • 2013-04-18
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
相关资源
最近更新 更多