首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >HTTP状态405 -此URL不支持HTTP方法

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

Stack Overflow用户
提问于 2011-03-21 02:52:32
回答 2查看 34.7K关注 1票数 22

我有以下servlet:

代码语言:javascript
复制
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中的映射如下

代码语言:javascript
复制
<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()的"service“,我的线程工作正常,但是我没有看到来自doGet()的"It Works”,并且我在浏览器中得到以下错误:

此URL不支持

HTTP方法GET

这是如何引起的,我如何解决它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-21 03:06:48

这是HttpServlet#doXxx()方法(doGet()doPost()doHead()doPut()等)默认实现的默认响应。这意味着,当servlet类中的doXxx()方法没有正确地作为@Overriden,或者当它通过super显式调用时,您将面临HTTP405 "Method not allowed“错误。

因此,您需要确保正确地声明了符合API的doXxx()方法,包括@Override注释,以确保您没有犯任何拼写错误。例如。

代码语言:javascript
复制
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ...
}

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

代码语言:javascript
复制
super.doGet(request, response);

您的servlet就有这个。只要去掉这一行,你的问题就会消失。

HttpServlet基本上遵循template method pattern,其中所有未覆盖的HTTP方法都返回此HTTP405错误"Method not supported“。当您覆盖这样的方法时,您应该调用 super方法,因为否则您仍然会得到HTTP405错误。同样的故事也适用于您的doPost()方法。

顺便说一句,这也适用于service(),但从技术上讲,这在这个构造中没有坏处,因为您需要它来让默认实现执行适当的方法。实际上,整个service()方法对您来说是不必要的,您只需从servlet中删除整个方法即可。

super.init();也是不必要的。只有在覆盖init(ServletConfig)时才需要,否则不会设置ServletConfigjavadoc中也明确提到了这一点。它是唯一需要super调用的方法。

与无关的servlet对于具体的问题来说,在这样的servlet中产生线程是一个糟糕的想法。要获得正确的方法,请访问How to run a background task in a servlet based web application?

票数 63
EN

Stack Overflow用户

发布于 2011-03-21 03:07:27

您已经覆盖了负责将调用委托给doGet或doPost的service方法。see this for more details

还要去掉super.doxxx(..)来自每个方法的调用。不要重写service方法,您应该在doGet中看到"It Works“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5370633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档