繁体   English   中英

调用Servlet的服务和init方法,但不调用

[英]Servlet's service and init method are being called, but not doGet

我有一个看起来像这样的简单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如我所料。 另外,浏览器中什么也不会打印出来! (我希望它说“有效”)。

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

您为什么要覆盖服务方法。 没有必要。 删除它,否则打​​电话

super.service(request,response);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM