zoukankan      html  css  js  c++  java
  • CXF创建webservice客户端和服务端

    一、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?
    1. <!-- CXF -->  
    2. <servlet>    
    3.     <servlet-name>CXFServlet</servlet-name>    
    4.     <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>    
    5.     <load-on-startup>1</load-on-startup>    
    6. </servlet>    
    7. <servlet-mapping>    
    8.     <servlet-name>CXFServlet</servlet-name>    
    9.     <url-pattern>/services/*</url-pattern>    
    10. </servlet-mapping>  

    3、在applicationContext.xml中导入xml,并且发布webservice服务。

    [html] view plain copy
     
     print?
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans  
    3.     xmlns="http://www.springframework.org/schema/beans"  
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    5.     xmlns:p="http://www.springframework.org/schema/p"  
    6.     xmlns:tx="http://www.springframework.org/schema/tx"  
    7.     xmlns:aop="http://www.springframework.org/schema/aop"  
    8.     xmlns:jaxws="http://cxf.apache.org/jaxws"    
    9.     xmlns:jaxrs="http://cxf.apache.org/jaxrs"    
    10.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
    11.                         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
    12.                         http://www.springframework.org/schema/tx  
    13.                         http://www.springframework.org/schema/tx/spring-tx-2.5.xsd  
    14.                         http://www.springframework.org/schema/aop  
    15.                         http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
    16.                         http://cxf.apache.org/jaxws    
    17.                         http://cxf.apache.org/schemas/jaxws.xsd    
    18.                         http://cxf.apache.org/jaxrs    
    19.                         http://cxf.apache.org/schemas/jaxrs.xsd  
    20.                         "  
    21.                         default-autowire="byName"  
    22.                         >  
    23.     <import resource="classpath:META-INF/cxf/cxf.xml" />  
    24.     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
    25.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  
    26.       
    27.     <!-- <jaxws:endpoint id="facelookWebService" address="/facelookWebService" implementor="com.facelook.webservice.server.FacelookWebServiceImpl"></jaxws:endpoint> -->  
    28.     <!-- 不知道为什么,这里的webservice配置,只能用bean来实现,否则 注入的service为空。但是之前有个项目却可以,百思不得其解。。 -->  
    29.     <bean id="facelookWebService" class="com.facelook.webservice.server.FacelookWebServiceImpl"/>   
    30.     <jaxws:endpoint id="facelookWebService1" address="/facelookWebService" implementorClass="com.facelook.webservice.server.FacelookWebServiceImpl">  
    31.         <jaxws:implementor ref="facelookWebService"/>    
    32.     </jaxws:endpoint>  
    33. </beans>  

    4、定义webservice接口FacelookWebService 和 实现类FacelookWebServiceImpl。

    [java] view plain copy
     
     print?
    1. @WebService  
    2. public interface FacelookWebService {  
    3.       
    4.     /** 
    5.      * 根据传递的条件获取相册信息 
    6.      * xml的格式规范 
    7.      * <?xml version="1.0" encoding="UTF-8"?> 
    8.      * <facelook> 
    9.      *  <condition> 
    10.      *      <name></name> 
    11.      *      <description></description> 
    12.      *      <pageno></pageno> 
    13.      *      <pagesize></pagesize> 
    14.      *  </condition> 
    15.      * </facelook> 
    16.      * 这里的WebParam必须指定,否则调用的时候返回null 
    17.      * @return 
    18.      */  
    19.     public String getAlbumList(@WebParam(name="xmlStr") String xmlStr);  
    20. }  
    21.   
    22.   
    23. @WebService  
    24. //这后面的可以不写注释后面的配置,在applicationContext配置也一样(serviceName="facelookWebService",endpointInterface="com.facelook.webservice.server.FacelookWebService")  
    25. public class FacelookWebServiceImpl implements FacelookWebService{  
    26.   
    27.     @Autowired  
    28.     private AlbumService albumService;  
    29.       
    30.     @Override  
    31.     public String getAlbumList(String xmlStr) {  
    32.         try {  
    33.             List<Album> albumList = getAlbumPage(xmlStr);  
    34.             JSONArray jsonArray = JSONArray.fromObject(albumList);  
    35.             return jsonArray.toString();  
    36.         } catch (Exception e) {  
    37.             e.printStackTrace();  
    38.         }  
    39.         return null;  
    40.     }  
    41. }   

    这样子,基本上就可以了。

    5、保存代码,发布项目,启动tomact。

    在地址栏输入:http://localhost:8080/house/services/houseWebService?wsdl  即可看到发布的服务端的明细。

    显示如下:

    这就表示CXF发布的webservice服务端成功了。

    6、通过客户端调用服务端webservice。

    axis的客户端访问:

    [java] view plain copy
     
     print?
    1. public static void main(String[] args) throws ServiceException, RemoteException, MalformedURLException {  
    2.     String xmlStr = "<?xml version="1.0" encoding="UTF-8"?>"  
    3.              + "     <facelook>"  
    4.              + "        <condition>"  
    5.              + "            <name>家</name>"  
    6.              + "            <description></description>"  
    7.              + "            <pageno></pageno>"  
    8.              + "            <pagesize></pagesize>"  
    9.              + "        </condition>"  
    10.              + "     </facelook>";  
    11.       
    12.       Service service = new Service();  
    13.       Call call = (Call) service.createCall();  
    14.       call.setTargetEndpointAddress("http://localhost:8080/facelook/services/facelookWebService?wsdl");  
    15.       QName qName = new QName("http://server.webservice.facelook.com/", "getAlbumList");  
    16.       call.setOperationName(qName);  
    17.       call.setUseSOAPAction(true);  
    18.       //这下面两行一定要加上,否则接收在服务器端收不到。  
    19.       call.addParameter("xmlStr", XMLType.XSD_STRING, ParameterMode.IN);  
    20.       call.setReturnType(XMLType.XSD_STRING);  
    21.       String result = (String) call.invoke(new Object[] { xmlStr });  
    22.       System.out.println(result);  
    23.       
    24.     //将返回的字符串转换成list集合  
    25.     //JSONArray array = JSONArray.fromObject(result);  
    26.     //List<Album> list = JSONArray.toList(array,Album.class);  
    27.       
    28. }  

    CXF客户端访问:

    [java] view plain copy
     
     print?
    1. public static void main(String[] args) throws Exception {  
    2.         //这个是用cxf 客户端访问cxf部署的webservice服务  
    3.         //千万记住,访问cxf的webservice必须加上namespace ,否则通不过  
    4.         //现在又另外一个问题,传递过去的参数服务端接收不到  
    5.         JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();  
    6.         org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:8080/facelook/services/facelookWebService?wsdl");  
    7.         //url为调用webService的wsdl地址  
    8.         QName name=new QName("http://server.webservice.facelook.com/","getAlbumList");  
    9.         //namespace是命名空间,methodName是方法名  
    10.         String xmlStr = "<?xml version="1.0" encoding="UTF-8"?>"  
    11.                  + "     <facelook>"  
    12.                  + "        <condition>"  
    13.                  + "            <name>家</name>"  
    14.                  + "            <description></description>"  
    15.                  + "            <pageno></pageno>"  
    16.                  + "            <pagesize></pagesize>"  
    17.                  + "        </condition>"  
    18.                  + "     </facelook>";  
    19.         //paramvalue为参数值  
    20.         Object[] objects=client.invoke(name,xmlStr);   
    21.         //调用web Service//输出调用结果  
    22.         System.out.println(objects[0].toString());  
    23. }  


    在这里面传递的xml规范由 服务端自己规范好了,然后去解析、获取参数,执行相应的操作,返回想要的结果给调用的客户端。。

  • 相关阅读:
    前端开发之初探五
    前端开发之初探四
    前端开发之初探三
    漫谈
    前端工程师的发展之路
    SVG
    前端开发之初探一
    前端开发之初探二
    详解浏览器缓存
    webStroage案例
  • 原文地址:https://www.cnblogs.com/joe-tang/p/7237964.html
Copyright © 2011-2022 走看看