zoukankan      html  css  js  c++  java
  • Web服务cxf框架发布2

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。 作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317/article/details/9320053

    一、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

     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服务。 

     1 <?xml version="0" encoding="UTF-8"?>  
     2 <beans  
     3     xmlns="http://www.springframework.org/schema/beans"  
     4     xmlns:xsi="http://www.worg/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-xsd  
    12                         http://www.springframework.org/schema/tx  
    13                         http://www.springframework.org/schema/tx/spring-tx-xsd  
    14                         http://www.springframework.org/schema/aop  
    15                         http://www.springframework.org/schema/aop/spring-aop-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>  
    View Code

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

     1 @WebService  
     2 public interface FacelookWebService {  
     3       
     4     /** 
     5      * 根据传递的条件获取相册信息 
     6      * xml的格式规范 
     7      * <?xml version="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 }   
    View Code

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

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

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

    显示如下:

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

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

    axis的客户端访问: 

    public static void main(String[] args) throws ServiceException, RemoteException, MalformedURLException {  
        String xmlStr = "<?xml version="0" encoding="UTF-8"?>"  
                 + "     <facelook>"  
                 + "        <condition>"  
                 + "            <name>家</name>"  
                 + "            <description></description>"  
                 + "            <pageno></pageno>"  
                 + "            <pagesize></pagesize>"  
                 + "        </condition>"  
                 + "     </facelook>";  
          
          Service service = new Service();  
          Call call = (Call) service.createCall();  
          call.setTargetEndpointAddress("http://localhost:8080/facelook/services/facelookWebService?wsdl");  
          QName qName = new QName("http://server.webservice.facelook.com/", "getAlbumList");  
          call.setOperationName(qName);  
          call.setUseSOAPAction(true);  
          //这下面两行一定要加上,否则接收在服务器端收不到。  
          call.addParameter("xmlStr", XMLType.XSD_STRING, ParameterMode.IN);  
          call.setReturnType(XMLType.XSD_STRING);  
          String result = (String) call.invoke(new Object[] { xmlStr });  
          System.out.println(result);  
          
        //将返回的字符串转换成list集合  
        //JSONArray array = JSONArray.fromObject(result);  
        //List<Album> list = JSONArray.toList(array,Album.class);  
    

    CXF客户端访问:

    public static void main(String[] args) throws Exception {  
            //这个是用cxf 客户端访问cxf部署的webservice服务  
            //千万记住,访问cxf的webservice必须加上namespace ,否则通不过  
            //现在又另外一个问题,传递过去的参数服务端接收不到  
            JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();  
            org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:8080/facelook/services/facelookWebService?wsdl");  
            //url为调用webService的wsdl地址  
            QName name=new QName("http://server.webservice.facelook.com/","getAlbumList");  
            //namespace是命名空间,methodName是方法名  
            String xmlStr = "<?xml version="0" encoding="UTF-8"?>"  
                     + "     <facelook>"  
                     + "        <condition>"  
                     + "            <name>家</name>"  
                     + "            <description></description>"  
                     + "            <pageno></pageno>"  
                     + "            <pagesize></pagesize>"  
                     + "        </condition>"  
                     + "     </facelook>";  
            //paramvalue为参数值  
            Object[] objects=client.invoke(name,xmlStr);   
            //调用web Service//输出调用结果  
            System.out.println(objects[0].toString());  
    }  
    
    在这里面传递的xml规范由 服务端自己规范好了,然后去解析、获取参数,执行相应的操作,返回想要的结果给调用的客户端。。
  • 相关阅读:
    巴洛克式和哥特式的区别
    推荐阅读书籍,是时候再行动起来了。
    AtCoder ABC 159F Knapsack for All Segments
    AtCoder ABC 159E Dividing Chocolate
    AtCoder ABC 158F Removing Robots
    AtCoder ABC 158E Divisible Substring
    AtCoder ABC 157F Yakiniku Optimization Problem
    AtCoder ABC 157E Simple String Queries
    AtCoder ABC 157D Friend Suggestions
    AtCoder ABC 156F Modularness
  • 原文地址:https://www.cnblogs.com/isoftware/p/4020448.html
Copyright © 2011-2022 走看看