webService框架CXF的简单使用
废话不多说,本周的技术要点如下:
一、webService原理
webService的有关知识网上太多了,但是我没有看懂,webService有关的三个要素:SOAP、UDDI 、WSDL ,我只知道了WSDL的使用方法。我所理解的webService如下:
首先,webService是为了解决什么问题呢?因为我们知道系统中前端可以使用REST接口对后台进行数据请求,但是这是程序内部的数据接口,不可能直接发布给外部让别人使用url请求的,系统都会对这些开发的接口进行拦截和身份校验。那么如果我们想在外界获取到某个系统的数据,就需要webService了。比如天气信息网站的天气信息等公开分享的信息,我们都可以使用webService技术来获取。
接下来webService是什么原理呢?我们都知道使用java进行接口开发的时候,参数和返回的结果一般会使用到实体类,比如有这样的一个接口,是通过用户的名字获取数据,那么此时的controller的方法可能会是这样写:
- @RequestMapping(value = {"/list","/checkList"})
- public ResponseResult getUser(User u){
- ResponseResult re = this.createResult(u);
- return re;
- }
接口中参数User为用户的实体类,前台传过来的用户名传到后台会自动封装成User对象。后台接口查询到数据后,会将数据封装成ResponseResule对象,传递给前台。这样前台就可以根据传递过来的信息展现数据了。
通常开发的数据接口是前台和后台进行交互,之所以前台可以很方便的和后台进行交互,是因为前台对于参数对象和结果对象是使用JSON进行转换了,任你后台是什么实体类,在我前台面前一律全是JSON对象。
但是对于webService的话,并不是前台和后台进行交互,而是后台和后台进行交互。比如系统A的后台语言是java,系统B的后台语言也是java,那么当系统B使用接口对系统A发起请求的时候,也是需要将一个实体对象作为参数传递过去,将一个实体对象作为查询结果进行返回。但是系统B怎么可能知道系统A的这个接口的参数实体对象和结果实体对象的构成呢?而如何让系统B知道接口中这两个对象的构成就成为了webService的重点。
那么webService是怎么实现将系统A的接口的构成告诉给系统B的呢?
首先webService需要一个服务端和客户端,很显然,系统A就是服务端,系统B就是客户端了。另外这个服务端需要新开一个servlet,以专供进行服务接口的请求。此时系统A会通过webService的服务端发布一个接口,这个接口和程序开发的接口不同之处在于:
1、这个接口可以在外部访问,如果这个接口可以对外部共享的话,那么任何人都可以对这个接口进行访问;
2、接口的结尾都是?WSDL(好像还有别的可能是实现技术不同,可通过查询天气的服务接口查看http://www.webxml.com.cn/zh_cn/weather_icon.aspx
3、返回的是正常人看不懂的XML文档。
这些东西光说是没用的,直接挂上天气服务的WSDL服务接口的url路径:http://www.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl。
这样系统B在对服务接口进行请求后会获得一个xml文档,这个文档包含了想要请求到数据的前期一切信息。我们可以通过这个文档构建系统A的接口环境,重建参数对象和结果对象,构成一个客户端。这样当我们在对系统A进行数据请求的时候(此时的数据接口不是前面的获得wsdl的地址,可能放在xml文档中)就可以通过对象进行数据传输了。
那么问题来了,怎么通过wsdl的这个xml文档重建接口环境,生成一个webService的客户端呢?
其实这个方法有很多种,可以网上去查,我使用的方法是使用编辑器的内置的方法,idea和eclipse应该都有(后面的CXF的具体实现会有体现)。另外jdk的bin中也有一个wsimport.exe,可以进行转换具体使用方法为:wsimport -keep -p 自定义包名 -d 存放的地址 (wsdl地址)。不过我没有试过。。。。
二、使用CXF框架构建webService
CXF是webService的一个框架,可以很简单方便的搭建一个webService。现在我们做一个demo,具体过程如下:
1、下载CXF http://cxf.apache.org/
2、创建项目,将cxf的lib中的所有jar包引入到项目中
3、创建服务端
我所生成的项目结构如下:
其中,HelloWord是个接口,HellowWorldImp是其实现类,Servier用来创建一个服务,User是一个实体类,作为一个结构的参数对象。因此前三个是我们构成webServie服务端所必须的文件。先将三个文件的代码贴下:
HelloWorld.java

- package com;
- import javax.jws.WebService;
- import java.util.List;
- /**
- * @InterfaceName HelloWorld
- * @Description TODO
- * @Author jyy
- * @Date 2019/7/18 10:45
- * @Version 1.0
- **/
- @WebService
- public interface HelloWorld {
- String sayHi(String text);
- String getUser(User user);
- List<User> getListUser();
- }

重要的是加上@WebService注解。接口里面的方法类似于controller中url对应的方法,可以理解为这个webService提供了三个接口服务:sayHi,getUser,getListUser。
HelloWorldImpl.java

- package com;
- import javax.jws.WebService;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * @ClassName HelloWorldImp
- * @Description TODO
- * @Author jyy
- * @Date 2019/7/18 10:49
- * @Version 1.0
- **/
- @WebService(endpointInterface = "com.HelloWorld", serviceName = "HelloWorldService",portName="HelloWorldServicePort")
- public class HelloWorldImp implements HelloWorld {
- @Override
- public String sayHi(String text) {
- System.out.println("sayHi called...");
- return "Hi :" + text;
- }
- @Override
- public String getUser(User user) {
- System.out.println("sayUser called...");
- return "User:[id=" + user.getId() + "][name=" + user.getName() + "]";
- }
- @Override
- public List<User> getListUser() {
- System.out.println("getListUser called...");
- List<User> lst = new ArrayList<User>();
- lst.add(new User(2, "u2"));
- lst.add(new User(3, "u3"));
- lst.add(new User(4, "u4"));
- lst.add(new User(5, "u5"));
- lst.add(new User(6, "u6"));
- return lst;
- }
- }

标红的注解是必须的,具体的值可自己配置
Server.java

- package com;
- import javax.xml.ws.Endpoint;
- public class Server {
- protected Server() throws Exception {
- // START SNIPPET: publish
- System.out.println("Starting Server");
- HelloWorldImp implementor = new HelloWorldImp();
- String address = "http://localhost:8080/helloWorld";
- Endpoint.publish(address, implementor);
- // END SNIPPET: publish
- }
- public static void main(String[] args) throws Exception {
- new Server();
- System.out.println("服务端已启动");
- }
- }

然后启动server.java中的main方法,启动一个服务器。然后在浏览器中输入网址:http://localhost:8080/helloWorld?wsdl,可以看到如下网页。
此时,服务端搭建成功。
4、创建客户端
另开一个项目,用来模拟系统B
然后构建客户端,我是用的idea,内置的构建方法截图如下:
右键项目根目录,然后点击下面两个红箭头,出现如下截图:
将wsdl的url地址填入第一个箭头所示,第二个为所创建的文件存放的文件夹,第三个是使用什么进行构建,其他的我都没有安装,使用的是如图的方法。完成后,idea会在demo目录先自动创建如下文件:
记得eclipse可以通过wsdl的xml文档生成api,应该使用到了这些文件。
假设知道了服务接口的api,那么就知道了怎么去请求了,接下来就需要构建客户端了。创建一个文件Main.java

- package client;
- import demo.HelloWorld;
- import demo.HelloWorldService;
- /**
- * @ClassName
- * @Description TODO
- * @Author jyy
- * @Date 2019/7/18 13:30
- * @Version 1.0
- **/
- public class Main {
- public static void main(String[] args) {
- HelloWorldService factory = new HelloWorldService();
- // 此处返回的只是远程WebService的代理
- HelloWorld cxfWebService = factory.getHelloWorldServicePort();
- System.out.println(cxfWebService.sayHi("jyy"));
- }
- }

执行文件后,控制台显示:Hi :jyy
至此,服务端和客户端搭建完成,webService流程演示完毕。
三、将CXF集成到SpringMVC
想要用于实际项目,就需要和项目中的框架集成,我是用的是SpingMVC。
1、maven引入

- <dependency>
- <groupId>org.apache.cxf</groupId>
- <artifactId>cxf-rt-frontend-jaxws</artifactId>
- <version>3.0.4</version>
- </dependency>
- <dependency>
- <groupId>org.apache.cxf</groupId>
- <artifactId>cxf-rt-transports-http</artifactId>
- <version>3.0.4</version>
- </dependency>

需要注意的是版本。我使用的springmvc版本是4,那么CXF需要是3。之前看别人的技术帖子CXF用的版本是2,所以一直报错。要是报错,如果代码没有问题的话,一定就是CXF的版本引入错了。切记切记
2、配置文件中添加bean
- <import resource="classpath:META-INF/cxf/cxf.xml" />
- <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
- <jaxws:endpoint id="helloService" implementor="com.zzdc.cxf.CXFWebServiceImpl" address="/cxfService" />
注意这里的使用的是项目实际中的文件,所以服务接口路径和文件和上一个demo中的是不同的。
3、web.xml中创建一个servlet

- <servlet>
- <servlet-name>CXFServlet</servlet-name>
- <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>CXFServlet</servlet-name>
- <url-pattern>/cxf/*</url-pattern>
- </servlet-mapping>

启动后发布,此时url的地址应该是:localhost:8080/cxf/cxfService?wsdl,也就是由上面配置文件中bean的address和web.xml中的url-pattern所组成,需要注意。
第一周技术博客完成!
webService框架CXF的简单使用的更多相关文章
- WebService第二天——WebService框架CXF
一.CXF 1.什么是CXF Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF.CXF 继承 ...
- Webservice与CXF框架快速入门
1. Webservice Webservice是一套远程调用技术规范 远程调用RPC, 实现了系统与系统进程间的远程通信.java领域有很多可实现远程通讯的技术,如:RMI(Socket + 序列化 ...
- 转载 WebService 的CXF框架 WS方式Spring开发
WebService 的CXF框架 WS方式Spring开发 1.建项目,导包. 1 <project xmlns="http://maven.apache.org/POM/4.0 ...
- 几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较
几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较 来源 XFire VS Axis XFire是与Axis2 并列的新一代WebService平台.之所 ...
- webservice第三篇【接口开发webservice、CXF框架使用、IDEA下使用webservice、小例子】
实现接口的webservice 服务端 import javax.jws.WebService; /**面向接口的webservice发布方式 * * */ @WebService public in ...
- 真正的轻量级WebService框架——使用JAX-WS(JWS)发布WebService
WebService历来都很受重视,特别是Java阵营,WebService框架和技术层出不穷.知名的XFile(新的如CXF).Axis1.Axis2等. 而Sun公司也不甘落后,从早期的JAX-R ...
- 几种流行Webservice框架性能对照
转自[http://blog.csdn.net/thunder4393/article/details/5787121],写的非常好,以收藏. 1 摘要 开发webservice应用程序中 ...
- 几种流行Webservice框架性能对比
1 摘要 开发webservice应用程序中离不开框架的支持,当open-open网站列举的就有30多种,这对于开发者如何选择带来一定的疑惑.性能Webservice的关键要素,不同的框架性 ...
- 真正的轻量级WebService框架——使用JAX-WS(JWS)发布WebService(转载)
WebService历来都很受重视,特别是Java阵营,WebService框架和技术层出不穷.知名的XFile(新的如CXF).Axis1.Axis2等. 而Sun公司也不甘落后,从早期的JAX-R ...
随机推荐
- 005-使用smtp发送邮件报警
创建监控项: 如果有两个触发条件则中间用 and 连接,or等 此上 触发器已经创建好了,但是触发器的动作还需要去定义: 默认动作是停用的需要手动打开:
- Spring配置搭建——Spring学习 day1
对象准备 1.导包 Spring core ,context ,beans ,expression ,aop Apache commons logging 2.写入一个对象 这边写入User对象 3. ...
- Codeforces 976 正方格蛇形走位 二维偏序包含区间 度数图构造 贪心心火牧最大dmg
A #include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; int main() { i ...
- Jsoup抓取网页数据完成一个简易的Android新闻APP
前言:作为一个篮球迷,每天必刷NBA新闻.用了那么多新闻APP,就想自己能不能也做个简易的新闻APP.于是便使用Jsoup抓取了虎扑NBA新闻的数据,完成了一个简易的新闻APP.虽然没什么技术含量,但 ...
- Linux系统中的硬件问题如何排查?(4)
Linux系统中的硬件问题如何排查?(4) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...
- 导出csv文件(使用a标签)
https://blog.csdn.net/oscar999/article/details/16342699 productsCSV(e) { const { download } = this ...
- jquery even选择器 语法
jquery even选择器 语法 作用::even 选择器选取每个带有偶数 index 值的元素(比如 2.4.6).index 值从 0 开始,所有第一个元素是偶数 (0).最常见的用法:与其他元 ...
- 【BZOJ2409】 地下车会
Description 小Y喜欢速度与激情,于是他参加了地下车会. 地下车会设有N 个分赛区,M种赛事.每个分赛区有C[i]场比赛.由于地下车会经营者想要赚到更多的钱,规定小 Y 必须参加某一些赛区 ...
- C++学习一二
为了更深入的学习程序编写,以及进行相关算法的编写.决定每天花点时间学习C++:以下是每天的学习笔记. 一.std代表命名空间,可以用using来省略. 二.std:endl.输出一个换行符,并且“刷新 ...
- Comparable接口与Comparator接口的比较————Comparable接口详解
Comparable接口位于:java.lang包中. Comparable接口: 1. 实现了这个接口的类,会被强制进行自然排序. 问题又来了:那什么是自然排序呢? 自然排序:就是字典序排序,不分大 ...