Web Service:一种跨平台跨语言的远程调用的规范。
实际用途:
1.同一个公司的新、旧系统的整合
2.不同公司的业务整合
3.内容聚合
CXF:
CXF内置了一个Jetty Web服务器。
===================================================================================
使用CXF开发Web Service服务器端:
/****************************************
每个Web Service组件需要两个部分:接口和实现类
****************************************/
(1).开发一个Web Service业务接口。
该接口需要使用@WebService注解进行修饰
(2).开发一个Web Service的实现类,也需要使用@WebService进行修饰,并还需要设置相关属性。
(3).发布Web Service
===================================================================================
使用CXF开发Web Service客户端:
WSDL-Web Service Definition Language
(1).调用CXF提供的wsdl2java工具,根据WSDL文档生产相应的JAVA代码。
任何语言实现了Web Service,都需要提供、并暴露WSDL文档。
(2).找到wsdl2java所生成的类中,一个继承了Service的类。
该类的实例可以当做工厂来使用。
(3).调用Service子类的实例的getXxxPort方法。返回远程Web服务器端的代理对象。
===================================================================================
1.当形参、返回值是String、基本数据类型时,CXF可以轻松处理。
2.当形参、返回值是JavaBean式的复合类、List集合、数组等时,CXF也可以很好的处理。
3.还有一些像Map、非JavaBean式的复合类,CXF是处理不了的。
如果遇到不能处理的类型,可以使用@XmlJavaTypeAdapter注解进行修饰处理。
处理思路:提供一个适配器,将不能处理的类型转为可以处理的类型。
===================================================================================
Web Service三个技术基础:
1.WSDL Web Service定义语言
2.SOAP 简单对象访问协议
Hearder 可选的,由程序员控制添加,可以附带信息。
Body 默认必须的,有正确和错误两种情况。正确时由WSDL控制。
3.UDDI
一次Web Service的调用----其实并不是方法调用,而是发送SOAP消息(即是XML文档)。
===================================================================================
调用一次Web Service的本质;
1.客户端把调用的方法参数转换生成xml文档片段(SOAP消息)
2.客户端通过网络将xml文档片段传给服务器。
3.服务器端接受xml文档片段。
4.服务器端解析xml文档片段,提取其中的数据。并把数据转换为调用WebService所需要的参数
5.服务器端执行方法。
6.把执行方法得到的返回值再次转换为xml文档片段(SOAP消息)。
7.通过网络,把xml文档片段传给客户端。
8.客户端接收xml文档片段。
9.客户端解析xml文档片段,提取其中个的数据并把数据转换为调用Web Service的返回值。
===================================================================================
【拦截器】
1.获取Endpoint的Publish方法返回值
2.调用该方法返回值的getXxIterceptor方法来获取拦截器列表,接下来就可以使用拦截器。
●自定义拦截器
需要实现Interceptor接口,或者继承AbstractPhaseInterceptor。
●客户端添加拦截器
1.调用ClientProxy.getClient(xxxx)方法,以远程webservice的代理为参数。
2.获取方法调用的返回值Client对象,调用该对象的getXxIterceptor方法获取拦截器列表。
3.使用拦截器。
===================================================================================
CXF与Spring的整合
可以在传统的Java EE应用的基础上添加一层Web Service层。
我们的Java EE应用可以对外暴露Web Service,可以跨平台调用。
●整合步骤
1.加入CXF的jar包
2.在web.xml配置cxf的核心控制器
<!-- 下面是Web Service的接口。所有/ws/*请求都交给CXFServlet处理 -->
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
3.在Spring配置文件中导入CXF提供Schema,XML配置。
<!--导入与CXF框架有关的xml -->
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
4.在Spring配置文件中使用jaxws:endpoint元素来暴露Web Service
<!--布置WebService接口 -->
<!-- implementor指定WebService的服务提供者。支持两种方式。 A.直接指定类名 B.设置为容器中的一个Bean -->
<jaxws:endpoint id="service1"implementor="com.hyr.webserviceImpl.HelloWebServiceImpl" address="/userService">
</jaxws:endpoint>
5.配置拦截器 在<jaxws:endpoint>标签中进行嵌套
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
</jaxws:inInterceptors>
===================================================================================
【CXF与Spring的另一种整合方式】 访问其他平台的WebService接口
1.让Action依赖远程Web Service接口
2.导入jar包
3.在Spring配置文件中导入CXF提供Schema,XML配置文件
4.在Spring配置文件中使用jaxws:client元素来配置Web Service代理。
5.在jaxws:client中使用拦截器。
===================================================================================