注:csdn排版太麻烦,放在git上了。
地址:https://github.com/liangjuntao/cxf_spring_struts.git
-
Web Service简介:
- 不是一种框架、更不是一种技术
- 而是一种跨平台、跨语言的规范 Web Wervice应用场景:
-
为了解决不同平台、不同语言所编写的应用之间如何调用。
如:Linux平台下用java写的程序调用win平台下c#写的应用
Web Service集中解决:
- -远程调用
- -跨平台调用
- -跨语言调用 Web Service实际中用途:
-
1.同一个公司的新、旧系统的整合。
如:Linux上的java应用,去调用win平台的C#应用 -
2.不同公司的业务整合。
如:淘宝订单中显示的物流信息;
这个信息是物流公司提供的接口,淘宝去调用这个接口,把物流展示出来。以此把两个公司的系统整合在一起。
解决了不同公司系统平台不同,语言不同的问题。 -
3.内容聚合。
如:一个应用提供股票行情,外汇行情,天气预报,编程语言排行等等
这个内容聚合的应用,需要调用大量不同的平台。 -
……
Web Service框架:
Axis(apache) –> Axis2(apache)
XFile –>XFire + Celtrix = CXF
XFile : 本身就是一个Service框架
Celtrix:ESB框架
ESB简介:
SOA(面向服务的架构)
要点:Service1 ,Service2 ,Service3—所有组件都是“即插即用”的。
IBM提倡的SOA架构,系统以“组装电脑”的方式来开发软件。
SOA两个要素:
1.各种提供服务的组件。(Web Service)
2.企业服务总线(Enterprise Service Bus ,ESB)
注:
CXF号称是SOA框架。
CXF内置了一个jetty web服务器。
Cxf:设置环境变量
CXF_HOME=D:\ apache-cxf-2.7.18
CLASSPATH=D:\ apache-cxf-2.7.18\lib
PATH中= D:\ apache-cxf-2.7.18\bin
使用CXF开发web Service开发服务端:
每个webService组件需要两个部分:接口和实现类。
(1)开发一个web service业务接口,该接口要用@WebServicex修饰。
(2)开发一个Web Service实现类,该接口也要用@WebServicex修饰。
其中要指定两个参数:
endpointInterface :实现的接口名称
serviceName :起的service名字
(3)发布WebService
代码见下:
类结构图:
业务接口:
package com.liangjt.app.webService;
import javax.jws.WebService;
/**
* 想要暴露出去的接口
* @author Administrator
*
*/
@WebService
public interface HelloWorld {
String sayHi(String name);
}
实现类:
package com.liangjt.app.webService.Impl;
import java.util.Date;
import javax.jws.WebService;
import com.liangjt.app.webService.HelloWorld;
/**
* 比较简单的实现类
*
* @author Administrator
*
*/
@WebService(endpointInterface = "com.liangjt.app.webService.HelloWorld", serviceName = "HelloWorld")
public class HelloWorldWs implements HelloWorld {
@Override
public String sayHi(String name) {
return name + ",您好。现在时间是:" + new Date();
}
}
发布:
package com.liangjt.app.main;
import javax.xml.ws.Endpoint;
import com.liangjt.app.webService.Impl.HelloWorldWs;
/**
* WsMain以RunAs java Application即可发布这个接口
*
* @author Administrator
*
*/
public class WsMain {
public static void main(String[] args) {
HelloWorldWs hw = new HelloWorldWs();
// 调用Endpoint的发布web service方法
// 第一个参数是访问的地址,第二个参数是实现类
Endpoint.publish("http://127.0.0.1/webservice", hw);
System.out.println("web Service暴露成功!");
}
}
发布成功:
-
使用CXF开发web Service开发客户端:
-
(1)调用cxf调用的wsdl2java工具,根据wsdl文档生成相应的java代码。
Wsdl – web service definition language
任何语言实现了web service,都需要提供并暴露wsdl文档 -
(2)找到wsdl2java所生成类的中,一个继承了Service的类。
该类的实例可以当成工厂来使用。 - (3)调用该类的getxxxxPort()方法。
代码如下:
注:之前的server端命名变更由ws_WebService,变化为ws_server;端口变更为9999;
(1)如图调用工具
(2)客户端项目自己建,这些代码都是调用工具生成的,所以不粘贴了
(3)生成远端代理,调用方法
package com.liangjt.app.clientMain;
import com.liangjt.app.webservice.impl.HelloWorld;
public class ClientMain {
public static void main(String[] args) {
HelloWorld factory = new HelloWorld();
// hw是远程web service的代理
com.liangjt.app.webservice.HelloWorld hw = factory.getHelloWorldWsPort();
System.out.println(hw.sayHi("zhangsan"));
}
}
(4)运行结果
zhangsan,您好。现在时间是:Tue Jun 06 00:29:10 CST 2017
以上作为学习的总结。
期间遇到的异常:
1.accessExternalSchema属性设置的限制而不允许file访问
参考:Create a file named jaxp.properties (if it doesn’t exist) under /path/to/jdk1.8.0/jre/lib and then write this line in it:
javax.xml.accessExternalSchema = all
2.Cannot create a secure XMLInputFactory
参考:http://blog.csdn.net/java_min/article/details/9833815