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

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

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;
    }
}

который отображается следующим образом в my 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, тогда я вижу "обслуживание" от doService() будучи зарегистрированным на консоли, и мой поток работает правильно, однако я не вижу "он работает" из doGet() регистрируется, и я получаю следующую ошибку в браузере:

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

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

2 ответов


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

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

super.doGet(req, resp);

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

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

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

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


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


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