cxf - WebService的介绍和使用

掌握使用CXF快速开发webservice服务和生成client端技能 本文主要通过示例详细介绍了如何使用CXF进行webservice服务服务端的开发和服务发布,以及如何通过CXF为已经发布的webservice服务生成客户端代码,并详细演示了通过生成的客户端代码进行服务的调用,希望对有需要的小伙伴们有所帮助! 阅读详情
WebService的介绍和使用

概念:Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。分为SOAP和restfull风格

XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。

Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。

WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。

UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。

调用原理

在这里插入图片描述

实现一个完整的Web服务包括以下步骤:

◆ Web服务提供者设计实现Web服务,并将调试正确后的Web服务通过Web服务中介者发布,并在UDDI注册中心注册; (发布)

◆ Web服务请求者向Web服务中介者请求特定的服务,中介者根据请求查询UDDI注册中心,为请求者寻找满足请求的服务; (发现)

◆ Web服务中介者向Web服务请求者返回满足条件的Web服务描述信息,该描述信息用WSDL写成,各种支持Web服务的机器都能阅读;(发现)

◆ 利用从Web服务中介者返回的描述信息生成相应的SOAP消息,发送给Web服务提供者,以实现Web服务的调用;(绑定)

◆ Web服务提供者按SOAP消息执行相应的Web服务,并将服务结果返回给Web服务请求者。(绑定)

SOAT风格
Helloword

首先下载apache-cxf-3.3.1,里面有jar包

新建一个java web工程,将apache-cxf-3.3.1的lib包的jar拷贝到lib文件夹下

新建一个HelloWord.java的接口和实现它 的HelloWordImpl.java,在接口上注解@WebService

@WebService
public interface HelloWord {
     public String sayHello(String name);
}

public class HelloWordImpl implements HelloWord {
    @Override
    public String sayHello(String name) {
        return "name="+name+"------------age=21";
    }
}

新建一个MainService.java 来发布服务,运行服务,会发现它不会停止,一直在运行

public class MainService {
    public static void main(String[] args) {
        JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();
        //发布的地址和服务名
        jaxWsServerFactoryBean.setAddress("http://192.168.43.53:8888/helloword");
        jaxWsServerFactoryBean.setServiceClass(HelloWordImpl.class);
        Server server = jaxWsServerFactoryBean.create();
        server.start();
        System.out.println("======开始服务--------->>>>>>>>");
    }
}

打开游览器输入:http://192.168.43.53:8888/helloword?wsdl可以看到如下,说明服务启动正确

新建一个Client,来调用服务,运行程序,输出

public class Client {
    public static void main(String[] args) {
        /*代理*/
        JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
        /*地址*/
        jaxWsProxyFactoryBean.setAddress("http://192.168.43.53:8888/helloword");
        /*传入接口*/
        jaxWsProxyFactoryBean.setServiceClass(HelloWord.class);
        HelloWord helloword = (HelloWord) jaxWsProxyFactoryBean.create();
        String str = helloword.sayHello("chenlong");
        System.out.println(str);
    }
}

一个简单的HelloWord就写好了。这是我们自己手动写代码来调用的,如果不写代理类,怎么实现呢?借助JAX-WS工具。

首先到apache-cxf-3.3.1\bin这个目录下,打开cmd,输入wsdl2java <http://192.168.43.53:8888/helloword?wsdl 然后会发现,该目录下回生成一些代码,将这些类直接复制到项目的一个包中(或者达成jar包放在lib下也可以),新建client2.java

public class Client2 {
    public static void main(String[] args) {
        HelloWord helloWord  = new HelloWordImpl();
        String chen = helloWord.sayHello("chen");
        System.out.println(chen);
    }
}

直接这样就可以了。

Restful Web Services (JAX-RS)

•JAX-RS= Java API For Restful Web Services

• JAX-RS是JAVA EE6 引入的一个新规范。 是一个Java 编程语言的应用程序接口,支持按照表述性状态转移 (REST)架构风格创建Web服务。

• JAX-RS使用了Java标注来简化Web服务的客户端和服务端的开发和部署。

• 除了JAX-RS方式发布Restful风格的Webservice,SpringMVC也可以发布Restful风格的Webservice

JAX-RS提供了一些标注将一个资源类,一个POJO Java类,封装为Web资源。包括:

@Path,标注资源类或者方法的相对路径 @GET,@PUT,@POST,@DELETE,标注方法是HTTP请求的类型。

@Produces,标注返回的MIME媒体类型 @Consumes,标注可接受请求的MIME媒体类型

@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分别标注方法的参数来自于HTTP请求的不同位置,例如:

@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,

@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。

基于JAX-RS实现的框架有Jersey,RESTEasy等,这两个框架创建的应用可以很方便地部署到Servlet 容器中

简单实例:

创建一个web工程,添加jar包,要实现的服务是根据ID查用户,添加一个用户的功能

首先创建Customer.java

@XmlRootElement
public class Customer {
    @FormParam("id")
    private String id;
    @FormParam("name")
    private String name;
    @FormParam("age")
    private int age;
    public Customer() {}
    public Customer(String id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

@XmlRootElement,可以将customer转为xml

创建一个CustomerService 接口

@WebService
public interface CustomerService {
    Customer getCustomerById(String id);
    String addCustomer(Customer customer);
}

实现接口,一个get方法,一个post方法

@Path("/crm")
public class CustomerServiceImpl implements CustomerService {
    @Override
    @GET
    @Path("/customer/{id}")
    @Produces("application/json")//以什么样的方式返回数据xml,json标注返回的MIME媒体类型
    public Customer getCustomerById(@PathParam("id") String id) {
        if(id.equals("1")){
            return  new Customer("1","zhangsan",12);
        }
        if(id.equals("2")){
            return  new Customer("2","lisi",13);
        }
        return new Customer("3","chenlong",11);
    }
    @Override
    @POST
    @Path("/customer")
    @Consumes("application/x-www-form-urlencoded")
    public String addCustomer(@BeanParam Customer customer) {
        System.out.println(customer);
        return "success:"+customer.toString();
    }}

手动发布服务

public class Main {
    public static void main(String[] args) {
        JAXRSServerFactoryBean jaxrsServerFactoryBean = new JAXRSServerFactoryBean();
        //customer为自己写的服务名,客户端用这个地址加方法就可以用了
        jaxrsServerFactoryBean.setAddress("http://localhost:8888/customer");
        jaxrsServerFactoryBean.setResourceClasses(CustomerServiceImpl.class);
        jaxrsServerFactoryBean.create().start();
        System.out.println("开始服务------->>>>>>>");
    }
}

服务启动之后,在游览器输入:http://localhost:8888/customer/crm/customer/3,可以看到json数据

使用客户端调用,get调用

public class Client {
    public static void main(String[] args) throws IOException {
        //1. 创建 HttpClient 的实例
        CloseableHttpClient httpclient = HttpClientBuilder.create().build();

        //2. 创建某种连接方法的实例
        HttpGet httpget = new HttpGet("http://localhost:8888/customer/crm/customer/3");

        //3. 调用第一步中创建好的实例的execute方法来执行第二步中创建好的链接类实例
        HttpResponse response = httpclient.execute(httpget);

        //4. 读response获取HttpEntity
        HttpEntity entity = response.getEntity();

        //5. 对得到后的内容进行处理
        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
            String result = EntityUtils.toString(entity, "UTF-8");
            System.out.println(result);
        } else {
            String result = EntityUtils.toString(entity, "UTF-8");
            System.err.println(result);
        }
        //6. 释放连接。无论执行方法是否成功,都必须释放连接
        EntityUtils.consume(entity);
        httpclient.close();
    }
}

使用客户端post请求

public class PostClient {
    public static void main(String[] args) throws Exception {
        /*创建HTTPclient的实例*/
        CloseableHttpClient closeableHttpClient = HttpClientBuilder.create().build();
        /*创建链接的方式*/
        HttpPost httpPost = new HttpPost("http://localhost:8888/customer/crm/customer");
        /*传递参数*/
        List<BasicNameValuePair> list= new ArrayList<>();
        list.add(new BasicNameValuePair("id","4"));
        list.add(new BasicNameValuePair("name","陈龙"));
        list.add(new BasicNameValuePair("age","18"));
        HttpEntity httpEntity = new UrlEncodedFormEntity(list,"utf-8");
        httpPost.setEntity(httpEntity);
        /*调用*/
        HttpResponse execute = closeableHttpClient.execute(httpPost);
        // 读response获取HttpEntity
        HttpEntity entity = execute.getEntity();
        if(execute.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
            String s = EntityUtils.toString(entity, "Utf-8");
            System.out.println(s);
        }else {
            String s = EntityUtils.toString(entity, "Utf-8");
            System.out.println(s);
        }
        //6. 释放连接。无论执行方法是否成功,都必须释放连接
        EntityUtils.consume(entity);
        closeableHttpClient.close();
    }
}

运行,可在

客户端控制台下输出:success:Customer{id=‘4’, name=‘陈龙’, age=18}

在服务器控制台输出:Customer{id=‘4’, name=‘陈龙’, age=18}

spring + cxf 的整合

工程的结构

在这里插入图片描述
创建一个web maven工程,在web.xml加入代码

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springcxf.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- CXF的Servlet -->
  <servlet>
    <servlet-name>cxf</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <!-- 本系统的WebService路径必须以/ws/开头 -->
  <servlet-mapping>
    <servlet-name>cxf</servlet-name>
    <url-pattern>/ws/*</url-pattern>
  </servlet-mapping>

将上述的Customer,和CustomerService以及实现类加入工程,以及helloword的服务加进来,在resource目录下新建application.xml

<?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:jaxws="http://cxf.apache.org/jaxws"
       xmlns:jaxrs="http://cxf.apache.org/jaxrs"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
		http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
		http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">

<jaxws:endpoint id="helloword" implementor="ws.HelloWordImpl" address="/helloword"></jaxws:endpoint>

    <jaxrs:server id="customer" address="/customerService">
        <jaxrs:serviceBeans>
            <bean id="customerService" class="clong.service.impl.CustomerServiceImpl"></bean>
        </jaxrs:serviceBeans>
    </jaxrs:server>
</beans>

启动Tomcat,在游览器访问http://localhost:8080/ws/,可以看到你发布的服务

在这里插入图片描述

这时候用代码调用只需要改:HttpGet httpget = new HttpGet(“http://localhost:8080/ws/customerService/crm/customer/3”);就可以了,我这里不知道为什么掉用这个方法,获取不到json,显示

No message body writer has been found for class clong.bean.Customer, ContentType: application/json

而将这个方法的 @Produces(“application/json”)改为 @Produces(“application/xml”),就可以显示xml数据,不知道哪里有问题,待完善

Post 请求一样的,将HttpPost httpPost = new HttpPost(“http://localhost:8080/ws/customerService/crm/customer”);修改就可以了。

大概的webservice就到这里了。以后有新需求,在添加!

【WebService】springboot整合cxf实现webService远程调用 一、前言        在做接口对接的时候需要接口以HTTPS和WebService的形式暴露,虽然最近这几年restful非常火爆,但在一些特定的领域或者一些老旧系统中仍然采用WebService的形式来实现远程通信。       上一篇博客讲了WebService实现远程调用,在博文的最后,自己阐述了关于那种客户端调用存在的问题,如大家有疑问,欢迎留言区指正。二、实现       废话上一篇博... 阅读详情

相关推荐

CXF整合Spring发布WebService实例

一、说明: 上一篇简单介绍了CXF以及如何使用CXF来发布一个简单的WebService服务,并且介绍了客户端的调用。 这一篇介绍如何使用CXF与spring在Web项目中来发布WebService服务,CXF版本为3.1.4 ,Spring版本为4.1.7 ,JDK版本 1.7 ,Tomcat 7 二、实例实现过程: 首先略过CXF、以及spring的下载过程。 ①    新建 J

无羁之风的专栏 8111

WebService基础入门 CXF(WS + RS)

一、基本介绍 Web Services是一个软件接口,它描述了一组可以在网络上通过标准化的 XML 消息传递访问的操作。它使用基于 XML 语言的协议来描述要执行的操作或者要与另一个 Web 服务交换的数据。Web Services更多是一种标准,而不是一种具体的技术,不同的平台、语言大都提供Web Services的开发实现。在java领域,Web Services的框架很多,...

weixin_30731287的博客 400

已有ssh项目中加入webservice(CXF)

已有ssh项目编写webService接口

ccbbccaa的博客 3002

WebService之CXF使用

Apache CXF 是一个开源的 WebService 框架,CXF可以用来构建和开发 WebService,这些服务可以支持多种协议,比如:SOAP、POST/HTTP、HTTP ,CXF 大大简化了WebService并且可以天然地和 Spring 进行无缝集成。

qq_35338042的博客 4469

apache-cxf-3.3.0.zip

用于生成webservice客户端 解压进入bin目录 1、执行cmd 2、执行wsdl2java -d D:\11//生成路径 -p com.web.GetPatientInfo//包名 -client D:\messageServer.xml//文件路径也可以是wsdl

apache-cxf-3.3.1

可以用于webservcie接口生成客户端,需要jdk1.8以上的版本,最新的版本。

CXF创建WebService服务配置说明

使用CXF框架创建WebService服务,不需要使用tomcat发布

weixin_46090515的博客 1165

cxf3.2.1 最小开发包

cxf3.2.1自己整理的最少开发包 如不带jetty和spring的依赖包。出现Cannot create a secure XMLInputFactory异常提示时通常是少了woodstox-core-asl-4.2.0.jar或stax2-api这两个包,少这两个包服务能够启动成功,但客户端连接web service时就出现错误提示了.

WebService学习(二)SpringBoot集成CXF实现WebService

springboot集成CXF实现WebService

想混口饭&的博客 1510

Spring3整合CXF(Maven项目)

使用Spring3整合了CXF开发的webservice项目,该项目只有服务端,客户端可以使用eclipse根据WDSL地址自动生成。

大白映射 宝马Esys编程设码映射、USB设备映射

大白映射,宝马Esys设码编程、USB设备映射

denson0394的博客 4801

使用CXF和camel-cxf调用webservice

CXF是什么 Apache CXF 是一个开源的、全功能的WebService框架,它提供了一套工具和API来帮助开发和构建WebService,像 JAX-WS 和 JAX-RS。它也支持许多WebService标准,例如: SOAP WS-Addressing WS-Policy WS-ReliableMessaging WS-SecureConversation W...

刘刚的空间 2081

ISP图像处理Verilog仿真框架搭建(附代码)

基于Verilog的图像处理仿真框架搭建

路漫漫其修远兮,吾将上下而求索 1898

WebService之CXF框架

本文主要包括以下内容 ant工具的使用利用cxf实现webservicecxf与spring整合 ajax访问webservice ant 工具 1、为什么要用到ant这个工具呢? Ant做为一种工具已经广泛被使用,并且历史悠久。 使用ant的内置命令,可以编译java源文件(javac),运行java文件(java),给class文件打包(jar、war、ear), 也可以创建(mkdir)、删除...

lgxzzz的博客 1539

Mac上IDEA的PlantUML插件报错‘找不到Graphviz’?手把手教你用Homebrew搞定(附阿里云镜像避坑)

本文详细解决了Mac上IDEA的PlantUML插件报错‘找不到Graphviz’的问题,通过Homebrew安装Graphviz并配置阿里云镜像源,特别针对Apple Silicon芯片用户提供了优化方案。文章还涵盖了IDEA中PlantUML插件的正确配置和常见问题排查,帮助开发者高效使用PlantUML进行UML图表设计。

weixin_42619742的博客 468

从原理到接法全面了解三相电

从原理到接法全面了解三相电

viixin的博客 1万+

WebService开发 - CXF(1) - WebService介绍

博主个人教程地址 前言 这系列的教程主要是说WebService的开发 以及Apache的CXF框架使用 首先我们先来看一下什么是WebService 相信你知道了CXF 应该已经对WebService有所了解了 那么在咱们的JDK中呢对WebService也有对应的支持 不过使用CXF能够更快速的开发出WebService的应用 介绍 webService是啥? WebService是一个基...

路克森的博客 222

Jetson AGX Orin 部署 JetPack:从依赖缺失到系统升级的完整排障指南

本文详细介绍了在Jetson AGX Orin开发板上部署JetPack SDK的完整排障指南,包括解决依赖缺失、系统升级和常见错误处理。通过确认硬件版本、配置正确的软件源、执行系统升级和安装核心组件等步骤,帮助开发者顺利完成JetPack的安装与配置,确保AI开发环境的稳定运行。

weixin_29172963的博客 160

cxf、spring和maven整合

一.Java WebService框架介绍 在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS(也就是前面所述的JAX-WS,这是Java6发布所提供的对Web Service服务的一种实现。)前面几项都为开源项目,而其中又以axis2与cxf所最为常用,Axis与XFire已随着技术不断的

qq_32930145的博客 1211

李宏毅机器学习笔记第17周_概述领域自适应(Domain Adaptation)

Domain Adaptation

peaunt1的博客 1105

MobaXterm远程连接频繁掉线?3个SSH保活设置让你告别断连烦恼

本文针对MobaXterm远程连接频繁掉线问题,提供了3个SSH保活设置方案。从基础的SSH心跳机制到进阶的会话超时调整,再到TCP层保活与代理优化,全方位解决断连烦恼。特别适合需要稳定远程连接的开发者和运维人员,有效提升工作效率。

weixin_29250573的博客 486

cxf发布和调用webservice

最近我们的系统需要和一个第三方系统对接,对接的方式是通过web service,所以就学习了一下这方面的东西 用CXF来做web service是比较简单的,本文就简单介绍一下如何一步步发布web service,以及调用现有的web service。另外如果系统已经使用了Spring MVC,那么引入CXF需要额外的步骤,见本人另外一篇博客http://kyfxbl.iteye.com/b

coderdesion 537

告别手动归档:基于Allegro Skill的XTools一键生成Gerber与生产文件实践

本文详细介绍了基于Allegro Skill的XTools工具如何实现一键生成Gerber与生产文件,大幅提升PCB设计效率。通过自动化流程,解决了传统手动归档中的重复劳动、人为失误和标准不统一等问题,特别适合需要频繁输出生产文件的工程师。文章包含安装配置、实战操作、问题排查及进阶技巧,帮助用户快速掌握这一高效工具。

weixin_30505225的博客 461

使用cxf发布webservice接口,以及调用webservice接口

一、cxf发布webservice接口 添加maven依赖 <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-core</artifactId> <version>3.4.3</version> </dependency> <de

qq_20161461的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

用CXF发布WebService

首先去网上下载CXF的jar包,我下载的是cxf2.7.4的。新建一个Web工程,将CXF的所有jar包全部引入,在web.xml中增加CXFServlet的配置,代码如下: <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javae...

风萧萧兮易水寒,壮士一去兮不复还 2601

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

webservice java cxf_WebService -- Java 实现之 CXF ( 使用:Spring+CXF+Tomcat发布webService)

1. 新建一个Maven项目,选择webapp模板,命名为WS_Spring_CXF_Tomcat2. 在POM.xml中添加Spring和CXF的依赖org.springframeworkspring-core4.1.7.RELEASEorg.springframeworkspring-beans4.1.7.RELEASEorg.springframeworkspring-tx4.1.7.REL...

weixin_42306055的博客 180

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: 关于电商项目的购物车总结和购物车实现
下一篇: SpringBoot笔记-01-入门与配置
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值