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

Cec*_*oCQ 22 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 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的映射如下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>
Run Code Online (Sandbox Code Playgroud)

当我打开我的浏览器(Chrome)http://localhost:8080/MyServer/MyServlet,然后我看到"服务"从doService()登录控制台和我的线程正常工作,但我没有看到"It Works" doGet()被记录,我在浏览器中收到以下错误:

此URL不支持HTTP方法GET

这是怎么造成的,我该如何解决?

Bal*_*usC 60

这是默认实现的默认响应HttpServlet#doGet().这意味着该doGet()方法没有正确地为@Overriden,或者它被明确地调用.

您正确地执行@Override了该doGet()方法,但您仍然明确地调用默认实现,原因不明.

super.doGet(req, resp);
Run Code Online (Sandbox Code Playgroud)

摆脱这条线,这个问题就会消失.

HttpServlet基本遵循模板方法模式,所有非重写HTTP方法返回此HTTP 405错误"不支持方法".当你重写这样的方法,你应该调用super方法,因为否则你将仍然得到HTTP 405错误.你的doPost()方法也有同样的故事.

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

super.init();也是不必要的.只有在覆盖时才需要它init(ServletConfig),因为否则ServletConfig将不会设置.这也在javadoc中明确提到.这是唯一需要通话的方法.super


具体问题无关,在这样的servlet中生成一个线程是一个坏主意.要获得正确的方法,请转到如何在基于servlet的Web应用程序中运行后台任务?