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;
}
}
Который отображается в следующем 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()
метод не является должным образом @Override
п, или это явно вызывается.
Вы сделали правильно @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.