什么是WebService?
WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用。
WS是一种基于Http协议和XMl技术,并使用WSDL描述和使用SOAP协议传输的异构系统解决方案。
我们把调用WS的应用程序称为客户端,把提供WS的应用程序称为服务器端。
使用WS最重要的是什么: ①WSDL文件(服务描述); ②对象与XML转换(数据)
ws能做什么?
我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单的调用了一下服务器上的一段代码而已(可以很方便的来进行异构系统间的整合)。
学习WebSerice可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样。举例,前两年在做北京一个公司的装饰项目时,就遇到这种情况。由于他的公司非常大,公司内部上了很多系统。装饰系统有一个重要的功能就是在线预算,即对你装这个房子需要些什么材料,一共多少钱的预估。预算中就涉及到主材数据需要先在系统中进行维护。但是目前在上我们系统之前,已经有一个系统在管理整个公司的产品库了。客户可不愿意重新到一个新系统中维护这么大的产品库,这时就需要即时的从他们系统中抓取数据到我们系统中进行同步。要实现这个功能,就得用到WebService。
为什么要学习WebService?
可以更快速的完成远程方法调用
WS和SOA的区别:
Web Service是技术规范,而SOA是设计原则,一种架构模式。
WSDL,UDDI和SOAP是SOA基础的基础部件。
WSDL:用来描述服务;
UDDI:用来注册和查找服务;
SOAP:作为传输层,用来在客户端和服务器端之间传送消息。
开发基于JDK的WS
在开始之前必须要让先了解几个名词:
① XML. Extensible Markup Language -扩展性标记语言
XML,用于传输格式化的数据,是Web服务的基础。
namespace-命名空间。
xmlns=“http://itsource.cn” 使用默认命名空间。
xmlns:itsource=“http://itsource.cn”使用指定名称的命名空间。
② WSDL – WebService Description Language – Web服务描述语言
通过XML形式说明服务在什么地方-地址。
通过XML形式说明服务提供什么样的方法 – 如何调用。
③ SOAP-Simple Object Access Protocol(简单对象访问协议)
SOAP作为一个基于XML语言的协议用于有网上传输数据。
SOAP = 在HTTP的基础上+XML数据。
SOAP是基于HTTP的。
SOAP的组成如下:
Envelope – 必须的部分。以XML的根元素出现。
Headers – 可选的。
Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。
引入
ws只是一种概念,和原来的MVC框架一样,需要具体框架实现。ws本身jdk有实现,还有一些第三方框架实现。现在我们先学习Jdk的实现,而作为ws应该有服务端和客户端。接下来我们就一一实现
1.基于JDK的WS开发 --> 服务端部分
@WebService //标记为WS服务类
public interface IWeatherService {
@WebMethod //标记为需要暴露的WS服务方法
@WebResult(name="weather")String getWeahter(@WebParam(name="city")String city);
}
@WebService(endpointInterface="com.zhengqing.ws.server.IWeatherService")
public class WeatherServiceImpl implements IWeatherService{
@WebMethod
public String getWeahter(String city) {
return city+":天气晴朗,室外温度40设置度";
}
}
发布服务 (EndPoint 终端,可以使用它发布WebService )
public class PublishTest {
public static void main(String[] args) {
//参数1-address:服务地址 参数2-implementor:服务的实现类
Endpoint.publish("http://127.0.0.1:8080/", new WeatherServiceImpl());
System.out.println("发布成功...");
}
}
运行
浏览器访问 (这段XML就是WSDL文件,这些都是JDK帮我们生成的)
注意: JDK1.8 不能直接访问地址,需要在后面加上?wsdl ex:http://127.0.0.1:8080/weather?wsdl
简单的说,WSDL文档描述WS的3个方面的信息:
1.what:服务是什么:(portType,types,message);
2.how:如何调用服务:(通过binding元素说明调用服务的方式);
3.where:该WS的服务器地址:(Service元素,soap:address);
2.基于JDK的WS开发 --> 客户端部分
根据WebService的wsdl描述生成客户端代码
在本地调用WS里描述的服务,在JAVA_HOME\bin下有wsimport.exe工具
使用命令为(‘<>’中为选填,‘[]’中为必填): --> 可用cmd执行这个命令自动生成客户端代码
wsimport <参数> [ WS发布的的url]
参数一般有如下:
-p : 为执行之后src生成的包名
-encoding : 编码
-s : 源码路径
. : 代表当前路径
-d : 编译后class字节码路径url: 在这里我的是http://127.0.0.1:8080/weather?wsdl
新建一个客户端项目:
然后打开src的文件目录,cmd打开命令窗口
执行命令: (注意:建议最好切换到英文输入法去输入命令,我遇到过打空格的时候 是中文的空格导致错误,很坑人的 以及服务端要运行发布服务哦!)
wsimport -p com.zhengqing.ws.client -encoding utf-8 -s . http://127.0.0.1:8080/weather?wsdl
之后F5刷新下我们项目的src文件夹就会发生以及自动生成了如下的文件
然后编写客户端代码
public class ClientTest {
public static void main(String[] args) {
IWeatherService service = new WeatherServiceImplService().getWeatherServiceImplPort();
String weahter = service.getWeahter("成都");
System.out.println(weahter);
}
}
运行效果: 最后发现服务调用成功了
如果打印 System.out.println(service.getClass()); 会发现我们的ws服务也就是这里的service是一个代理
由此可以看出这是一个动态代理类,他负责把我们请求的发送到服务器端、接收服务器端的响应以及把响应转换成我们所定义的结果类型。
最后我们基于JDK的WS开发就完成了,服务端成功发布服务,我们的客户端也可以正常使用服务,我们也可以通过这种方式来写自己的第三方服务然后发布到网上提供给别人使用哦~~
最后发下我的整体项目结构吧