CXF构建webservice解析

1.注意:cxf-3.0以上一般用jdk1.7,1.8版本。
什么是CXF?
CXF是建立在SOAP协议上的一个Web service框架。什么是SOAP协议,简单来说就是两个不同项目(开发语言不同等)通过xml文件来描述要传输的东西,然后通过HTTP协议传输,接收方把收到的xml解析成需要的对象使用,返回的时候又用xml封装又通过http协议传输,如此就是SOAP协议。而CXF就是两个项目之间为了提供服务,而开发的一个开源框架,使用CXF框架可以快速搭建web service。CXF就是将项目中暴露出来的接口(服务)包装起来,成为wsdl,使用方通过wsdl来调用这些服务,跟CXF同样功能的是XFIRE,AXIAS。可是现在都用CXF了,他整合了XFIRE。AXIAS也越来越少人用。
2 .什么是WebService?
Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
3.构建过程
第一步: 安装jdk,tomcat,ant,并配置环境,并在maven里配置jar包;
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.majian
【CXF构建webservice解析】WebService02
1.0-SNAPSHOT
war

UTF-8
1.7
1.7
3.0.1
4.3.12.RELEASE



org.apache.cxf
cxf-rt-frontend-jaxws
${cxf.version}


org.apache.cxf
cxf-rt-transports-http
${cxf.version}


com.alibaba
fastjson
1.2.31


org.springframework
spring-core
${spring.version}


org.springframework
spring-web
${spring.version}


org.springframework
spring-context
${spring.version}


org.springframework
spring-beans
${spring.version}


wsdl4j
wsdl4j
1.6.2


org.apache.cxf
cxf-rt-transports-http-jetty
3.1.6


org.apache.cxf
cxf-rt-frontend-jaxws
${cxf.version}


org.apache.cxf
cxf-rt-transports-http-jetty
${cxf.version}



为什么要用到ant这个工具呢?Ant做为一种工具已经广泛被使用,并且历史悠久。
使用ant的内置命令,可以编译java源文件(javac),运行java文件(java),给class文件打包(jar、war、ear),
也可以创建(mkdir)、删除(del)、拷贝(copy),甚至可以使用ant执行sql文件。
由于ant是用xml语言写成的文件,并取默认名为build.xml文件。
所以,今后大家应该在见到名为build.xml文件时知道这是一个ant的文件。
第二步:Web.xml中添加该段配置,org.apache.cxf.transport.servlet.CXFServlet用于在web容器中发布WebService。

Archetype Created Web Application

contextConfigLocation
/WEB-INF/spring-context.xml


org.springframework.web.context.ContextLoaderListener


CXFServlet
org.apache.cxf.transport.servlet.CXFServlet
1


CXFServlet
/services/*


spring-context.xml中添加 implementor引用上面的bean,address和路径中问号前的访问相同。

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:jaxrs="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">



address="/sumAndMul">

第三步:编写接口CalculatorService.java,这个接口就是提供web服务的那个接口,里面的方法都是提供给人家调用。
package com.majian.service;
import javax.jws.WebService;
import java.math.BigDecimal;
/**
* Created by majian on 2018/9/14.
*/
@WebService
public interface CountService {
public String result(BigDecimal[] factors);
}
第四步:编写接口的实现类CountServiceImpl.java,类里面要实现接口的方法。
package com.majian.service.impl;
import com.majian.service.CountService;
import javax.jws.WebService;
import java.math.BigDecimal;
/**
* Created by majian on 2018/9/14.
*/
@WebService(endpointInterface ="com.majian.service.CountService")
public class CountServiceImplimplements CountService{
@Override
public String result(BigDecimal[] factors) {
BigDecimal add=new BigDecimal("0");
BigDecimal mul=new BigDecimal("1");
for (BigDecimal tmp :factors){
mul=mul.multiply(tmp);
add = add.add(tmp);
}
return "两个数的和sum="+add.toString()+"\n 两个数的积mul="+mul.toString();
}
}
第五步:调用服务
可以通过tomcat服务器,直接配合就行,启动地址http://localhost:8081/{项目名}/services:
可以通过main方法,如下:
package com.majian.controller;
import com.majian.service.impl.CountServiceImpl;
import javax.xml.ws.Endpoint;
/**
* Created by majian on 2018/9/15.
*/
public class Server {
public static void main(String[] args) {
System.out.println("start Web...");
CountServiceImpl countService=new CountServiceImpl();
String address="http://localhost:8081/web/services";
Endpoint publish = Endpoint.publish(address, countService);
System.out.println("End Web....");
}
}
第六步:生成客户端代码
wsdl2java http://localhost:8081/web/services/sumAndMul?wsdl
D:\workspace\WebClient02\src\main\java>wsdl2java http://localhost:8081/web/services/sumAndMul?wsdl
第七步:编写客户端代码
package com.majian.service;
import com.majian.service.impl.CountServiceImplService;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* Created by majian on 2018/9/14.
*/
public class Client {
public static void main(String[] args) {
CountServiceImplService factory =new CountServiceImplService();
CountService service = factory.getCountServiceImplPort();
List list=new ArrayList();
BigDecimal big1 =new BigDecimal(38);
BigDecimal big2=new BigDecimal(42);
list.add(big1);
list.add(big2);
String s = service.result(list);
System.out.println(s);
}
}
结果:
两个数的和sum=80 两个数的积mul=1596 服务端项目结构:


CXF构建webservice解析
文章图片
服务端结构 客户端结构
CXF构建webservice解析
文章图片
客户端结构 代码后期会传到GitHub上。。。。。

    推荐阅读