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()
метод не является должным образом @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
звонок.
связаны к конкретная проблема, нерест нити в сервлете, как это плохая идея. Для правильного подхода, голова как запустить фоновую задачу в веб-приложении на основе сервлета?
вы переопределили service
метод, который отвечает за делегирование вызова doGet или doPost. посмотреть подробнее
Также избавьтесь от super.doxxx(..) вызовы от каждого метода.
Не переопределяйте service
метод, и вы должны увидеть, "он работает" от doGet.