zoukankan      html  css  js  c++  java
  • eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(一)

    eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(一)

    本篇博客主要包含五个内容:

    1.CXF换将搭建以及eclipse配置CXF。

    2.eclipse创建webservice服务端。

    3.eclipse创建webservice客户端访问webservice服务端。

    4.使用Android studio创建webservice客户端APP访问服务端。

    5.开发过程中可能出现的一些错误。

    (后两个方面在下一篇博客中,详情见末尾。)

    各工具版本号:

    Eclipse:Eclipse Java EE IDE for Web Developers. Version: Mars.2 Release (4.5.2)。

    Jdk:1.7.0_60,64位,

    Tomcat:apache-tomcat-7.0.47。

    Android studio:目前最新版:Android studio 3.0.1。

    闲话少叙,直奔主题。

    1.CXF环境搭建以及eclipse配置CXF

    从Apache官网 http://cxf.apache.org/download.html 下载CXF压缩包,我下载的是3.1.14版本的,

    这是下载链接:

    http://www.apache.org/dyn/closer.lua/cxf/3.1.14/apache-cxf-3.1.14.zip

    下载好之后配置CXF的环境变量,解压下载的压缩包,根据自己的路径配置环境变量,楼主是下面的路径,

    在CLASSPATH中添加 D:Javaapache-cxf-2.7.5lib,

    新建CXF_HOME,值为 D:Javaapache-cxf-2.7.5,

    在PATH中添加 D:Javaapache-cxf-2.7.5in,

    配置好之后,在eclipse的Windows->prerferences中找到webservice->CXF 2.*,然后配置,指向cxf文件夹的路径,

    环境配置完成。

    2.Eclipse创建webservice服务端

    先介绍操作,再介绍原理。

    Eclipse中新建动态web项目,Dyanmic web modult version选择2.5,3.0版本的好像后面使用cxf时会出现问题,Configuration选择CXF***,然后下一步,

    这里勾选创建web.xml文件,

    再下一步,能看到刚才的CXF配置的环境,然后点击完成。

    动态项目创建完成之后,我的目录结构为:

    下面贴代码:

    接口SayHelloService.java

    1. package com.diy.dao;
    2.  
    3. import javax.jws.WebMethod;
    4. import javax.jws.WebParam;
    5. import javax.jws.WebResult;
    6. import javax.jws.WebService;
    7.  
    8. @WebService(targetNamespace = "http://dao.diy.com", serviceName = "SayHelloService")
    9. public interface SayHelloService {
    10.  
    11.    @WebResult(name = "return", targetNamespace = "http://dao.diy.com")
    12.    @WebMethod(action = "http://dao.diy.com/sayHello")
    13.    public String sayHello(@WebParam(name = "arg0", targetNamespace = "http://dao.diy.com") String arg0);
    14. }

    实现类SayHelloServiceImpl.java

    1. package com.diy.dao;
    2.  
    3. public class SayHelloServiceImpl implements SayHelloService {
    4.  
    5.    public String sayHello(String arg0) {
    6.       return "Hello:" + arg0;
    7.    }
    8. }

    主类Server.java

    1. package com.diy.dao;
    2.  
    3. import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
    4.  
    5. public class Server {
    6.    public static void main(String[] args) {
    7.       System.out.println("开启webservice。。。");
    8.       SayHelloService sayHelloService = new SayHelloServiceImpl();
    9.       String address = "http://10.201.23.77:8080/web";
    10.       JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
    11.       factoryBean.setAddress(address); // 设置暴露地址
    12.       factoryBean.setServiceClass(SayHelloService.class); // 设置接口类
    13.       factoryBean.setServiceBean(sayHelloService); // 设置实现类
    14.       factoryBean.create();
    15.       System.out.println("开启webservice成功。。。");
    16.    }
    17. }

    在主类中右击run as ->Java application,如果开启失败,在任务管理器中关闭已经开启的Java进程,这是我的开启webservice服务成功界面:

    1. 开启webservice。。。
    2. 一月 03, 2018 1:05:02 下午 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
    3. 信息: Creating Service {http://dao.diy.com}SayHelloService from class com.diy.dao.SayHelloService
    4. 一月 03, 2018 1:05:03 下午 org.apache.cxf.endpoint.ServerImpl initDestination
    5. 信息: Setting the server's publish address to be http://10.201.23.77:8080/web
    6. 一月 03, 2018 1:05:03 下午 org.eclipse.jetty.util.log.Log initialized
    7. 信息: Logging initialized @1590ms
    8. 一月 03, 2018 1:05:03 下午 org.eclipse.jetty.server.Server doStart
    9. 信息: jetty-9.2.22.v20170606
    10. 一月 03, 2018 1:05:03 下午 org.eclipse.jetty.server.handler.AbstractHandler doStart
    11. 警告: No Server set for org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine$1@88a3523
    12. 一月 03, 2018 1:05:03 下午 org.eclipse.jetty.server.AbstractConnector doStart
    13. 信息: Started ServerConnector@79de7e39{HTTP/1.1}{10.201.23.77:8080}
    14. 一月 03, 2018 1:05:03 下午 org.eclipse.jetty.server.Server doStart
    15. 信息: Started @1746ms
    16. 一月 03, 2018 1:05:03 下午 org.eclipse.jetty.server.handler.ContextHandler setContextPath
    17. 警告: Empty contextPath
    18. 一月 03, 2018 1:05:03 下午 org.eclipse.jetty.server.handler.ContextHandler doStart
    19. 信息: Started o.e.j.s.h.ContextHandler@5abe12e3{/,null,AVAILABLE}
    20. 一月 03, 2018 1:05:03 下午 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL
    21. 信息: Creating Service {http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01}Discovery from WSDL: classpath:/org/apache/cxf/ws/discovery/wsdl/wsdd-discovery-1.1-wsdl-os.wsdl
    22. 一月 03, 2018 1:05:03 下午 org.apache.cxf.endpoint.ServerImpl initDestination
    23. 信息: Setting the server's publish address to be soap.udp://239.255.255.250:3702
    24. 一月 03, 2018 1:05:05 下午 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
    25. 信息: Creating Service {http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01}DiscoveryProxy from class org.apache.cxf.jaxws.support.DummyImpl
    26. 开启webservice成功。。。

    开启成功之后,在浏览器地址栏中输入:服务发布地址+?wsdl,比如我这里就是 http://10.201.23.77:8080/web?wsdl ,回车之后,出现服务的wsdl描述。

    出现这些描述信息之后,就表示webservice服务已经发布成功。

    理论介绍:

    Soapaction:在接口名上面,使用注解:

    @WebService(targetNamespace = "http://dao.diy.com", serviceName = "SayHelloService"),targetnamespace的值就是包名倒写,

    指明这是一个webservice服务,

    在方法名上使用注解:

    @WebResult(name = "return", targetNamespace = "http://dao.diy.com")

    @WebMethod(action = "http://dao.diy.com/sayHello") ,

    webresult指明返回结果,webmethod指明这是一个服务端的方法,其中的action对应soapaction,如果这里不写action,soapaction的值为空,客户端运行时,会报错,错误原因差不多是找不到方法名。接口中的每一个注解都不可缺少,否则客户端运行报错。

    下面介绍eclipse创建webservice客户端。

    3.eclipse创建webservice客户端来访问服务端

    先介绍操作,再介绍原理。

    使用eclipse创建一个Java项目,命名为webservice2client,

    然后进到这个Java项目的根目录àsrc目录下,我的是这样的: D:javaeeworkspacewebservice2clientsrc ,

    进入之后,打开命令行,进到这个src目录下,然后输入 wsdl2java http://10.201.23.77:8080/web?wsdl ,(根据自己的发布地址修改代码,最后加一个?wsdl即可),回车,稍等几秒会生成一个文件夹,

    即生成客户端代码,生成之后,在eclipse中刷新项目,查看那个接口类文件,可能targetnamespace会缺少信息,

    在这里填写图中下面一行的targetNamespace值即可(我上一个demo项目中就不存在这个问题,这个不知道为什么),

    新建一个Client类,代码为:

    1. package com.diy.dao;
    2.  
    3. public class Client {
    4.  
    5.    public static void main(String[] args) {
    6.       System.out.println("开始获取数据。。。");
    7.       SayHelloService_Service service = new SayHelloService_Service();
    8.       SayHelloService sayHelloService = service.getSayHelloServicePort();
    9.       System.out.println(sayHelloService.sayHello("1"));
    10.       System.out.println("获取完成。");
    11.    }
    12.  
    13. }

    右击运行,

    Webservice客户端运行成功。

    接下来是一些理论类描述:

    关于命令行中使用wsdl2java 命令,打开一开始解压的CXF文件夹的bin目录,可以看到

    这里是包含wsdl2Java命令的,所以在添加了cxf的环境变量之后,可以直接使用这个命令生成客户端代码,如果不使用wsdl2Java这个命令的话,也可以使用 jdk自带的生成客户端代码的命令, wsimport.exe 工具,详情可以参考 http://blog.csdn.net/tianma630/article/details/8231224 这个网址,介绍很详细。

    剩下的两个方面,请查看个人的下一篇博客 : eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(二)

    新增demo源码下载地址:链接:https://pan.baidu.com/s/1sm1w3ud  密码:0n40,链接失效的话,请评论区留言个人百度账号,给你分享一下。

    如果你能从这篇文章中获得一丁点对自己有用的信息,那这篇文章就是值得的;如果确实帮助了你,麻烦动一下鼠标,请点击推荐,

    另外由于编者水平有限,文章中如有不妥之处或者有什么疑问,可直接在下面评论指出,不胜感激。

  • 相关阅读:
    ACM学习
    吴翼大神
    心急的C小加(两种解法)
    万圣节派对(水题)
    poj 1163 The Triangle
    POJ 1088滑雪
    1690 开关灯
    908. 校园网
    STL之stack栈
    1163 访问艺术馆
  • 原文地址:https://www.cnblogs.com/diyunfei/p/8183852.html
Copyright © 2011-2022 走看看