servlet 和 web 服务之间的区别

Posted

技术标签:

【中文标题】servlet 和 web 服务之间的区别【英文标题】:Difference between servlet and web service 【发布时间】:2011-08-21 07:24:22 【问题描述】:

这两个有什么区别?我在谷歌上发现的结果很少,没有结论。

这是一个后续问题:

假设我创建了 spring mvc web 应用程序,使用 @Controller 注释来注释几个类,并创建一些可以成功地从前端 -> 后端传输一些信息的东西,反之亦然,也许后端可能涉及一些数据库。

你会怎么称呼它?休息网络服务或 servlet 或其他什么?

【问题讨论】:

忠告:如果您不知道 servlet 是什么,那么您可能会在使用 spring mvc(带有注释)时遇到困难。一个更简单的解决方案(vanilla servlet+jdbc)可能会帮助您更快地学习基础知识。 如果一个 servlet 只有一个有意义的行为并且该 servlet 被映射到一个明确的 URL,我看不出为什么 (1) GET 或 POST 参数不能发送到 Servlet (2) Servlet 的响应可能是返回具有适当 MIME 类型集 (3) 的 XML 负载,这不等同于学术意义上的 Web 服务? @GandalfStormCrow 使用 servlet 传递的实际数据不是数据,而是一个 html 文档。 html 文档更适合从人到计算机的请求,例如 1) 获取文档 2) 显示文档。但是,需要以独立于机器的方式进行应用程序之间的通信。因此,Web 服务讨论了通过 http 使用 xml 进行数据传输。 【参考方案1】:

Web 服务 是一种服务,它使用 REST 编程范式或 SOAP 协议向其客户端提供服务方法进行通信。有几种方法可以实现 Web 服务。编写 Web 服务的最简单方法是编写一个类并使用来自 javax.jws@WebService@WebMethod 注释对其进行注释,然后从 main 方法启动它:

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

结果是您可以在注册的 URL 上查看 WSDL,如果您有 SoapUI 或任何其他 SOAP 客户端,您还可以测试和使用您的 Web 服务。

另一方面,servlet 用于传输 HTTP 请求和响应。它可用于编写带有 JSP 和 HTML 的 Web 应用程序,或提供 XML 和 JSON 响应(如在 RESTful 服务中),当然也可用于接收和返回 SOAP 消息。您可以将其视为网络服务之下的一层。 Servlet 有自己的标准,目前是Java Servlet Specification Version 4.0

更全面和实用的方法是使用框架编写 Web 服务,并将其发布到应用程序服务器或 servlet 容器(如 Tomcat 或 JBoss)上。在这种情况下,您将使用 Servlet 来处理传输 SOAP 或 REST 消息的 HTTP 请求的传输。

要使用 servlet 技术编写 Web 服务,您可以使用 JAX-WS(例如 SOAP)。为了编写 RESTful 服务,您可以使用 JAX-RS(参考实现为 Jersey),或者您也可以使用 Spring WebMVC,但目前为止据我所知,这不是这个框架的主要目的,而且 Jersey 更容易使用。

关于第二个问题: @Controller 注释是一个 Spring 特定的原型注释,它告诉 Spring 你的 bean 应该做什么。控制器的方法究竟会返回什么取决于方法的实际实现,您可以将 Spring 配置为返回纯文本、HTML、JSON、XML、二进制数据或任何您想要的。

附注,用@Controller 注释的类还不是servlet,它只是一个bean。您如何使用 servlet 主要取决于您使用的框架。例如,当您使用 Spring 时,servlet 作业由 Springs DispatcherServlet 完成,后者又将请求转发到正确的 bean。如果您使用 Tomcat,那么您可以直接编写自己的 servlet,只需简单地继承 javax.servlet.http.HttpServlet 类并覆盖必要的方法,例如响应来自浏览器的 HTTP GET 请求的 doGet

【讨论】:

“REST 或 SOAP 作为其协议”...但 REST 不是协议!! 严格来说不是,它是一种编程范式。我已经更正了我的表述以反映这一点。 @lanoxx Web 服务 的目标是帮助一个企业应用程序轻松地与其他应用程序集成,假设这些新应用程序需要相互通信。 Enterprise application integration. Java Servlet 规范(现为 4.0)以上链接已失效,现在可以在新主页/github 上找到 javaee.github.io/servlet-spec/DOWNLOADS.html【参考方案2】:

您所描述的是一个网络应用程序,其中人类使用浏览器与软件系统进行交互。

Web 服务是软件系统使用 HTTP 和 XML 或 JSON 相互通信的一种方式,无需任何人参与。

servlet 是一种特定于 Java 的编写响应 HTTP 请求的软件的方式。 Spring MVC 抽象了很多实现细节以简化 Web 应用程序的编写,但在底层使用了 servlet。

【讨论】:

Web 应用程序风格的编程也可用于软件系统相互通信,但我认为这不是结构化的编程方式,也不是 IT 行业使用的标准。 【参考方案3】:

我的看法是 Web 服务定义了更高级别的抽象,例如一些业务特定的功能。而 Servlet 只是一个负责数据传输的软件实现组件。

Web 服务实现通常依赖 servlet 来接收数据。但是,它也可以使用它的自定义层来处理协议数据。

@Controller 与 Web Service 的关系可能比 servlet 更相关,而 servlet 又是一种实现传输的方式。

【讨论】:

@Controller 是 Spring Web MVC 框架的一部分(它是 C),所以它绝对不是一个 Web 服务的东西,但它也不是与 servlet 密切相关的。 我同意,@Controller 本身绝不是一个网络服务。但我个人倾向于经常使用@Controller 作为 REST 服务的端点。我怀疑这是 Spring MVC 不太流行的用法。【参考方案4】:

Servlet 和 Web Service 最明显的区别是: 您通过 HTTP 访问 servlet,同时通过 SOAP(简单对象)访问 Web 服务 访问协议)。 但是,实际上不能直接调用servlet,只能打开URL 连接并在调用者不在时将一些参数放入 servlet 你的申请。而且你不能限制调用者可以使用哪些参数 放。调用者不知道您的 servlet 可以接收哪些参数 任何一个。 所以,你最好使用 Web 服务为其他应用程序提供 API, Web 服务的 WSDL 文件可以为调用者提供足够的信息 调用您的网络服务。

【讨论】:

【参考方案5】:

servlet 是一个 HTTP 查询处理程序。您可以对传入的查询做任何您想做的事情。在 JVM 上运行的 servlet。

Web 服务与或多或少严格的协议相关联:接口 (API) 由可用方法及其参数和服务返回值定义。

此接口使用协议机制公开。这些协议与运行服务的主机无关:您可以使用 php、Java、C# 或您自己的语言定义相同的 Web 服务。您只需要一段代码能够理解协议查询并能够生成客户端可读的答案。

例如SOAP 是一个网络服务协议: ***定义:

SOAP,最初定义为 Simple 对象访问协议,是一种协议 交换规范 中的结构化信息 Web服务的实现 计算机网络。

【讨论】:

【参考方案6】:

Web 服务在比 servlet 更高的级别上运行。 Servlet 是简单的 API,提供编写服务器端组件的功能。

例如 RESTfull 是一个 Web 服务,它包含许多其他“功能”以及 servlet。 要部署,我们可以将 web.xml 定义为 -

<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>

这只是一个 servlet

【讨论】:

【参考方案7】:

Web Service 使用 ServletContainer 类,它又是一个 Servlet 类,它以干净和结构化的方式处理请求。 REST 代表 REpresentational STateless Protocol。这里的请求不会存储任何数据。

REST Web 服务支持 HTTP 方法

    GET - 通常用于获取数据。 POST - 插入新对象。 PUT - 更新现有对象。 DELETE - 删除对象。

我们可以将任意数量的 URL 映射到可以具有任意类型 HTTP 方法的 Web 服务类。

另一方面,每个 servlet 只能进行 1 个 URL 映射。 虽然通过请求参数条件可以达到最终的要求,但是现在使用 servlet 并不能提供干净的方式。

在 webservice 中,我们可以在 Class level 以及 Method level 定义 URL 路径,这允许我们以更结构化的方式进行编码。

【讨论】:

以上是关于servlet 和 web 服务之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

web容器 web服务器 servlet/jsp容器 之间的区别和关系是什么?

Servlet 教程 翻译

Rest API 和 Restful Web 服务之间的区别

Servlet

Web Service和Servlet的区别

各种容器和服务器之间的区别和联系