WebService CXF调用方式《三》

来源:互联网 发布:洛阳软件招聘 编辑:程序博客网 时间:2024/05/19 17:59

原文链接:点击打开链接

问题?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

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <dependencies>  
  2.         <dependency>  
  3.             <groupId>org.apache.cxf</groupId>  
  4.             <artifactId>cxf-rt-frontend-jaxws</artifactId>  
  5.             <version>3.0.2</version>  
  6.         </dependency>  
  7.         <dependency>  
  8.             <groupId>org.apache.cxf</groupId>  
  9.             <artifactId>cxf-rt-transports-http</artifactId>  
  10.             <version>3.0.2</version>  
  11.         </dependency>  
  12.         <!-- Jetty is needed if you're using the CXFServlet -->  
  13.         <dependency>  
  14.             <groupId>org.apache.cxf</groupId>  
  15.             <artifactId>cxf-rt-transports-http-jetty</artifactId>  
  16.             <version>3.0.2</version>  
  17.         </dependency>  
  18. </dependencies>  

3.ServerFactoryBean

新建WebService工程,D:\javaenv\all_jar\apache-cxf-3.0.2\lib相关的依赖包,和spring框架直接整合,全部导入服务工程中,BuiledPath,并发布服务


[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.itcast.service;  
  2.   
  3. import org.apache.cxf.frontend.ServerFactoryBean;  
  4.   
  5.   
  6. public class HelloService {  
  7.     /* 
  8.      * jdk形式 
  9.      * 1.利用EndPoint.public(address,Class) 
  10.      * 2.加上公开方法 
  11.      * 3.加上@WebService 
  12.      *  
  13.      * 使用CXF方式 
  14.      * 1.ServerFactory创建发布对象,并设置属性值 
  15.      * 2.server.create()发布服务 
  16.      */  
  17.     public String VisitService(String name){  
  18.         System.out.println("InTO Service:"+name);  
  19.         System.out.println("InTO Service:"+name);  
  20.         System.out.println("InTO Service:"+name);  
  21.         System.out.println("InTO Service:"+name);  
  22.         return "Return Result:"+name;  
  23.     }  
  24.      public static void main(String[] args) {  
  25.          /* 
  26.           * 使用CFX的形式 
  27.           */  
  28.          //1.FactoryBean  
  29.          ServerFactoryBean bean = new ServerFactoryBean();  
  30.          //2.设置访问地址  
  31.          bean.setAddress("http://localhost:9090/hello");//192.168.1.6  
  32.          //3.设置实现类或者接口  
  33.          bean.setServiceClass(HelloService.class);  
  34.          //4.创建服务  
  35.          System.err.println("开启CXF服务!");  
  36.          bean.create();  
  37.          //5.停止服务  
  38.     }  
  39. }  


开启服务:

   

访问: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方式

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. @WebService  
  2. public class a {  
  3.     private void mian() {  
  4.         // 1.JaxWserviceFactoryBean方式  
  5.         JaxWsServiceFactoryBean bean = new JaxWsServiceFactoryBean();  
  6.          //2.设置访问地址  
  7.          bean.setAddress("http://localhost:9090/hello");  
  8.          //3.设置实现类或者接口  
  9.          bean.setServiceClass(HelloService.class);  
  10.          //4.创建服务  
  11.          System.err.println("开启CXF服务!");  
  12.          bean.create();  
  13.          //5.停止服务  
  14.     }  
  15. }  

以上两种方式可以看出以上与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服务******:


接口:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.itcast.jaxws;  
  2.   
  3. import javax.jws.WebMethod;  
  4. import javax.jws.WebParam;  
  5. import javax.jws.WebResult;  
  6. import javax.jws.WebService;  
  7. import javax.xml.ws.BindingType;  
  8. import javax.xml.ws.soap.SOAPBinding;  
  9.   
  10. @WebService(serviceName="HelloService",targetNamespace="http://com.itcast.jaxws/")  
  11. @BindingType(SOAPBinding.SOAP12HTTP_BINDING)//实现SOAP1.2  
  12. public interface IHelloService {  
  13.   
  14.     @WebMethod(operationName="sayhello")  
  15.     @WebResult(name="Msage")  
  16.     public abstract String sayH(@WebParam(name="name")String name);  
  17.   
  18. }  

实现类:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.itcast.jaxws;  
  2.   
  3.   
  4. import org.apache.cxf.interceptor.LoggingInInterceptor;  
  5. import org.apache.cxf.jaxws.JaxWsServerFactoryBean;  
  6.   
  7.   
  8.   
  9. public class HelloService implements IHelloService {  
  10.       
  11.     /* (non-Javadoc) 
  12.      * @see com.itcast.jaxws.IHelloService#sayH(java.lang.String) 
  13.      */  
  14.     public String sayH(String name){  
  15.         System.out.println("进入服务逻辑处理:"+name);  
  16.         return "访问服务方法:"+name;  
  17.     }  
  18.     /* 
  19.      * JaxWsFactoryBean方式 
  20.      *  
  21.      */  
  22.     public static void main(String[] args) {  
  23.          //1.FactoryBean  
  24.          JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();  
  25.          //2.设置访问地址  
  26.          bean.setAddress("http://localhost:9090/hello");  
  27.          //3.设置实现类或者接口  
  28. //       bean.setServiceClass(HelloService.class);//面向类的服务  
  29.          bean.setServiceClass(IHelloService.class);//面向接口的  
  30.          bean.setServiceBean(new HelloService());  
  31.          //因为是面向接口的服务,需要实例化,不然客户端调用的时候会出现没有实例的错误  
  32.          //监听日志输入输出调用  
  33.          bean.getInInterceptors().add(new LoggingInInterceptor());  
  34.          bean.getOutInterceptors().add(new LoggingInInterceptor());  
  35.          //4.创建服务  
  36.          System.err.println("开启CXF服务!");  
  37.          bean.create();  
  38.          //5.停止服务  
  39.     }  
  40. }  
开启服务,当然也监听日志:

   

打包到客户端,并且把服务端代码复制,调用接口服务




四、其它

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版本

0 0
原创粉丝点击