在 web.xml 文件中定制 JAX-WS 应用程序的 URL 模式
web.xml 文件包含有关模块中的 Web 组件的结构和外部依赖关系的信息,并描述运行时如何使用组件。 对于 Java™ API for XML-Based Web Services (JAX-WS) 应用程序,可以在 web.xml 文件中定制 URL 模式。
准备工作
有关此任务
- WEB-INF/web.xml 文件,描述组成 Web 应用程序的 Web 组件的配置和部署信息。
- 附注释的类,实现包含在应用程序模块(包括服务端点实现类)中的 Web Service。
- JAXB 类。
- (可选)Web Service 描述语言 (WSDL) 文档,用于描述包含在应用程序模块中的 Web Service。
- (可选)XML 模式文件。
- (可选)实用程序类。
- (可选)Web Service 客户机。
缺省 URL 模式由包含在 Web Service 实现类中的 @WebService.serviceName 属性定义。 与服务实现类相关联的 WSDL 文件包含单个端口定义,您可以选择使用缺省 URL 模式,也可以在 web.xml 文件中定制 URL 模式。 如果与服务实现类相关联的 WSDL 文件将多个端口定义包含在同一个服务定义中,那么需要定制 URL 模式。 如果在服务实现类包含多个端口定义时使用缺省 URL 模式,那么会将多个服务实现类映射至同一 URL 模式,导致错误情况。 必须编辑 web.xml 文件并对每个服务定义定制 URL 模式。 每个端口均映射到 Web Service 实现类,以及映射到它自己的定制 URL 模式。 通过在 web.xml 文件中定制 URL 模式,可以更正 URL 模式定义冲突的问题。
如果 JAX-WS 应用程序打包在企业归档 (EAR) 文件内的 Enterprise JavaBeans (EJB) Java 归档 (JAR) 文件中,那么可以使用 endptEnabler 命令来定制 URL 模式。
过程
- 确定是必须使用还是需要使用定制 URL 模式。仅当 JAX-WS Web Service 的 WSDL 文件在单一服务中包含多个端口定义时,才需要定制 URL 模式。 在其他情况下,可以选择是否定义定制 URL 模式。
- 要定制服务实现类的 URL 模式,请编辑 web.xml 文件,并为需要定制 URL 模式的每个 JAX-WS Web Service 实现类提供 <servlet> 和相应 <servlet-mapping> 条目。必须在 <servlet-mapping> 条目中定义 <url-pattern> 值。
结果
现在,您具有启用了 Web Service 的 Web 应用程序归档 (WAR) 文件,该文件包含定制的 URL 模式。
服务实现类中的单一 WSDL 端口定义
以下示例举例说明了缺省 URL 模式及如何在与服务实现类相关联的 WSDL 文件具有单个端口定义时对 URL 模式进行定制。
以下代码摘自样本 Web Service 实现类。
package com.ibm.test;
@WebService(serviceName="EchoService", portName="SOAP11EchoServicePort")
public class EchoServiceSOAP11{
以下代码摘自与 EchoServiceSOAP11 Web Service 实现类相关联的 WSDL 文件:
<wsdl:service name="EchoService">
<wsdl:port name="SOAP11EchoServicePort" tns:binding="..." >
...
</wsdl:port>
</wsdl:service>
如 JSR-109 所描述的那样,本示例中的缺省 URL 模式是使用 @WebService.serviceName 属性构造,而缺省 URL 模式是 /EchoService。
要根据情况对本示例定制 URL 模式,请编辑 web.xml 文件并提供 url-pattern 条目。 在本示例中,定制 URL 模式现在是 /EchoServiceSOAP11。
以下代码摘自演示如何设置 servlet 的样本 web.xml 文件:
<servlet id="...">
<servlet-name>com.ibm.test.EchoServiceSOAP11</servlet-name>
<servlet-class>com.ibm.test.EchoServiceSOAP11</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>com.ibm.test.EchoServiceSOAP11</servlet-name>
<url-pattern>/EchoServiceSOAP11</url-pattern> ----> Defining the URL pattern and
pointing it to the service implementation class.
</servlet-mapping>
服务实现类中的多个 WSDL 端口定义
以下示例说明了与服务实现类相关联的 WSDL 文件具有多个端口定义时所必需的 URL 模式定制。 摘录自样本 Web Service 实现类:
package com.ibm.test;
@WebService(serviceName="EchoService", portName="SOAP11EchoServicePort")
public class EchoServiceSOAP11{
...
}
package com.ibm.test;
@WebService(serviceName="EchoService", portName="SOAP12EchoServicePort")
public class EchoServiceSOAP12{
...
}
以下代码摘自与 EchoServiceSOAP11 Web Service 实现类相关联的 WSDL 文件。 WSDL 文件中的每个端口均映射到 Web Service 实现类中的 portName。
<wsdl:service name="EchoService">
<wsdl:port name="SOAP11EchoServicePort" tns:binding="..." >
...
</wsdl:port>
<wsdl:port name="SOAP12EchoServicePort" tns:binding="..." >
...
</wsdl:port>
</wsdl:service>
在本方案中,由于 WSDL 文件中具有多个端口定义,因此您必须通过编辑 web.xml 文件来定制 URL 模式。 对每项服务指定定制 URL 模式。
以下代码摘自演示如何设置 servlet 的样本 web.xml 文件:
<servlet id="...">
<servlet-name>com.ibm.test.EchoServiceSOAP11</servlet-name>
<servlet-class>com.ibm.test.EchoServiceSOAP11</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>com.ibm.test.EchoServiceSOAP11</servlet-name>
<url-pattern>/EchoServiceSOAP11</url-pattern>
</servlet-mapping>
<servlet id="...">
<servlet-name>com.ibm.test.EchoServiceSOAP12</servlet-name>
<servlet-class>com.ibm.test.EchoServiceSOAP12</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>com.ibm.test.EchoServiceSOAP12</servlet-name>
<url-pattern>/EchoServiceSOAP12</url-pattern>
</servlet-mapping>