问题?WebService CXF调用方式《三》,CXF工作原理和调用方式
一、CXF是什么?
Apache CXF是一个开源的,全功能的,容易使用的Web服务框架。CXF是两个项目的结合:由IONA技术公司(现在是Progress的一部分)开发的Celtix和由Codehaus主持的团队开发的XFire,合并是由人们在在Apache软件基金会共同完成的。CXF的名字来源于"Celtix"和"XFire"的首字母。
二、CXF有什么作用?
Apache CXF Web 服务堆栈是来自 Apache Software Foundation 的另一替代选择,Axis2 堆栈也来自同一组织。尽管它们来自同一组织,Axis 2 和 CXF 就如何配置和交付 Web 服务采用完全不同的方法。总的来说,CXF主要是用来交付WebService的。
三、CXF怎么用?
1.下载包
用CXF是需要用到jar包和相关依赖包的,下载地址cxf:
官方下载
要下载两个zip包:
解压3.1.6.ZIP包
2.pom.xml
<dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.0.2</version> </dependency> <!-- Jetty is needed if you're using the CXFServlet --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>3.0.2</version> </dependency> </dependencies>
3.ServerFactoryBean
新建WebService工程,D:\javaenv\all_jar\apache-cxf-3.0.2\lib相关的依赖包,和spring框架直接整合,全部导入服务工程中,BuiledPath,并发布服务
package com.itcast.service; import org.apache.cxf.frontend.ServerFactoryBean; public class HelloService { /* * jdk形式 * 1.利用EndPoint.public(address,Class) * 2.加上公开方法 * 3.加上@WebService * * 使用CXF方式 * 1.ServerFactory创建发布对象,并设置属性值 * 2.server.create()发布服务 */ public String VisitService(String name){ System.out.println("InTO Service:"+name); System.out.println("InTO Service:"+name); System.out.println("InTO Service:"+name); System.out.println("InTO Service:"+name); return "Return Result:"+name; } public static void main(String[] args) { /* * 使用CFX的形式 */ //1.FactoryBean ServerFactoryBean bean = new ServerFactoryBean(); //2.设置访问地址 bean.setAddress("http://localhost:9090/hello");//192.168.1.6 //3.设置实现类或者接口 bean.setServiceClass(HelloService.class); //4.创建服务 System.err.println("开启CXF服务!"); bean.create(); //5.停止服务 } }
开启服务:
访问:http://localhsot:9090/hello出现500错误
在IE浏览器中该出现500内部错误,是因为CXF没有WebService总的预览界面了,它不像jdk的形式有这种总得WebService预览给你看,不过这不重要。
但是访问http://localhsot:9090/hello?wsdl描述文件就看得到。
4.Axis2 WebService框架 jax rpc / CXF基于jaxws标准
现在的CXFWebService框架就是在Axis WebService框架之后出来的。Jaxws是在jax rpc这个标准之后推出来,这个标准更好一点儿。
JaxWsServiceFactoryBean方式,其实就是创建服务对象的时候不同,再加上一个@WebService,其他的都CXF一样
建立服务类,跟CXF一样,只是它用的是JaxWsServiceFactoryBean方式:
@WebService public class a { private void mian() { // 1.JaxWserviceFactoryBean方式 JaxWsServiceFactoryBean bean = new JaxWsServiceFactoryBean(); //2.设置访问地址 bean.setAddress("http://localhost:9090/hello"); //3.设置实现类或者接口 bean.setServiceClass(HelloService.class); //4.创建服务 System.err.println("开启CXF服务!"); bean.create(); //5.停止服务 } }
以上两种方式可以看出以上与JDK不同的方式了吧!
5.ServerFactoryBean和JaxWsServerFactoryBean的差异
ServerFactoryBean无需写@WebService注解。其他调用方式基本一样
因为wsimport –s . ******:这个命令只支持SAOP1.1版本的,想要支持高版本的,可以用wsdl2java命令
wsdl2java命令:
只有java文件
C:\>wsdl2java -d . http://localhost:9090/hello?wsdl
有java和class文件
C:\>wsdl2java -d . -compile http://localhost:9090/hello?wsdl
注释:命令行中的中文句号,用英语的点代替
剩下的就是客户端调用和JDK是一样的,打包复制调用测试
6.用JaxWsServiceFactoryBean做面向接口的webservice服务******:
接口:
package com.itcast.jaxws; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.xml.ws.BindingType; import javax.xml.ws.soap.SOAPBinding; @WebService(serviceName="HelloService",targetNamespace="http://com.itcast.jaxws/") @BindingType(SOAPBinding.SOAP12HTTP_BINDING)//实现SOAP1.2 public interface IHelloService { @WebMethod(operationName="sayhello") @WebResult(name="Msage") public abstract String sayH(@WebParam(name="name")String name); }
实现类:
package com.itcast.jaxws; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; public class HelloService implements IHelloService { /* (non-Javadoc) * @see com.itcast.jaxws.IHelloService#sayH(java.lang.String) */ public String sayH(String name){ System.out.println("进入服务逻辑处理:"+name); return "访问服务方法:"+name; } /* * JaxWsFactoryBean方式 * */ public static void main(String[] args) { //1.FactoryBean JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean(); //2.设置访问地址 bean.setAddress("http://localhost:9090/hello"); //3.设置实现类或者接口 // bean.setServiceClass(HelloService.class);//面向类的服务 bean.setServiceClass(IHelloService.class);//面向接口的 bean.setServiceBean(new HelloService()); //因为是面向接口的服务,需要实例化,不然客户端调用的时候会出现没有实例的错误 //监听日志输入输出调用 bean.getInInterceptors().add(new LoggingInInterceptor()); bean.getOutInterceptors().add(new LoggingInInterceptor()); //4.创建服务 System.err.println("开启CXF服务!"); bean.create(); //5.停止服务 } }
开启服务,当然也监听日志:
打包到客户端,并且把服务端代码复制,调用接口服务
四、其它
1.如果监控多个公司调用提供WebService,怎样知道是哪个公司调用
WebService安全性,先要验证,在WebService提供login方法。设定username用户名,设定password密码。
调用所有业务方法前,必须先通过它来验证。
2.修改为SOAP1.2协议
MTOM 传输二进制文件,用SAOP1.2的话,就用选着第三个版本
3.SOAP1.1和SOAP1.2区别
(1)命名空间
(2)标签变化
Myeclipse WebService explor不能支持SOAP1.2
在开发中如果使用SOAP1.2实现WebService,在生成本地调用代码时,应该使用CXF提供wsdl2java命令。如果使用SOAP1.1实现WebService,在生成本地调用代码时,应该使用jdk提供wsimport命令。
在实际项目中目前尽量使用SOAP1.1版本
五、总结
总结未完,慌啥呢?看下节