6

我是 Web 服务的新手,正在阅读Martin Kalin的Java Webservices一书。我已经完成了它最初的基本概念并且有一个问题:

Sayproducer将 HTTP 请求(包含 SOAP 消息信封)发送到 Java Web 服务 ( consumer)。请求是否由 Servlet 内部处理,它提取 SOAP 消息并将其转换为相应的 Java 域对象,然后调用服务实现 bean?

这个问题是通用的,与 Metro 和 Axis 等任何现成的框架无关。只需考虑以下代码

 Endpoint.publish("webserviceURL", new CustomerServiceImpl())

现在,如果消费者将请求发送到webserviceURL,它是由 Servlet 始终在入口点处理还是以其他方式处理?(因为这是在任何 Web 应用程序中处理 Web 请求的方式)

4

3 回答 3

5

Servlet 是一个 Java 类,可以接收 HTTP 请求并返回响应,对吗?

话虽如此,您可以(如果您真的doGet()想要的话)只使用 Servlet(使用它的方法和)编写一个成熟的 Web 服务doPost()

例如,您将逐字节获取 HTTP 请求,将其转换为 a String,将其解析为 XML 文件,然后将其解释为 SOAP 信封(我们称之为“管道工作”),然后才开始处理实际请求(首先是您真正想要的)。

处理完实际请求后,您必须做更多的管道工作来将对象转换回 XML 和 SOAP 信封(并且不要忘记处理最终错误/异常的麻烦)。

你问:

请求是否由 servlet 在内部处理,它提取肥皂消息并将其转换为相应的 java 域对象 (...)

答案是否定的。doGet()Servlet 除了接收字节并让您在 Java 方法(例如或doPost())中操作它们之外什么也不做。您可以手动执行此操作,但将数据转换为域对象通常由Web 服务框架完成。

现在,如果消费者将请求发送到 Web 服务 URL,它是由 servlet 始终在入口点处理还是以其他方式处理?

第一个。它总是由入口点的 Servlet 处理。但你可能会问:

那么,像 JAX-RS、Spring-WS 或 JAX-RS 这样的 Web 服务 API 有什么意义呢?

所有 Java 著名的 Web 服务 API 都建立在 Servlet API 之上

Servlet 确实是第一个处理请求的,但是这种“处理”很少:正如我所说,它们只获取 HTTP 请求位并让您将它们作为 Java 方法使用。

之后,WS 框架可以为您完成许多其他的管道工作。例如,他们可以获取 HTTP POST 请求并Bytes<->XML<->SOAP Envelope<->Objects以透明的方式对您进行所有转换。它们还将帮助您定义标准故障信封、自动生成 WSDL 文件以及其他一切。

底线:

您可以仅使用 Servlet 自己完成所有这些工作,但使用 Web 服务框架,您不必担心所需的所有管道工作,只需创建方法来处理实际请求。

编辑:

明确一点:Servlet绝不是使用 Java 处理 HTTP 请求的唯一方法。

不过,它们是 Java EE 中执行此操作的某种标准方式,因为它们是Java EE API中稳定和无可争议的一种,但当然还有其他方式——总是有的。

我说的是最著名的框架是建立在 Servlet API 之上的,仅举几例:

  • JAX-RS:
    • 地铁
    • 轴 2
    • CXF
    • JBossWS
  • JAX-RS:
    • 球衣,
    • 高枕无忧;
    • CXF,
    • Restlet(名字说明了一切......)
  • 其他:
    • 弹簧-WS,
    • 春天MVC。

正如我所说,这只是指出一些。

于 2013-05-05T01:24:07.517 回答
2

请求由可以处理 HTTP 请求的事物处理,句号。

使用 servlet 或过滤器很方便,因为管道已经以 servlet/应用程序容器的形式为您编写好了,但这不是必需的。例如,在 Netty 上运行的服务不需要遵循 servlet 规范。(虽然 IIRC 有一层允许 Netty 直接调用 servlet。)

只要客户端和服务器都在使用 HTTP,底层实现就无关紧要,也不需要是 servlet——它只需要使用 HTTP。

于 2013-05-05T01:40:45.550 回答
0

所有的 Web 服务都在 servlet 之上工作,无论是 SOAP 还是 REST。根据您使用的 Web 服务框架,将配置 servlet 映射,例如 jersey、resteasy 等。

于 2013-05-04T16:59:06.750 回答