1、XML约束-schema
- <?xml version="1.0" encoding="UTF-8" ?>
- <schema xmlns="http://www.w3.org/2001/XMLSchema"
- targetNamespace="http://www.wiseweb.com"
- elementFormDefault="qualified" >
- <element name="书架">
- <complexType>
-
- <sequence maxOccurs="unbounded">
- <element name="书">
- <complexType>
- <sequence>
- <element name="书名" type="string" />
- <element name="作者" type="string" />
- <element name="售价" type="string" />
- </sequence>
- </complexType>
- </element>
- </sequence>
- </complexType>
- </element>
- </schema>
- <?xml version="1.0" encoding="UTF-8"?>
-
- <书架 xmlns="http://www.wiseweb.com"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.wiseweb.com book.xsd">
- <书>
- <书名>JavaScript开发</书名>
- <作者>老佟</作者>
- <售价>28.00元</售价>
- </书>
- </书架>
-
- <!--
- schema规范中:
- 1.所有标签和属性都需要由schema文件来定义
- 2.所有的schema文件都需要有一个id,但是它在这里叫namespace
- 3.namespace值由什么来制定?
- 由targetNameSpace属性来制定,它的值是一个url(很有可能不存在)
- 4.如何引入一个schema约束?
- 属性?:用xmlns属性
- 属性值:对应的schema文件的id(namespace值)
- 5.如果引入的schema不是w3c组织定义,必须指定schema的位置
- 6.schema的位置由什么属性来指定?
- 属性:schemaLocation
- 属性值:namespace path
- 7.如果引入了n个约束,需要给n-1个取别名
- -->
注:
a. namespace
相当于schema文件的id
b. targetNamespace属性
用来指定schema文件的namespace的值
c. xmlns属性
引入一个约束, 它的值是一个schema文件的namespace值
d. schemaLocation属性
用来指定引入的schema文件的位置
2、很多网站上面有的天气预报和股票行情的功能是他们自己做的数据统计吗?很明显不是,他们都使用webservice。
wsdl是什么?
webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文档, 定义了客户端与服务端发送请求和响应的数据格式和过程
如何发布一个webservice?
定义SEI @webservice @webMethod
定义SEI的实现
发布: Endpoint.publish(url, SEIImplObject)
如何请求一个webservice?
根据wsdl文档生成客户端代码 jdk/cxf
根据生成的代码调用webService
WebService是什么?
1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据)
2. 一个跨语言、跨平台的规范(抽象)
3. 多个跨平台、跨语言的应用间通信整合的方案(实际)
以各个网站显示天气预报功能为例:
气象中心的管理系统将收集的天气信息并将数据暴露出来(通过WebService Server), 而各大站点的应用就去调用它们得到天气信息并以不同的样式去展示(WebService Client).
网站提供了天气预报的服务,但其实它们什么也没有做,只是简单了调用了一下气象中心服务器上的一段代码而已。
为什么用WebService?
web service能解决:跨平台调用、跨语言调用、远程调用
什么时候使用WebService?
1. 同一家公司的新旧应用之间
2. 不同公司的应用之间
分析业务需求:天猫网与中通物流系统如何交互?
3. 一些提供数据的内容聚合应用:天气预报、股票行情
WebService中的几个重要术语
WSDL:web service definition language
直译 : WebService定义语言
1. 对应一种类型的文件.wsdl
2. 定义了web service的服务器端与客户端应用交互传递请求和响应数据的格式和方式
3. 一个web service对应一个唯一的wsdl文档
SOAP:simple object access protocal
直译: 简单对象访问协议
1. 是一种简单的、基于HTTP和XML的协议, 用于在WEB上交换结构化的数据
2. soap消息:请求消息和响应消息
http+xml片断
SEI:WebService EndPoint Interface(终端)
直译: web service的终端接口,
1. 就是WebService服务器端用来处理请求的接口
@Webservice
@WebMethod
CXF:Celtix + XFire
一个apache的用于开发webservice服务器端和客户端的框架
开发WebService:
Server端:
定义一个接口:
- package com.wiseweb.ws;
-
- import javax.jws.WebMethod;
- import javax.jws.WebService;
-
- /**
- * SEI
- * @author piqiu
- *
- */
- @WebService
- public interface HelloWS {
-
- @WebMethod
- public String sayHello(String name) ;
- }
定义这个接口的实现类:
- package com.wiseweb.ws;
-
- import javax.jws.WebService;
-
- /**
- * SEI的实现
- * @author piqiu
- *
- */
- @WebService
- public class HelloWSImpl implements HelloWS {
-
- @Override
- public String sayHello(String name) {
- System.out.println("server sayHello():" + name);
- return "Hello: " + name;
- }
-
- }
服务器启动:地址的ip为服务器发布机器的ip,端口写一个没占用的即可。
- package com.wiseweb.ws.server;
-
- import javax.xml.ws.Endpoint;
-
- import com.wiseweb.ws.HelloWSImpl;
-
- /**
- * 发布webservice
- * @author piqiu
- *
- */
- public class ServerTest {
-
- public static void main(String[] args) {
- String address = "http://10.211.55.3:8989/day01_ws/hellows" ;
- Endpoint.publish(address, new HelloWSImpl()) ;
- System.out.println("发布webservice成功!");
- }
- }
Client端:
1、生成wsdl客户端代码(使用jdk自带的wsimport.exe工具):
可以直接通过url把代码生成下来,也可以使用浏览器打开wsdl的路径,复制到本地文件,再用根据本地wsdl文件生成客户端代码:
打开cmd:
进入此项目的工作区间的src目录,输入命令wsimport -keep url(注:url为服务器发布地址后面加?wsdl,如此例子中就要输入url为http://10.211.55.3:8989/day01_ws/hellows?wsdl)
刷新工程项目,发现已经生成客户端代码。
2、根据客户端代码调用WebService
- package com.wiseweb.ws.test;
-
- import com.wiseweb.ws.HelloWSImpl;
- import com.wiseweb.ws.HelloWSImplService;
-
- /**
- * 调用webservice
- * @author piqiu
- *
- */
- public class ClientTest {
-
- public static void main(String[] args) {
- HelloWSImplService factory = new HelloWSImplService() ;
- HelloWSImpl helloWS = factory.getHelloWSImplPort() ;
- System.out.println(helloWS);
- String result = helloWS.sayHello("benjamin") ;
- System.out.println("client " + result);
- }
- }