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

问题描述 投票:22回答:2

我有以下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;
    }
}

哪个映射到我的web.xml

<display-name>MyServer</display-name>
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.myserver.MyServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>      
   <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/MyServlet</url-pattern>
</servlet-mapping>

[当我在http://localhost:8080/MyServer/MyServlet上打开浏览器(Chrome)时,我看到doService()的“服务”正在登录控制台,并且我的线程正常工作,但是我看不到doGet()的“它有效”登录,并且在浏览器中出现以下错误:

此URL不支持HTTP方法GET

这是怎么引起的,我该如何解决?

servlets http-get http-status-code-405
2个回答
60
投票

这是HttpServlet#doXxx()方法(doGet()doPost()doHead()doPut()等)的默认实现的默认响应。这意味着,当doXxx()方法在servlet类中未正确地为@Override n时,或者通过super显式调用时,您将遇到HTTP 405“不允许使用方法”错误。

因此,您需要确保正确声明了符合API的doXxx()方法,包括@Override批注只是为了确保您没有输入任何错字。例如:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ...
}

而且您还需要确保不要在servlet方法中调用super.doXxx()

super.doGet(request, response);

您的servlet有这个。只需摆脱这条线,您的问题就会消失。

HttpServlet基本上跟在template method pattern之后,其中所有未覆盖的HTTP方法都返回此HTTP 405错误“ Method not support”。覆盖此类方法时,应not调用super方法,因为否则您仍然会收到HTTP 405错误。您的doPost()方法也是如此。

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

super.init();也是不必要的。仅当您覆盖init(ServletConfig)时才有必要,因为否则将不会设置ServletConfig。在javadoc中也提到了[[明确]]。这是唯一需要super调用的方法。


Unrelated

处理具体问题,在servlet中生成这样的线程是一个坏主意。要获得正确的方法,请转到How to run a background task in a servlet based web application?


0
投票
您已重写service方法,该方法负责将调用委派给doGet或doPost。see this for more details还要摆脱每种方法的super.doxxx(..)调用。不要覆盖service方法,您应该在doGet中看到“它有效”。
© www.soinside.com 2019 - 2024. All rights reserved.