概念
什么是CXF,它是一个开源的webservice框架,提供大量功能特性,实现快速开发
CXF支持的协议:SOAP1.1/1.2,REST
CXF支持的数据格式:XML,JSON(只在REST下支持)
与EndPoint不同,CXF支持接口形式的发布,Endpoint不支持接口发布
配置
目录:
配置:
JAVA_HOME:jdk的安装目录,即bin的上一级
CXF_HOME:cxf的目录,即bin的上一级
Path = ;%JAVA_HOME%\bin;%CXF_HOME%\bin;
CLASSPATH=.;%CXF_HOME%\lib\cxf-manifest.jar
直接访问服务地址会报如下异常,原因是CXF发布服务未提供说明界面,需直接访问wsdl地址
利用CXF服务端开发
开发步骤:
第一步:创建一个java工程
第二步:导入cxf的jar包。138个
第三步:编写SEI接口。需要在SEI接口上添加@Webservice注解。
第四步:编写SEI实现类。不需要加注解。
第五步:发布服务
1、创建一个JaxWsServerFactoryBean对象
2、设置SEI接口setServiceClass
3、设置SEI实现类对象。setServiceBean
4、设置服务发布地址。setAddress
5、发布服务。Create
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
class
WeatherServer {
public
static
void
main(String[] args) {
//JaxWsServerFactoryBean发布一个webservice服务
JaxWsServerFactoryBean jaxWsServerFactoryBean =
new
JaxWsServerFactoryBean();
//设置服务接口
jaxWsServerFactoryBean.setServiceClass(WeatherInterface.
class
);
//设置服务实现类实例
jaxWsServerFactoryBean.setServiceBean(
new
WeatherInterfaceImpl());
//设置服务地址
//发布服务
jaxWsServerFactoryBean.create();
}
}
|
利用CXF客户端开发
开发步骤:
第一步:引入jar包:
第二步:生成客户端代码
Ø Wsdl2java:它是cxf提供客户端生成命令,支持SOAP1.1和SOAP1.2,其他和wsimport类似
Ø 常用参数:-d,指定输出目录;-p,指定包名,如果不指定也是使用命名空间的倒序
第三步:使用生成的客户端代码调用服务端:JaxWsProxyFactoryBean,设置两个参数:1.服务接口;2.服务地址,用create方法创建一个服务接口的实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public
class
WeatherClient {
public
static
void
main(String[] args) {
//JaxWsProxyFactoryBean去调用服务端
JaxWsProxyFactoryBean jaxWsProxyFactoryBean =
new
JaxWsProxyFactoryBean();
//设置服务接口
jaxWsProxyFactoryBean.setServiceClass(WeatherInterface.
class
);
//设置服务地址,不是WSDL地址
//获取接口实现类的实例
WeatherInterface weatherInterface = (WeatherInterface) jaxWsProxyFactoryBean.create();
//调用查询方法
String weather = weatherInterface.queryWeather(
"北京"
);
System.out.println(weather);
}
}
|
CXF和Spring整合发布SOAP协议的服务
<jaxws:endpoint>标签对Endpoint发布方式的一个封装,不需要接口的
<jaxws:server>标签对JaxWsServerFactoryBean的一个封装,可以发布接口
服务端:
l 第一步:创建web的项目
l 第二步:导入jar包
l 第三步:开发接口和实现类
l 第四步:配置spring的配置文件:applicationContext.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
xsi:schemaLocation="http://www.springframework.org/schema/beans
<!--==============================================================================-->
<!-- <jaxws:endpoint发布一个无需接口的服务 -->
<
jaxws:endpoint
address
=
"/hello"
implementor
=
"cn.itcast.ws.cxf.server.HelloWorld"
>
</
jaxws:endpoint
>
<!===============================================================================-->
<!-- <jaxws:server发布一个带接口的服务 -->
<
jaxws:server
address
=
"/weather"
serviceClass
=
"cn.itcast.ws.cxf.server.WeatherInterface"
>
<
jaxws:serviceBean
>
<
ref
bean
=
"weatherInterface"
/>
</
jaxws:serviceBean
>
</
jaxws:server
>
<!-- 配置一个服务实现类的bean -->
<
bean
name
=
"weatherInterface"
class
=
"cn.itcast.ws.cxf.server.WeatherInterfaceImpl"
/>
</
beans
>
|
l 第五步:配置CXF的servlet,spring配置文件,配置到web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
web-app
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns
=
"http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation
=
"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id
=
"WebApp_ID"
version
=
"3.0"
>
<
display-name
>ws_2_cxf_spring_server</
display-name
>
<!-- spring配置文件 -->
<
context-param
>
<!-- contextConfigLocation名字是固定的,不能更改, 如果不配置,去默认路径/WEB-INF/applicationContext.xml,这个路径也不能更改-->
<
param-name
>contextConfigLocation</
param-name
>
<!-- 可以配置称WEB-INF/classes/applicationContext.xml -->
<
param-value
>classpath:applicationContext.xml</
param-value
>
</
context-param
>
<!-- 配置spring的listener,加载配置文件,初始化spring上下文-->
<
listener
>
<
listener-class
>org.springframework.web.context.ContextLoaderListener</
listener-class
>
</
listener
>
<!-- 配置CXF的servlet -->
<
servlet
>
<
servlet-name
>CXF</
servlet-name
>
<
servlet-class
>org.apache.cxf.transport.servlet.CXFServlet</
servlet-class
>
</
servlet
>
<
servlet-mapping
>
<!-- 和上边的servletname保持一致 -->
<
servlet-name
>CXF</
servlet-name
>
<!--
路径映射:
1.以"/"开头且以"/*"结尾,这种方式叫路径映射
2.以"*."结尾,比如*.do,这叫扩展映射
3.只写"/",指定默认的servlet,
4.其他的映射方式,都是精确映射,
路径拦截规则顺序:
1.精确映射
2.路径映射
3.扩展映射
4.默认servlet
-->
<
url-pattern
>/ws/*</
url-pattern
>
</
servlet-mapping
>
<
welcome-file-list
>
<
welcome-file
>index.html</
welcome-file
>
<
welcome-file
>index.htm</
welcome-file
>
<
welcome-file
>index.jsp</
welcome-file
>
<
welcome-file
>default.html</
welcome-file
>
<
welcome-file
>default.htm</
welcome-file
>
<
welcome-file
>default.jsp</
welcome-file
>
</
welcome-file-list
>
</
web-app
>
|
l 第六步:部署到tomcat中,启动tomcat
l 第七步:测试服务是否发布成功
wsdl地址访问规则:
http://ip:端口号/项目名称/servlet拦截路径/发布的服务?wsdl