2011-07-25 12 views
12

Estaba leyendo un libro sobre servlets, en ese libro se proporciona una breve explicación acerca de la clase servlet, así como de la clase HttpServlet.¿Debo anular el servicio() o doPost()?

Hay un ejemplo para rellenar un formulario: para ese formulario, la clase anula el método doPost() del servlet. Pero para otro ejemplo de un formulario de inicio de sesión, el método service() se reemplaza en su lugar.

Quiero saber por qué los 2 enfoques diferentes, pensé que por lo general ponemos nuestro código personalizado en doPost() (o doGet()) y dejamos que service() permanezca como está. ¿Hay alguna razón detrás de usar cualquiera de los 2 enfoques, o puedo usar ambos enfoques en cualquier situación?

+2

no sería código

protected void service(HttpServletRequest req, HttpServletResponse resp) { String method = req.getMethod(); if (method.equals(METHOD_GET)) { doGet(req, resp); } else if (method.equals(METHOD_HEAD)) { doHead(req, resp); } else if (method.equals(METHOD_POST)) { doPost(req, resp); } else if (method.equals(METHOD_PUT)) { doPut(req, resp); } else if (method.equals(METHOD_DELETE)) { doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) { doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) { doTrace(req,resp); } else { resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); }} 

implementación dada por Tomasz Nurkiewicz de la comunidad SO sorprendido si el libro solo intentaba mostrar ejemplos de diferentes formas de usar un servlet, en lugar de decir "DEBERÍAS hacer esto o hacer eso". Porque realmente, si está desarrollando una aplicación seria, eventualmente querrá estudiar e implementar un marco MVC (como Struts, Spring o Wicket) en lugar de implementar cosas a nivel de servlet. (Solo una sugerencia para futuras lecturas) – Marvo

Respuesta

13

No anule el método service(). El enfoque preferido es usar doPost() para publicar y doGet() para obtener. Aquí hay una publicación excelente sobre lo que hace cada uno. http://www.jguru.com/faq/view.jsp?EID=47730

Si tiene que responder a las solicitudes hechas por un cliente que no está utilizando el protocolo HTTP , debe utilizar el servicio().

1

Es muy probable que anule el método doXXX() donde XXX representa los métodos HTTP como GET, POST, y así sucesivamente. El método service() invocado por el contenedor decidirá a cuál de los doXXX() se llamará.

4

Creo que necesita comprender el flujo para poder decidir por usted mismo. La implementación predeterminada de service() para un HttpServlet simplemente llama al controlador apropiado para el método de solicitud (GET, POST, lo que sea).

Debe sobrescribir service() cuando desee que el mismo método maneje todos los métodos entrantes (no importa si se trata de una solicitud GET, PUT o POST, usted responderá igual a todos). Si está contento con tratar cada método por separado, vaya con la implementación de service() predeterminada y anule los manejadores específicos.

0

Si debe responder a las solicitudes GET o POST realizadas por un cliente de protocolo HTTP (generalmente un navegador), no dude en extender HttpServlet y utilizar sus métodos de conveniencia. Si tiene que responder a las solicitudes hechas por un cliente que no está utilizando el protocolo HTTP, debe utilizar el servicio()

1

El método service() pertenece a GenericServlet y puede sobrecargarse para soportar cualquier tipo de protocolo como Http, Ftp etc.

Luego tiene un servlet especializado para manejar HttpProtocol, lo llamamos HttpServlet. El HttpServlet también proporciona implementación predeterminada para los métodos service() y doGet() y doPost().

¿Por qué no debemos anular el método service()?

Dado que no es una buena práctica anular el método de servicio. Si llamamos a cualquiera de los métodos doxxx, entonces internamente llamará al método de servicio del HttpServlet. Entonces no hay necesidad de que lo llames explícitamente.

orden de ejecución de servicio():

servicio (ServletRequest, ServletResponse) ->

-> Llamadas

-> servicio (HttpServletRequest req, res HttpServletResponse)

-> llamadas

-> doGet/doPost (HttpServletRequest req, HttpServletRespo res NSE)

Así es como se puede anular el servicio en caso de que desee: sólo se Overriding Service Method

Cuestiones relacionadas