Diferencia entre servlet y servicio web

88

¿Cuál es la diferencia entre estos 2? Encontré pocos resultados en google, nada concluyente.

Aquí hay una pregunta de seguimiento:

Digamos que creo la aplicación web spring mvc, anoto un par de clases con la anotación @Controller y creo algo que transferirá con éxito cierta información desde el front-end -> back-end y viceversa y tal vez alguna base de datos podría estar involucrada en el back-end.

¿Cómo llamarías a eso? ¿Descansar servicio web o servlet o algo más?

Gandalf StormCrow
fuente
6
Un consejo: si no sabe qué es un servlet, es probable que tenga problemas con spring mvc (con anotaciones). Una solución más simple (servlet vanilla + jdbc) probablemente lo ayudará a aprender los conceptos básicos más rápido.
biziclop
1
Si un servlet tiene solo un comportamiento significativo y ese servlet está mapeado a una URL explícita, no veo ninguna razón por la cual (1) los parámetros GET o POST no se pudieron enviar al Servlet (2) La respuesta del Servlet podría ser devolver una carga de XML con un conjunto de tipos MIME apropiado (3) que esto no equivale a un servicio web en el sentido académico?
8bitjunkie
@GandalfStormCrow Con servlet, los datos reales que se pasan no son datos, sino un documento html. html document es más apropiado para solicitudes como 1) obtener el documento 2) mostrar el documento , de humano a computadora. Pero, la necesidad era la comunicación aplicación-aplicación de una manera independiente de la máquina. Entonces, el servicio web habla de la transferencia de datos usando xml sobre http.
sobreintercambio

Respuestas:

90

Un servicio web es un servicio que proporciona métodos de servicio a sus clientes utilizando el paradigma de programación REST o el protocolo SOAP para la comunicación. Hay varias formas de implementar un servicio web. La forma más sencilla de escribir un servicio web sería escribir una clase y anotarla con las anotaciones @WebServicey @WebMethodde javax.jws, y luego lanzarlo desde un mainmétodo-con:

Endpoint.publish("http://localhost:8089/myservice", new MyWebService());

El resultado es que puede ver el WSDL en la URL registrada y si tiene SoapUI o cualquier otro cliente SOAP, también puede probar y utilizar su servicio web.

Por otro lado, un servlet se utiliza para transportar solicitudes y respuestas HTTP . Puede usarse para escribir una aplicación web con JSP y HTML, o para servir respuestas XML y JSON (como en un servicio RESTful) y, por supuesto, también para recibir y devolver mensajes SOAP. Puede pensar en ello como una capa por debajo de los servicios web . Los servlets tienen su propio estándar, que actualmente es Java Servlet Specification Versión 4.0

Un enfoque más completo y práctico es escribir un servicio web con un marco y publicarlo en un servidor de aplicaciones o contenedor de servlets como Tomcat o JBoss. En este caso, usaría un Servlet para manejar el transporte de las solicitudes HTTP que transmiten sus mensajes SOAP o REST.

Para escribir un servicio web con tecnología servlet, puede utilizar, por ejemplo, JAX-WS (por ejemplo, para SOAP). Para escribir servicios RESTful, puede usar JAX-RS (con la implementación de referencia siendo Jersey ), o alternativamente puede usar Spring WebMVC , pero hasta donde yo sé, ese no es el propósito principal de este marco y Jersey es considerablemente más fácil de usar.

Con respecto a la segunda pregunta: la @Controlleranotación es una anotación de estereotipo específica de Spring que le dice a Spring algo sobre lo que se supone que debe hacer su bean. Lo que devolverá exactamente un método de un controlador depende de la implementación real de sus métodos, puede configurar Spring para que devuelva texto sin formato, HTML, JSON, XML, datos binarios o lo que quiera.

Una nota al lado, una clase que está anotada @Controllertodavía no es un servlet, es simplemente un bean. La forma de utilizar los servlets depende principalmente del Framework que utilice. Por ejemplo, cuando usa Spring, el trabajo del servlet lo realiza Springs, DispatcherServletque a su vez reenvía las solicitudes a los beans correctos. Si usa Tomcat, puede escribir directamente sus propios servlets simplemente subclasificando la javax.servlet.http.HttpServletclase y sobrescribiendo los métodos necesarios, como el doGetque responde a las solicitudes HTTP GET de su navegador.

lanoxx
fuente
3
"REST o SOAP como su protocolo" ... ¡¡Pero REST no es un protocolo !!
No es un error
3
Hablando enérgicamente no lo es, es un paradigma de programación. He corregido mi formulación para reflejar eso.
lanoxx
@lanoxx El objetivo de un servicio web es ayudar a integrar una aplicación empresarial con otra fácilmente, asumiendo que esas aplicaciones recientemente necesitan comunicarse entre sí. Integración de aplicaciones empresariales .
sobreintercambio
El enlace anterior a la especificación de Java Servlet (ahora 4.0) está muerto, ahora se puede encontrar en una nueva página de inicio / github en javaee.github.io/servlet-spec/DOWNLOADS.html
Manohar Reddy Poreddy
43

Lo que está describiendo es una aplicación web , donde un humano usa un navegador para interactuar con un sistema de software.

Un servicio web es una forma de que los sistemas de software se comuniquen entre sí mediante HTTP y XML o JSON, sin la participación de seres humanos.

Un servlet es una forma específica de Java de escribir software que responde a las solicitudes HTTP. Spring MVC abstrae muchos de los detalles de implementación para facilitar la escritura de aplicaciones web, pero usa servlets debajo de las cubiertas.

Artbristol
fuente
El estilo de programación de aplicaciones web también se puede utilizar para que los sistemas de software se comuniquen entre sí, pero supongo que no es una forma estructurada de programación y no es el estándar utilizado en la industria de las TI.
Mohamed Iqzas
10

Mi opinión sería que Web Service define una abstracción de nivel superior, como algunas funciones específicas de la empresa. Si bien Servlet es solo un componente de implementación de software responsable del transporte de datos.

La implementación del servicio web normalmente dependería del servlet para recibir datos. Sin embargo, también puede usar su capa personalizada para tratar con datos de protocolo.

@Controller probablemente esté más relacionado con el servicio web que con el servlet, que es, nuevamente, una forma de implementar el transporte.

Alex Gitelman
fuente
1
@Controlleres parte del marco Spring Web MVC (es la C), por lo que definitivamente no es una cosa de servicio web, pero tampoco está estrechamente relacionado con los servlets.
biziclop
Estoy de acuerdo, @Controller no es de ninguna manera un servicio web en sí mismo. Pero personalmente tiendo a usar @Controller a menudo como un punto final para los servicios REST. Sospecho que es un uso menos popular de Spring MVC.
Alex Gitelman
3

La diferencia más obvia entre Servlet y Web Service es: Usted accede al servlet a través de HTTP mientras accede al Web Service a través de SOAP (Protocolo simple de acceso a objetos). Pero, de hecho, no puede invocar directamente un servlet, solo puede abrir una conexión URL y poner algún parámetro en el servlet si la persona que llama está fuera de su aplicación. Y no puede restringir qué parámetros puede poner la persona que llama. La persona que llama tampoco sabe qué parámetros puede recibir su servlet. Por lo tanto, es mejor que use el servicio web para proporcionar API a otras aplicaciones, el archivo WSDL de su servicio web puede proporcionar a la persona que llama suficiente información para invocar su servicio web.

Chinni
fuente
2

Un servlet es un controlador de consultas HTTP. Puede hacer lo que quiera con sus consultas entrantes. Un servlet que se ejecuta en la JVM.

Un servicio web está ligado a un protocolo más o menos rígido: una interfaz (API) se define con los métodos disponibles y sus argumentos y valores de retorno para el servicio.

Esta interfaz se expone mediante los mecanismos del protocolo. Estos protocolos son independientes del host que ejecutará el servicio: puede definir el mismo servicio web utilizando PHP, Java, C # o su propio lenguaje. Solo necesita tener un fragmento de código capaz de comprender las consultas del protocolo y de producir respuestas legibles por el cliente.

Por ejemplo, SOAP es un protocolo de servicio web: definición de Wikipedia:

SOAP, originalmente definido como Protocolo simple de acceso a objetos, es una especificación de protocolo para el intercambio de información estructurada en la implementación de servicios web en redes informáticas.

Guillaume
fuente
2

Los servicios web operan a un nivel más alto que los servlets. Los servlets son API que son simples y brindan capacidades para escribir componentes del lado del servidor.

Por ejemplo, RESTfull es un servicio web que contiene muchas otras "funciones" junto con el servlet. Para implementar, podemos definir el web.xml como -

<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>jersey.rest.test</param-value>
</init-param>
<load-on-startup>1</load-on-startup>

que no es más que un servlet

dgm
fuente
2

El servicio web usa la clase ServletContainer, que nuevamente es una clase Servlet, que maneja la solicitud de manera limpia y estructurada. REST son las siglas de REpresentational STateless Protocol. Aquí la solicitud no almacenará ningún dato.

El servicio web REST admite métodos HTTP

  1. OBTENER : generalmente para recuperar datos.
  2. ENVIAR : para insertar un nuevo objeto.
  3. PONER : para actualizar el objeto existente.
  4. BORRAR -Para eliminar el Objeto.

Podemos asignar cualquier número de URL a la clase de servicio web que puede tener cualquier tipo de métodos HTTP.

Por otro lado, solo se puede realizar una asignación de URL para cada servlet. Aunque el requisito final se puede lograr con la ayuda de las condiciones del parámetro de solicitud, el uso de servlet hoy en día no proporcionará una forma limpia.

En el servicio web podemos definir la ruta URL a nivel de clase así como a nivel de método , lo que nos permite codificar de forma más estructurada.

Kranti123
fuente