supported soportado solucion servlet por not metodo method está estado esta error allowed servlets http-get http-status-code-405

servlets - soportado - Estado HTTP 405: el método HTTP GET no es compatible con esta URL



http method get is not supported by this url java servlet (2)

Tengo el siguiente 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; } }

Que se asigna de la siguiente manera en mi 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>

Cuando abro mi navegador (Chrome) en http://localhost:8080/MyServer/MyServlet , veo un "servicio" de doService() está registrando en la consola y mi tema funciona correctamente, pero no veo "It Works "de doGet() está registrando y doGet() el siguiente error en el navegador:

El método HTTP GET no es compatible con esta URL

¿Cómo se produce esto y cómo puedo solucionarlo?


Esta es la respuesta predeterminada de la implementación predeterminada de HttpServlet#doGet() . Esto significa que el método doGet() no está siendo correctamente @Override n, o se está llamando explícitamente.

Lo hizo correctamente @Override el método doGet() , pero sigue llamando explícitamente a la implementación predeterminada por razones poco claras.

super.doGet(req, resp);

Deshazte de esta línea y este problema desaparecerá.

El HttpServlet básicamente sigue el patrón de método de plantilla donde todos los métodos HTTP no anulados devuelven este error HTTP 405 "Método no compatible". Cuando reemplaza un método de este tipo, no debe llamar al método super , ya que de lo contrario obtendría el error HTTP 405. La misma historia continúa para su método doPost() .

Por cierto, esto también se aplica en service() , pero eso no es técnicamente perjudicial en esta construcción, ya que lo necesita para permitir que la implementación predeterminada ejecute los métodos adecuados. En realidad, el método service() completo no es necesario para usted, solo puede eliminar el método completo de su servlet.

El super.init(); También es innecesario. Solo es necesario cuando reemplaza el init(ServletConfig) , porque de lo contrario no se configuraría el ServletConfig . Esto también se menciona explícitamente en el javadoc . Es el único método que requiere una super llamada.

No relacionado con el problema concreto, generar una hebra en un servlet como ese es una mala idea. Para obtener el enfoque correcto, diríjase a ¿Cómo ejecutar una tarea en segundo plano en una aplicación web basada en servlet?


ha anulado el método de service que es responsable de delegar la llamada a doGet o doPost. ver esto para más detalles
También deshacerse de las llamadas super.doxxx (..) de cada método. No anule el método de service y debería ver "Funciona" de doGet.