HTTP Status 405 - метод HTTP GET не поддерживается этим URL - PullRequest
21 голосов
/ 20 марта 2011

У меня есть следующий сервлет:

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>

Когда я открываю свой браузер (Chrome) на http://localhost:8080/MyServer/MyServlet, я вижу, что «service» из doService() регистрируется на консоли, и мой поток работает правильно, однако я не вижу «It Works» из doGet() будучи зарегистрированным, и я получаю следующую ошибку в браузере:

Метод HTTP GET не поддерживается этим URL

Как это вызвано и как я могу это решить?

Ответы [ 2 ]

60 голосов
/ 20 марта 2011

Это ответ по умолчанию для реализации по умолчанию HttpServlet#doGet().Это означает, что метод doGet() неправильно является @Override n или явно вызывается.

Вы правильно сделали @Override метод doGet(), но вы все еще явно вызываете методреализация по умолчанию по непонятной причине.

super.doGet(req, resp);

Избавьтесь от этой строки, и эта проблема исчезнет.

HttpServlet в основном следует шаблонному методу шаблона , где всеНе переопределенные методы HTTP возвращают эту ошибку HTTP 405 «Метод не поддерживается».Когда вы переопределяете такой метод, вы должны , а не вызывать super метод, потому что в противном случае вы все равно получите ошибку HTTP 405.Та же самая история продолжается для вашего doPost() метода.

Кстати, это также относится к service(), но это технически не вредит этой конструкции, так как вам нужно , чтобы позволитьреализация по умолчанию выполняет надлежащие методы.На самом деле, весь метод service() вам не нужен, вы можете просто удалить весь метод из вашего сервлета.

super.init(); также не нужен.Это необходимо только при переопределении init(ServletConfig), потому что в противном случае ServletConfig не будет установлен.Это также явно , упомянутое в javadoc .Это единственный метод, требующий вызова super.


Не связанный с конкретной проблемой, порождая поток в сервлете, как это, плохая идея.Для правильного подхода обратитесь к Как запустить фоновую задачу в веб-приложении на основе сервлетов?

0 голосов
/ 20 марта 2011

вы переопределили метод service, который отвечает за делегирование вызова doGet или doPost. см. Подробности
Также избавьтесь от вызовов super.doxxx (..) из каждого метода.Не переопределяйте метод service, и вы должны увидеть «Это работает» из doGet.

...