介绍

  • 远程调用web服务,不需要自己编写具体代码,只需要调用作者给出的接口即可.

  • 我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单调用了一下服务器上的一段代码而已。

规则

  • 基于http 协议

  • 传输的内容为xml格式

  • SOAP作为一个基于XML语言的协议用于在网上传输数据。

    • SOAP = 在HTTP的基础上+XML数据。
  • WSDL – WebService Description Language – Web服务描述语言。

    • 用来描述服务的地址和基本方法,java程序通过WSDL来生成对应的代理类来调用具体的方法

Java内置WebService实现

  • 服务端(java 项目),不需要引入jar。

    // 服务端启动服务
    @WebService // 注解
    public class HelloService { public String sayHello(String name){
    System.out.println("服务端say hello");
    return "hello"+name;
    } public static void main(String[] args) { // 启动服务
    String address="http://172.27.109.133:8081/hello"; // ip为本机ip 打开cmd 输入ipconfig 找到ipv4即可
    Object implementor=new HelloService();
    Endpoint.publish(address, implementor);
    } }
    • 当服务端启动服务以后,访问http://172.27.109.133:8081/hello?wsdl出现以下内容则表示服务成功启动,如下图:

  • 客户端

    • 首先需要通过wsimport命令解析出对应的Java文件,然后复制到项目目录

      /*
      * 调用服务
      * cmd进入到任意目录 执行命令 wsimport -s . http://192.168.0.108:8080/hello?wsdl
      * 复制文件到项目
      * 然后进行调用
      * */
      public class app {
      public static void main(String[] args) {
      // 调用方法
      HelloServiceService helloServiceService = new HelloServiceService();
      HelloService helloServicePort = helloServiceService.getHelloServicePort();
      String sayHello = helloServicePort.sayHello("笑笑");
      System.out.println(sayHello);
      } }
  • 调用成功

使用CXF框架和Spring整合

CXF是apache旗下的开源框架,由Celtix + XFire这两门经典的框架合成,是一套非常流行的web service框架。

注意:CXF2.X版本和Spring4.X不兼容,要用CXF3.X

服务端

  • 编写接口

    @WebService
    public interface HelloWorldInterface {
    String sayHello(String text);
    }
  • 编写实现类

//@WebService在实现类的注解让CXF知道WSDL创建时所使用的接口。

@WebService(endpointInterface = "webservice.service.HelloWorldInterface")

public class ServerToJava implements HelloWorldInterface {

public String sayHello(String text) {
return "hello" + text;
}

}

```
  • 导入项目jar Maven:

    <properties>
    <spring.version>4.2.4.RELEASE</spring.version>
    <cxf.version>3.2.0</cxf.version>
    </properties> <dependencies> <!--spring -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
    </dependency> <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>3.1.8</version>
    </dependency> <!--web service 以下都是cxf必备的 --> <!--org.apache.cxf.transport.servlet.CXFServlet -->
    <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>3.1.8</version>
    </dependency> <!--不加这个包会报错Unable to locate spring NamespaceHandler for XML schema namespace
    [http://cxf.apache.org/jaxws] -->
    <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>3.1.8</version>
    </dependency> <!--java实现webservice,不部署到tomcat,需要jetty包支持 -->
    <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http-jetty</artifactId>
    <version>3.1.8</version>
    </dependency>
    </dependencies>
  • 配置web.xml,因为CXF是基于Servlet所以要配置对应的Servlet

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>webservice_server</display-name>
    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    </welcome-file-list> <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext-service.xml</param-value>
    </context-param>
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> <servlet>
    <servlet-name>CXFService</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>CXFService</servlet-name>
    <url-pattern>/webservice/*</url-pattern>
    </servlet-mapping> </web-app>
  • 创建Spring配置文件 , CXF配置可以放在Spring配置文件中,但不要放在SpringMVC文件中

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://cxf.apache.org/jaxws
    http://cxf.apache.org/schemas/jaxws.xsd"> <!-- jax-ws endpoint定义 -->
    <bean id="webserviceServer" class="webservice.ServerToJava"/>
    <!--发布webservice-->
    <jaxws:endpoint id="myService" implementor="#webserviceServer" address="/web-publish" />
    </beans>
  • 访问时的路径:http://localhost:8080/webservice_server/webservice/web-publish?wsdl 规则为:主机+项目+CXFServlet的访问路径+address,出现对应的wsdl页面即部署成功。

客户端

  • 普通Java程序调用

    • 当自己有java的webservice的服务端,即拥有接口的时候,可以直接通过接口和地址进行调用

    public class ClientForCXF {

    public static MyWebService getInterFace() {

    JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();

    factoryBean.setServiceClass(MyWebService.class);

    factoryBean.setAddress("http://localhost:8080/server/web-publish");

    return (MyWebService) factoryBean.create();

    }

      public static void main(String[] args) {
    MyWebService myWebService = getInterFace();
    System.out.println("client: " + myWebService.add(1, 3));
    }

    }

      ```
    • 而往往服务端可能由别的语言实现,或者服务端并非我们自己实现,我们没有服务端接口,我们只能获得暴漏的wsdl,并进行调用,这就需要使用wsdl2java生成该wsdl的java客户端并调用了

      • 首先将从官网下载的文件解压,并且配置环境变量为C:\Users\Administrator\Downloads\apache-cxf-3.1.14\bin 即解压出来文件的bin目录

      • cmd中输入wsdl2java -help输出信息即表示配置完成, 注意,这里不能使用jdk的wsimport

      • cmd进入任意文件夹,运行命令wsdl2java -encoding utf-8 http://localhost:8080/webservice_server/webservice/web-publish?wsdl 然后将生成的文件复制到目录下,随后直接调用就可以

    public static void main(String[] args)

    ServerToJavaService javaService = new ServerToJavaService();

    HelloWorldInterface c = javaService.getServerToJavaPort();

    String a = c.sayHello("s");

    System.out.println(a);

    }

    ```

  • 通过Spring容器

    • 需要有CXF和Spring的jar

    • 先将接口(只是接口即可)生成出来放到项目中

    • 编写配置文件

          <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:p="http://www.springframework.org/schema/p"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xmlns:jaxws="http://cxf.apache.org/jaxws"
      xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx.xsd
      http://cxf.apache.org/jaxws
      http://cxf.apache.org/schemas/jaxws.xsd"> <jaxws:client id="crmClient"
      serviceClass="webservice_client.HelloWorldInterface" <!-- 对应的接口-->
      address="http://localhost:8080/webservice_server/webservice/web-publish"/> <!-- 地址 --> </beans>
    • 最后和使用平常的bean一样使用就可以

         public static void main(String[] args) {
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-service.xml");
      HelloWorldInterface c = (HelloWorldInterface) applicationContext.getBean("crmClient");
      String str = c.sayHello("终于等到你");
      System.out.println(str); }
    • 结果

类似的框架还有Alibaba的开源项目Dubbo ,这是入门介绍http://www.cnblogs.com/liyuhui-Z/p/7799615.html

参考文章http://www.imooc.com/article/14635

远程调用服务框架-CXF(WebServic)的更多相关文章

  1. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  2. 架构设计:一种远程调用服务的设计构思(zookeeper的一种应用实践)

    在深入学习zookeeper我想先给大家介绍一个和zookeeper相关的应用实例,我把这个实例命名为远程调用服务.通过对这种应用实例的描述,我们会对zookeeper应用场景会有深入的了解. 远程调 ...

  3. 如何从零开始实现一个soa远程调用服务基础组件

    说起soa远程调用基础组件,最著名的莫过于淘宝的dubbo了,目前很多的大型互联网公司都有一套自己的远程服务调用分布式框架,或者是使用开源的(例如dubbo),或者是自己基于某种协议(例如hessia ...

  4. spring boot / cloud (八) 使用RestTemplate来构建远程调用服务

    spring boot / cloud (八) 使用RestTemplate来构建远程调用服务 前言 上周因家里突发急事,请假一周,故博客没有正常更新 RestTemplate介绍: RestTemp ...

  5. 使用AIDL远程调用服务中的方法

    AIDL:android interface define language(接口定义语言) 作用:方便远程调用其他服务中的方法 注意:安卓四大组件都要在清单文件注册 aidl创建图: AIDL的全称 ...

  6. Dubbo远程调用服务框架原理与示例

    Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成. 主要核心部件: Remoting: 网络通信框架 ...

  7. 转: Dubbo远程调用服务框架原理与示例

    Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和  Spring 框架无缝集成. 主要核心部件: Remoting:  网络通 ...

  8. Springcloud踩坑记---使用feignclient远程调用服务404

    公司项目进行微服务改造,由之前的dubbo改用SpringCloud,微服务之间通过FeignClient进行调用,今天在测试的时候,eureka注册中心有相应的服务,但feignclient就是无法 ...

  9. springcloud系列五 feign远程调用服务

    一:Feign简介 Feign 是一种声明式.模板化的 HTTP 客户端,在 Spring Cloud 中使用 Feign,可以做到使用 HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完 ...

随机推荐

  1. B树、B+树、B*树

    二叉搜索树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如 ...

  2. spring框架总结(04)----介绍的是Spring中的JDBC模板

    1.1  Jdbc模板概述 它是spring框架中提供的一个对象,是对原始Jdbc API对象的简单封装.spring框架为我们提供了很多的操作模板类,入下图所示: 我们今天的主角在spring-jd ...

  3. Docker到底是什么

    简单讲docker和vm虚拟机类似,都是在同一硬件上虚拟化出多个服务器应用实例的功能,据Bottomley声称,借助经过全面调优的容器系统,你就可以在同一硬件上拥有数量比使用Xen虚拟机或KVM虚拟机 ...

  4. M-移动端的webapp页面布局教程和webapp实战分析

    http://www.25xt.com/html5css3/8092.html 响应式设计 1 媒体查询 适用于不同固定宽度设计 媒体类型 : screen 屏幕 print 打印机 handheld ...

  5. 移动端分享到微信和QQ

    关于在H5页面实现分享到微信和QQ,当初做的时候由于没有做过这方面的功能,也查了很多资料,找了很多插件,试了很多方法,大部分的都是点击后出现一个二维码,这不 符合我的需求,所以在网上找了一个 nati ...

  6. netfilter/iptables和firewalld的关系

    1.netfilter 是linux 内核模块,其中包含了大量的内核规则,而要想对这些内核规则进行操作,就需要用户态的工具. iptables和firewalld就是一个用户态的工具. 2.iptab ...

  7. Hadoop(九)Hadoop IO之Compression和Codecs

    前言 前面一篇介绍了Java怎么去查看数据块的相关信息和怎么去查看文件系统.我们只要知道怎么去查看就行了!接下来我分享的是Hadoop的I/O操作. 在Hadoop中为什么要去使用压缩(Compres ...

  8. win10 uwp 获取指定的文件 AQS

    很多时候不需要获取整个文件夹的文件,是需要获取文件夹里指定的文件. 那么 UWP 如何对文件夹里的文件进行过滤,只拿出自己需要的文件? 本文:如何使用通配符或文件匹配方式在uwp获取文件夹中指定的文件 ...

  9. 使用getCurrentPosition方法实时获取当前Geolocation信息(赋源码文件)--html5、JavaScript

    使用getCurrentPosition方法实时获取当前Geolocation信息: 1.typeof 运算符返回一个用来表示表达式的数据类型的字符串 <script> alert(typ ...

  10. Prometheus 到底 NB 在哪里?- 每天5分钟玩转 Docker 容器技术(84)

    本节讨论 Prometheus 的核心,多维数据模型.我们先来看一个例子. 比如要监控容器 webapp1 的内存使用情况,最传统和典型的方法是定义一个指标 container_memory_usag ...