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容器 之间的区别和关系是什么?