CXF初级入门教程

CXF初级入门教程

    博客分类:
  • WebService
cxf webservice axis
以前在公司开发webservice,接触的都是axis1.4的版本,好久都没更新了。现在尝试一下使用CXF开发webservice来作为服务端,用axis来作为客户端来调用。
一、 新建个web工程,导入CXF 的一些JAR包,如果使用的JDK6的版本的话,只需要如下5个Jar包(不整合spring),若是JDK5.0,可以根据下载的apache-cxf-2.4.6下的lib文件夹下有WHICH_JARS文件,里面有对这些jar包的说明。(jdk5的另加上后面带[6]标志的jar包)
commons-logging-1.1.1.jar 
cxf-2.4.6.jar
neethi-3.0.1.jar
wsdl4j-1.6.2.jar
xmlschema-core-2.0.1.jar

二、在src下建个包,如com.cxf.ws,再在此包下建个HelloWord类(建个接口也可以,不过这个简单例子就直接类实现了),最后增加以下方法,如:
Java代码 复制代码  收藏代码
  1. public String say(String text) {   
  2.         return "Hello World:" + text + "!";   
  3.     }   
  4.   
  5.     public String[] says(String a1, String[] msgs) {   
  6.         String[] array = new String[msgs.length];   
  7.         for(int i=0; i<msgs.length; i++) {   
  8.             array[i] = a1 + "=>" + msgs[i];   
  9.         }   
  10.         return array;   
  11.     }   
  12.        
  13.     public Long saveUser(User user) {   
  14.         if(null == user) {   
  15.             System.out.println("接收用户参数为NULL!");   
  16.             return null;   
  17.         }   
  18.         System.out.println("姓名:" + user.getUsername());   
  19.         return user.getId();   
  20.     }  

注意:第三个方法需建一个User类,这个自己建个。

三、发布webservice,建个Servlet,如MyCXFServlet.java,由于采用了No Spring方式,需继承CXFNonSpringServlet,重写loadBus方法,实现如下:
Java代码 复制代码  收藏代码
  1. @Override  
  2.     protected void loadBus(ServletConfig config) {   
  3.         super.loadBus(config);   
  4.         ServerFactoryBean factory = new ServerFactoryBean();   
  5.         factory.setBus(getBus());   
  6.         factory.setServiceClass(HelloWorld.class);   
  7.         factory.setAddress("/hello");   
  8.         factory.getInInterceptors().add(new LoggingInInterceptor());   
  9.         factory.getOutInterceptors().add(new LoggingOutInterceptor());   
  10.         factory.create();   
  11.     }  

四,把这个Servlet加入Web.xml 中
Java代码 复制代码  收藏代码
  1. <servlet>   
  2.         <servlet-name>MyCXFServlet</servlet-name>   
  3.         <servlet-class>com.cxf.MyCXFServlet</servlet-class>   
  4.     </servlet>   
  5.        
  6.     <servlet-mapping>   
  7.         <servlet-name>MyCXFServlet</servlet-name>   
  8.         <url-pattern>/ws/*</url-pattern>   
  9.     </servlet-mapping>  

五、打开浏览器,输入http://localhost:8088/cxf/ws/hello?wsdl,能看到webservice正常发布。采用CXF能直接对一个pojo对象进行发布。
六、用axis1.4来作为客户端进行测试,新建个java项目,导入axis所需的jar包,
axis.jar
axis-ant.jar
commons-discovery-0.2.jar
commons-logging-1.0.4.jar
jaxrpc.jar
log4j-1.2.8.jar
saaj.jar
wsdl4j-1.5.1.jar
七、新建个测试类:测试代码如下:
Java代码 复制代码  收藏代码
  1. static void testSay() {   
  2.         Service service = new Service();   
  3.         try {   
  4.             Call call = (Call) service.createCall();   
  5.             call.setOperationStyle(Style.WRAPPED);   
  6.             call.setTargetEndpointAddress("http://localhost:8088/cxf/ws/hello");   
  7.             call.addParameter("text", XMLType.XSD_STRING, ParameterMode.IN);   
  8.             call.setReturnType(XMLType.XSD_STRING, String.class);   
  9.             String result = (String) call.invoke("say"new Object[]{"John"});   
  10.             System.out.println("结果:" + result);   
  11.         } catch (ServiceException e) {   
  12.             e.printStackTrace();   
  13.         } catch (RemoteException e) {   
  14.             e.printStackTrace();   
  15.         }   
  16.     }   
  17.        
  18.     static void testSayArray() {   
  19.         Service service = new Service();   
  20.         try {   
  21.             Call call = (Call) service.createCall();   
  22.             call.setOperationStyle(Style.WRAPPED);   
  23.             call.setTargetEndpointAddress("http://localhost:8088/cxf/ws/hello");   
  24.             call.addParameter("a1", XMLType.XSD_STRING, ParameterMode.IN);   
  25.             call.addParameter("msgs", XMLType.XSD_STRING, String[].class, ParameterMode.IN);   
  26.             call.setReturnType(XMLType.XSD_STRING, String[].class);   
  27.             String a1 = "你好";   
  28.             String[] msgs = {"李四","张三","John"};   
  29.             String[] result = (String[]) call.invoke("says"new Object[]{a1, msgs});   
  30.             System.out.println("结果:");   
  31.             for(String r : result) {   
  32.                 System.out.println(r);   
  33.             }   
  34.         } catch (ServiceException e) {   
  35.             e.printStackTrace();   
  36.         } catch (RemoteException e) {   
  37.             e.printStackTrace();   
  38.         }   
  39.     }   
  40.        
  41.     public static void main(String[] args) {   
  42.         testSay();   
  43.         testSayArray();   
  44.     }  

注意:采用axis访问CXF发布的webservice,首先要设置Style的方式,如 call.setOperationStyle(Style.WRAPPED);这个是最关键的,没有这行代码是运行不成功的,其次要对每个参数的类型进行描述,没有直接用axis发布的webservice方便,毕竟是2个不同的webservice的实现方法。
问题:如果用cxf发布的webservice的方法中参数含有二维数组,如String[][] msgs,这个时候是可以正常发布的,但是不知道怎么用axis来设置参数调用?

你可能感兴趣的:(CXF初级入门教程)