HTTP 状态 405 - 此 URL 不支持 HTTP 方法 [英] HTTP Status 405 - HTTP method is not supported by this URL

查看:59
本文介绍了HTTP 状态 405 - 此 URL 不支持 HTTP 方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下 servlet:

I have the following 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() 中的It Works"正在被记录,我在浏览器中收到以下错误:

When I open my browser (Chrome) on http://localhost:8080/MyServer/MyServlet, then I see "service" from doService() being logged on console and my thread works correctly, however I don't see "It Works" from doGet() being logged and I get the following error in the browser:

此 URL 不支持 HTTP 方法 GET

HTTP method GET is not supported by this URL

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

How is this caused and how can I solve it?

推荐答案

这是HttpServlet#doXxx()方法(doGet()默认实现的默认响应>、doPost()doHead()doPut() 等).这意味着当 doXxx() 方法在您的 servlet 类中没有正确地被 @Overriden 使用时,或者当它被显式地通过 super,那么您将面临 HTTP 405 "Method not allowed" 错误.

This is the default response of the default implementation of HttpServlet#doXxx() method (doGet(), doPost(), doHead(), doPut(), etc). This means that when the doXxx() method is not properly being @Overriden in your servlet class, or when it is explicitly being called via super, then you will face a HTTP 405 "Method not allowed" error.

因此,您需要确保正确声明了 doXxx() 方法符合 API,包括 @Override 注释只是为了确保您没有'不要打错字.例如

So, you need to make sure that you have the doXxx() method properly declared conform the API, including the @Override annotation just to ensure that you didn't make any typos. E.g.

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

并且您还需要确保您永远不会在您的 servlet 方法中调用 super.doXxx():

And you also need to make sure that you don't ever call super.doXxx() in your servlet method:

super.doGet(request, response);

你的 servlet 有这个.只要去掉这条线,你的问题就会消失.

Your servlet has this. Just get rid of this line and your problem shall disappear.

HttpServlet 基本上遵循 模板方法模式,其中所有未覆盖的 HTTP 方法返回此 HTTP 405 错误不支持方法".当您覆盖这样的方法时,您应该不要调用 super 方法,否则您仍然会收到 HTTP 405 错误.您的 doPost() 方法也是如此.

The HttpServlet basically follows the template method pattern where all non-overridden HTTP methods returns this HTTP 405 error "Method not supported". When you override such a method, you should not call super method, because you would otherwise still get the HTTP 405 error. The same story goes on for your doPost() method.

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

This also applies on service() by the way, but that does technically not harm in this construct since you need it to let the default implementation execute the proper methods. Actually, the whole service() method is unnecessary for you, you can just remove the entire method from your servlet.

super.init(); 也是不必要的.仅当您覆盖 init(ServletConfig) 时才需要,否则将不会设置 ServletConfig.这也在javadoc.这是唯一需要 super 调用的方法.

The super.init(); is also unnecessary. It's is only necessary when you override the init(ServletConfig), because otherwise the ServletConfig wouldn't be set. This is also explicitly mentioned in the javadoc. It's the only method which requires a super call.

与具体问题无关,像这样在 servlet 中生成一个线程是个坏主意.如需正确的方法,请前往 How在基于 servlet 的 Web 应用程序中运行后台任务?

Unrelated to the concrete problem, spawning a thread in a servlet like that is a bad idea. For the correct approach, head to How to run a background task in a servlet based web application?

这篇关于HTTP 状态 405 - 此 URL 不支持 HTTP 方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆