远程调用服务框架-CXF(WebServic)
介绍
远程调用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的wsimportcmd进入任意文件夹,运行命令
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)的更多相关文章
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- 架构设计:一种远程调用服务的设计构思(zookeeper的一种应用实践)
在深入学习zookeeper我想先给大家介绍一个和zookeeper相关的应用实例,我把这个实例命名为远程调用服务.通过对这种应用实例的描述,我们会对zookeeper应用场景会有深入的了解. 远程调 ...
- 如何从零开始实现一个soa远程调用服务基础组件
说起soa远程调用基础组件,最著名的莫过于淘宝的dubbo了,目前很多的大型互联网公司都有一套自己的远程服务调用分布式框架,或者是使用开源的(例如dubbo),或者是自己基于某种协议(例如hessia ...
- spring boot / cloud (八) 使用RestTemplate来构建远程调用服务
spring boot / cloud (八) 使用RestTemplate来构建远程调用服务 前言 上周因家里突发急事,请假一周,故博客没有正常更新 RestTemplate介绍: RestTemp ...
- 使用AIDL远程调用服务中的方法
AIDL:android interface define language(接口定义语言) 作用:方便远程调用其他服务中的方法 注意:安卓四大组件都要在清单文件注册 aidl创建图: AIDL的全称 ...
- Dubbo远程调用服务框架原理与示例
Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成. 主要核心部件: Remoting: 网络通信框架 ...
- 转: Dubbo远程调用服务框架原理与示例
Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成. 主要核心部件: Remoting: 网络通 ...
- Springcloud踩坑记---使用feignclient远程调用服务404
公司项目进行微服务改造,由之前的dubbo改用SpringCloud,微服务之间通过FeignClient进行调用,今天在测试的时候,eureka注册中心有相应的服务,但feignclient就是无法 ...
- springcloud系列五 feign远程调用服务
一:Feign简介 Feign 是一种声明式.模板化的 HTTP 客户端,在 Spring Cloud 中使用 Feign,可以做到使用 HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完 ...
随机推荐
- 一张图理清ASP.NET Core启动流程
1. 引言 对于ASP.NET Core应用程序来说,我们要记住非常重要的一点是:其本质上是一个独立的控制台应用,它并不是必需在IIS内部托管且并不需要IIS来启动运行(而这正是ASP.NET Cor ...
- java 虚拟机与并发处理几个问题简要(一)
一. 处理任务时,应该将代码分成不同的部分,每一部分由一个线程进行,但是会因为任务负载不平衡导致有闲有忙.最好是应分成不同的部分,分配不同的线程,尽量让处理器不停的处理,不要闲下来.如何分配线程数 ...
- HDU1257 最少拦截系统 (贪心+STL+二分)
第一次在博客园写博客,好紧张 .博客搬家居然很多代码成了乱码,欲哭无泪,妈咪. 开学东西太多了吧,没时间写备注,有点时候只能贴个代码,以后有时间再加备注吧,只贴代码不是好习惯. 咦,贪心怎么写,我只会 ...
- Spring+JUnit4单元测试入门
(一).JUnit介绍 JUnit是Java中最有名的单元测试框架,多数Java的开发环境都已经集成了JUnit作为单元测试的工具.好的单元测试能极大的提高开发效率和代码质量. Maven导入juni ...
- javascript集合的交,并,补,子集,长度,新增,删除,清空等操作
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...
- WPF:获取DataGrid控件单元格DataGridCell
转载:http://blog.csdn.net/jhqin/article/details/7645357 /* ------------------------------------------- ...
- 强大的grep,sed和awk--用案例来讲解
准备工作: 先简单了解grep,sed和awk功能 1) grep 显示匹配特定模式的内容 grep -v 'boy' test.txt 过滤掉test.txt文件的boy,显示其余内容 grep ' ...
- 填个小坑,Vue不支持IE8及以下,跨域ajax不支持IE9
这特么就尴尬了,说好的Vue支持IE8及以下的呢,引入jquery,测试IE个浏览器,IE9仍然显示不正常, 然而命令行测试Vue仍然存在, 数据回不来!数据回不来!数据回不来! 好吧 肉包子打狗$ ...
- 模块:time,random,os,sys
时间模块 import time # print(time.time()) #时间戳 # print(time.strftime('%Y-%m-%d %X')) #格式化字符 # print(time ...
- linux命令综合
查找文件中指定字符串并且高亮显示: find .|xargs grep --color=auto "hello" dos下查找: netstat -ano|findstr &quo ...
