Servlets HTTP状态405-此URL不支持HTTP方法

Servlets HTTP状态405-此URL不支持HTTP方法,servlets,http-get,http-status-code-405,Servlets,Http Get,Http Status Code 405,我有以下servlet: public class MyServlet extends HttpServlet { private static final long serialVersionUID = 16252534; private static int ping = 3000; private Thread t; private static boolean shouldStop = false; @Override public v

我有以下servlet:

public class MyServlet extends HttpServlet {

    private static final long serialVersionUID = 16252534;
    private static int ping = 3000;
    private Thread t;
    private static boolean shouldStop = false;

    @Override
    public void init() throws ServletException {
        super.init();

        t = new Thread(new Runnable() { 
            @Override
            public void run() {
                while(!shouldStop) {
                    System.out.println("Now:" + System.currentTimeMillis());
                    try {
                        Thread.sleep(ping);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        t.start();

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

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

    }

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

    }

    @Override
    public void destroy() {
        super.destroy();
        System.out.println("Destroy servlet");
        shouldStop = true;
    }
}
当我在
http://localhost:8080/MyServer/MyServlet
,然后我在控制台上看到从
doService()
登录的“服务”,我的线程正常工作,但是我没有看到从
doGet()
登录的“服务”,我在浏览器中看到以下错误:

此URL不支持HTTP方法GET


这是如何导致的,我如何解决它?

这是
HttpServlet\doXxx()
方法(
doGet()
doPost()
doHead()
doPut()
等)的默认实现的默认响应。这意味着,当servlet类中的
doXxx()
方法未正确地被
@Override
n调用,或者通过
super
显式调用时,您将面临HTTP 405“method not allowed”错误

因此,您需要确保在API中正确声明了
doXxx()
方法,包括
@Override
注释,以确保您没有输入任何错误。例如

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ...
}
您还需要确保永远不要在servlet方法中调用
super.doXxx()

super.doGet(request, response);
您的servlet具有以下功能。只要摆脱这条线,你的问题就会消失

HttpServlet的
HttpServlet
基本上遵循所有未重写的HTTP方法返回HTTP 405错误“Method not supported”(方法不受支持)。当您重写这样一个方法时,您应该调用
super
方法,否则您仍然会得到HTTP405错误。您的
doPost()
方法也是如此

顺便说一句,这也适用于
service()
,但这在技术上不会对这个构造造成伤害,因为您需要它来让默认实现执行正确的方法。实际上,整个
service()
方法对您来说是不必要的,您可以从servlet中删除整个方法

super.init()也是不必要的。只有在重写
init(ServletConfig)
时才需要它,否则将无法设置
ServletConfig
。这一点在报告中也有明确提及。这是唯一需要
super
调用的方法



与具体问题无关,在servlet中生成这样的线程是个坏主意。要获得正确的方法,请转到

您已经覆盖了负责将调用委托给doGet或doPost的
服务
方法
还可以从每个方法中去掉super.doxxx(..)调用。
不要覆盖
服务
方法,您应该会看到doGet中的“它可以工作”。

非常感谢。我使用了ServletContextListener。一个问题:为什么在servlet中使用线程是一个坏主意?这不一定是坏主意,但编写代码的方式永远会消耗100%的CPU资源。您应该使用一个线程池和一个调度程序,如链接答案中所述。而且,
ServletContextListener
是在webapp启动和关闭期间执行全局初始化和清理的正确位置。
super.doGet(request, response);