一、CXF的介绍
Apache CXF是一个开源的WebService框架,CXF大大简化了Webservice的创建,同时它继承了XFire的传统,一样可以和spring天然的进行无缝的集成。CXF框架是一种基于servlet技术的SOA应用开发框架,要正常运用基于CXF应用框架开发的企业应用,除了CXF应用本身之外,还需要JDK和servlet容器的支持。
二、CXF的准备条件
所需要的jar包:
? xmlbeans-2.4.0.jar
? wss4j-1.5.9.jar
? jetty-server-7.1.6.v20100715.jar
? jetty-util-7.1.6.v20100715.jar
? geronimo-ws-metadata_2.0_spec-1.1.3.jar
? geronimo-activation_1.1_spec-1.1.jar
? geronimo-servlet_3.0_spec-1.0.jar
? velocity-1.6.4.jar
? jaxb-xjc-2.2.1.1.jar
? xml-resolver-1.2.jar
? wsdl4j-1.6.2.jar
? cxf-2.3.0.jar
? XmlSchema-1.4.7.jar
? jaxb-api-2.2.1.jar
? jaxb-impl-2.2.1.1.jar
? neethi-2.0.4.jar
? geronimo-annotation_1.0_spec-1.1.1.jar
? geronimo-stax-api_1.0_spec-1.0.1.jar
下载地址:http://download.csdn.net/detail/ch656409110/5748183?? (取自己需要的jar包)
三、创建webservice服务端
1、先将jar包放入lib目录
2、在web.xml中配置CXF框架的核心servlet
[html]
view plain
copy
print
?
- ??
- <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>/services/*</url-pattern>????
- </servlet-mapping>??
<!-- CXF -->
<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>/services/*</url-pattern>
</servlet-mapping>
3、在applicationContext.xml中导入xml,并且发布webservice服务。
[html]
view plain
copy
print
?
- <?xml?version="1.0"?encoding="UTF-8"?>??
- <beans??
- ????xmlns="http://www.springframework.org/schema/beans"??
- ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
- ????xmlns:p="http://www.springframework.org/schema/p"??
- ????xmlns:tx="http://www.springframework.org/schema/tx"??
- ????xmlns:aop="http://www.springframework.org/schema/aop"??
- ????xmlns:jaxws="http://cxf.apache.org/jaxws"????
- ????xmlns:jaxrs="http://cxf.apache.org/jaxrs"????
- ????xsi:schemaLocation="http://www.springframework.org/schema/beans???
- ????????????????????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd??
- ????????????????????????http://www.springframework.org/schema/tx??
- ????????????????????????http://www.springframework.org/schema/tx/spring-tx-2.5.xsd??
- ????????????????????????http://www.springframework.org/schema/aop??
- ????????????????????????http://www.springframework.org/schema/aop/spring-aop-2.5.xsd??
- ????????????????????????http://cxf.apache.org/jaxws????
- ????????????????????????http://cxf.apache.org/schemas/jaxws.xsd????
- ????????????????????????http://cxf.apache.org/jaxrs????
- ????????????????????????http://cxf.apache.org/schemas/jaxrs.xsd??
- ????????????????????????"??
- ????????????????????????default-autowire="byName"??
- ????????????????????????>??
- ????<import?resource="classpath:META-INF/cxf/cxf.xml"?/>??
- ????<import?resource="classpath:META-INF/cxf/cxf-extension-soap.xml"?/>??
- ????<import?resource="classpath:META-INF/cxf/cxf-servlet.xml"?/>??
- ??????
- ??????
- ??????
- ????<bean?id="facelookWebService"?class="com.facelook.webservice.server.FacelookWebServiceImpl"/>???
- ????<jaxws:endpoint?id="facelookWebService1"?address="/facelookWebService"?implementorClass="com.facelook.webservice.server.FacelookWebServiceImpl">??
- ????????<jaxws:implementor?ref="facelookWebService"/>????
- ????</jaxws:endpoint>??
- </beans>??
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd
"
default-autowire="byName"
>
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- <jaxws:endpoint id="facelookWebService" address="/facelookWebService" implementor="com.facelook.webservice.server.FacelookWebServiceImpl"></jaxws:endpoint> -->
<!-- 不知道为什么,这里的webservice配置,只能用bean来实现,否则 注入的service为空。但是之前有个项目却可以,百思不得其解。。 -->
<bean id="facelookWebService" class="com.facelook.webservice.server.FacelookWebServiceImpl"/>
<jaxws:endpoint id="facelookWebService1" address="/facelookWebService" implementorClass="com.facelook.webservice.server.FacelookWebServiceImpl">
<jaxws:implementor ref="facelookWebService"/>
</jaxws:endpoint>
</beans>
4、定义webservice接口FacelookWebService 和 实现类FacelookWebServiceImpl。
[java]
view plain
copy
print
?
- @WebService??
- public?interface?FacelookWebService?{??
- ??????
- ?????
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ??
- ????public?String?getAlbumList(@WebParam(name="xmlStr")?String?xmlStr);??
- }??
- ??
- ??
- @WebService??
- ??
- public?class?FacelookWebServiceImpl?implements?FacelookWebService{??
- ??
- ????@Autowired??
- ????private?AlbumService?albumService;??
- ??????
- ????@Override??
- ????public?String?getAlbumList(String?xmlStr)?{??
- ????????try?{??
- ????????????List<Album>?albumList?=?getAlbumPage(xmlStr);??
- ????????????JSONArray?jsonArray?=?JSONArray.fromObject(albumList);??
- ????????????return?jsonArray.toString();??
- ????????}?catch?(Exception?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ????????return?null;??
- ????}??
- }???
@WebService
public interface FacelookWebService {
/**
* 根据传递的条件获取相册信息
* xml的格式规范
* <?xml version="1.0" encoding="UTF-8"?>
* <facelook>
* <condition>
* <name></name>
* <description></description>
* <pageno></pageno>
* <pagesize></pagesize>
* </condition>
* </facelook>
* 这里的WebParam必须指定,否则调用的时候返回null
* @return
*/
public String getAlbumList(@WebParam(name="xmlStr") String xmlStr);
}
@WebService
//这后面的可以不写注释后面的配置,在applicationContext配置也一样(serviceName="facelookWebService",endpointInterface="com.facelook.webservice.server.FacelookWebService")
public class FacelookWebServiceImpl implements FacelookWebService{
?? ?@Autowired
?? ?private AlbumService albumService;
?? ?
?? ?@Override
?? ?public String getAlbumList(String xmlStr) {
?? ??? ?try {
?? ??? ??? ?List<Album> albumList = getAlbumPage(xmlStr);
?? ??? ??? ?JSONArray jsonArray = JSONArray.fromObject(albumList);
?? ??? ??? ?return jsonArray.toString();
?? ??? ?} catch (Exception e) {
?? ??? ??? ?e.printStackTrace();
?? ??? ?}
?? ??? ?return null;
?? ?}
}
这样子,基本上就可以了。
5、保存代码,发布项目,启动tomact。
在地址栏输入:http://localhost:8080/house/services/houseWebService?wsdl? 即可看到发布的服务端的明细。
显示如下:

这就表示CXF发布的webservice服务端成功了。
6、通过客户端调用服务端webservice。
axis的客户端访问:
[java]
view plain
copy
print
?
- public?static?void?main(String[]?args)?throws?ServiceException,?RemoteException,?MalformedURLException?{??
- ????String?xmlStr?=?"<?xml?version="1.0"?encoding="UTF-8"?>"??
- ?????????????+?"?????<facelook>"??
- ?????????????+?"????????<condition>"??
- ?????????????+?"????????????<name>家</name>"??
- ?????????????+?"????????????<description></description>"??
- ?????????????+?"????????????<pageno></pageno>"??
- ?????????????+?"????????????<pagesize></pagesize>"??
- ?????????????+?"????????</condition>"??
- ?????????????+?"?????</facelook>";??
- ??????
- ??????Service?service?=?new?Service();??
- ??????Call?call?=?(Call)?service.createCall();??
- ??????call.setTargetEndpointAddress("http://localhost:8080/facelook/services/facelookWebService?wsdl");??
- ??????QName?qName?=?new?QName("http://server.webservice.facelook.com/",?"getAlbumList");??
- ??????call.setOperationName(qName);??
- ??????call.setUseSOAPAction(true);??
- ????????
- ??????call.addParameter("xmlStr",?XMLType.XSD_STRING,?ParameterMode.IN);??
- ??????call.setReturnType(XMLType.XSD_STRING);??
- ??????String?result?=?(String)?call.invoke(new?Object[]?{?xmlStr?});??
- ??????System.out.println(result);??
- ??????
- ??????
- ??????
- ??????
- ??????
- }??
public static void main(String[] args) throws ServiceException,RemoteException,MalformedURLException {
String xmlStr = "<?xml version="1.0" encoding="UTF-8"?>"
+ " <facelook>"
+ " <condition>"
+ " <name>家</name>"
+ " <description></description>"
+ " <pageno></pageno>"
+ " <pagesize></pagesize>"
+ " </condition>"
+ " </facelook>";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress("http://localhost:8080/facelook/services/facelookWebService?wsdl");
QName qName = new QName("http://server.webservice.facelook.com/","getAlbumList");
call.setOperationName(qName);
call.setUseSOAPAction(true);
//这下面两行一定要加上,否则接收在服务器端收不到。
call.addParameter("xmlStr",XMLType.XSD_STRING,ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING);
String result = (String) call.invoke(new Object[] { xmlStr });
System.out.println(result);
//将返回的字符串转换成list集合
//JSONArray array = JSONArray.fromObject(result);
//List<Album> list = JSONArray.toList(array,Album.class);
}
CXF客户端访问:
[java]
view plain
copy
print
?
- public?static?void?main(String[]?args)?throws?Exception?{??
- ??????????
- ??????????
- ??????????
- ????????JaxWsDynamicClientFactory?dcf?=?JaxWsDynamicClientFactory.newInstance();??
- ????????org.apache.cxf.endpoint.Client?client?=?dcf.createClient("http://localhost:8080/facelook/services/facelookWebService?wsdl");??
- ??????????
- ????????QName?name=new?QName("http://server.webservice.facelook.com/","getAlbumList");??
- ??????????
- ????????String?xmlStr?=?"<?xml?version="1.0"?encoding="UTF-8"?>"??
- ?????????????????+?"?????<facelook>"??
- ?????????????????+?"????????<condition>"??
- ?????????????????+?"????????????<name>家</name>"??
- ?????????????????+?"????????????<description></description>"??
- ?????????????????+?"????????????<pageno></pageno>"??
- ?????????????????+?"????????????<pagesize></pagesize>"??
- ?????????????????+?"????????</condition>"??
- ?????????????????+?"?????</facelook>";??
- ??????????
- ????????Object[]?objects=client.invoke(name,xmlStr);???
- ??????????
- ????????System.out.println(objects[0].toString());??
- }??
public static void main(String[] args) throws Exception {
//这个是用cxf 客户端访问cxf部署的webservice服务
//千万记住,访问cxf的webservice必须加上namespace,否则通不过
//现在又另外一个问题,传递过去的参数服务端接收不到
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:8080/facelook/services/facelookWebService?wsdl");
//url为调用webService的wsdl地址
QName name=new QName("http://server.webservice.facelook.com/","getAlbumList");
//namespace是命名空间,methodName是方法名
String xmlStr = "<?xml version="1.0" encoding="UTF-8"?>"
+ " <facelook>"
+ " <condition>"
+ " <name>家</name>"
+ " <description></description>"
+ " <pageno></pageno>"
+ " <pagesize></pagesize>"
+ " </condition>"
+ " </facelook>";
//paramvalue为参数值
Object[] objects=client.invoke(name,xmlStr);
//调用web Service//输出调用结果
System.out.println(objects[0].toString());
}
在这里面传递的xml规范由 服务端自己规范好了,然后去解析、获取参数,执行相应的操作,返回想要的结果给调用的客户端。。