XML约束-- Schema
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.atguigu.cn"
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.atguigu.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.atguigu.cn book.xsd">
<书>
<书名>JavaScript开发</书名>
<作者>老佟</作者>
<售价>28.00元</售价>
</书>
</书架>
schema规范中
- 所有标签和属性都需要有人定义
- 所有的schema文件都需要有一个id,但这里它叫namespace
- namespace的值由targetNamespace属性指定,它的值是一个url(很有可能不存在)
- 如何引入一个schema约束?
- 属性? :用xmls属性
- 属性值 :对应schema文件的id(namespace值)
- 如果引入的schema不是w3c组织定义的,必须指定schema文件的位置
XML Schema
- XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性
- XML Schema VS DTD:
- XML Schema符合XML语法结构。
- DOM、SAX等XML API很容易解析出XML Schema文档中的内容。
- XML Schema对名称空间支持得非常好。
- XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。
- XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
- XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。
名称空间的概念
- 在XML Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。在Xml文件中书写标签时,可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档。如:
<atguigu:书架 xmlns:atguigu=“http://www.atguigu.com”>
<atguigu:书>……</atguigu:书>
</atguigu:书架>
- 此处使用atguigu来指向声明的名称,以便于后面对名称空间的引用。
- 注意:名称空间的名字语法容易让人混淆,尽管以 http:// 开始,那个 URL 并不指向一个包含模式定义的文件。事实上,这个 URL:www.atguigu.com根本没有指向任何文件,只是一个分配的名字。
使用命名空间引入Schema
- 为了在一个XML文档中声明它所遵循的Schema文件的具体位置,通常需要在Xml文档中的根结点中使用schemaLocation属性来指定,例如:
<atguigu:书架 xmlns:atguigu="http://www.atguigu.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://www.atguigu.com book.xsd">
- schemaLocation此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置,两者之间用空格分隔。
- 注意,在使用schemaLocation属性时,也需要指定该属性来自哪里。
使用默认名称空间
- 基本格式:
- xmlns="URI"
- 举例:
<书架 xmlns="http://www.it315.org/xmlbook/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://www.atguigu.com book.xsd">
<书>
<书名>JavaScript开发</书名>
<作者>老佟</作者>
<售价>28.00元</售价>
</书>
<书架>
引入多个XML Schema文档
- 文件清单:xmlbook.xml
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns="http://www.atguigu.com/xmlbook/schema"
xmlns:demo="http://www.atguigu.com/demo/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.atguigu.com/xmlbook/schema http://www.atguigu.com/xmlbook.xsd
http://www.atguigu.com/demo/schema http://www.atguigu.com/demo.xsd">
<书>
<书名>JavaScript开发</书名>
<作者>老佟</作者>
<售价 demo:币种=”人民币”>28.00元</售价>
</书>
</书架>
在XML Schema文档中声明名称空间
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www. atguigu.com"
elementFormDefault="qualified">
<xs:schema>
- targetNamespace用于指定schema文档中声明的元素关联到哪个名称空间。
- elementFormDefault用于指定,是否将所有声明的元素和属性都关联到指定的命名空间, qualified代表是,unqualified代表只关联根元素
Schema语法
- 参看w3c文档
WebService
webservice相当于HTTP+?+?
- ? : xml
- ? : schema
wsdl是什么?
- webservice定义语言,对应.wsdl文档,一个webservice会对应一个唯一的wsdl文档, 定义了客户端与服务端发送请求和响应的数据格式和过程
如何发布一个webservice?
- 定义SEI @webservice @webMethod
- 定义SEI的实现
如何请求一个webservice?
- 根据wsdl文档生成客户端代码 jdk/cxf
- 根据生成的代码调用webService
Web service是什么?
- 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据)
- 一个跨语言、跨平台的规范(抽象)
- 多个跨平台、跨语言的应用间通信整合的方案(实际)
为什么要用Web service?
- 跨平台调用
- 跨语言调用
- 远程调用
什么时候使用web Service?
-
- 同一家公司的新旧应用之间
-
- 不同公司的应用之间分析业务需求:天猫网与中通物流系统如何交互?
-
- 一些提供数据的内容聚合应用:天气预报、股票行情
Web Service中的几个重要术语
WSDL:web service definition language
- 直译 : WebService定义语言
-
- 对应一种类型的文件.wsdl
-
- 定义了web service的服务器端与客户端应用交互传递请求和响应数据的格式和方式
-
- 一个web service对应一个唯一的wsdl文档
SOAP:simple object access protocal
-
直译: 简单对象访问协议
-
- 是一种简单的、基于HTTP和XML的协议,用于在WEB上交换结构化的数据
-
- soap消息:请求消息和响应消息
-
- http+xml片断
SEI:WebService EndPoint Interface(终端)
- 直译: web service的终端接口
-
- 就是WebService服务器端用来处理请求的接口
CXF:Celtix + XFire
- 一个apache的用于开发webservice服务器端和客户端的框架
开发webservice
概述
- 开发手段:
- 使用JDK开发(1.6及以上版本)
- 使用CXF框架开发(工作中)
- 组成:
- 服务器端
- 客户端
使用JDK开发WebService
package com.lgz.test01;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface HelloWS {
@WebMethod
public String sayHello(String name);
}
package com.lgz.test01;
import javax.jws.WebService;
@WebService
public class HelloWSImpl implements HelloWS{
@Override
public String sayHello(String name) {
// TODO Auto-generated method stub
return "hello ws";
}
}
package com.lgz.test01.service;
import javax.xml.ws.Endpoint;
import com.lgz.test01.HelloWSImpl;
public class ServerTest {
public static void main(String[] args) {
String address = "http://localhost:8888/ws/hello";
Endpoint.publish(address, new HelloWSImpl());
System.out.println("发布webservice成功");
}
}
生成客户端代码
E:\workspace\webserviceClient\src> wsimport -keep http://localhost:8888/ws/hello?wsdl
- 开发服务器端
- Web Service编码:
- @WebService( SEI和SEI的实现类)
- @WebMethod(SEI中的所有方法)
- 发布Web Service:
- Endpoint(终端, 发布webservice)
- Web Service编码:
- 开发客户端
-
使用eclipse提供的web service浏览器访问
-
查看对应的wsdl文档:…..?wsdl (一般浏览器)
-
请求webService并查看请求和响应消息(webservice浏览器)
-
创建客户端应用编码方式访问
-
借助jdk的wsimort.exe工具生成客户端代码: wsimport -keep url //url为wsdl文件的路径
-
借助生成的代码编写请求代码
-
监听请求:使用Eclipse的TCP/IP工具(端口转发)
- 将服务器端的WSDL文档保存到客户端本地
- 修改文档: 将端口号从8989改为8080
- 根据本地的wsdl文档生成客户端代码,并编写客户端的调用代码
- 配置eclipse的TCP/IP,启动监听
- 执行客户端代码发送WebService请求
- D:\project\workspace\webserviceclient2\src>wsimport -keep http://localhost:8888/webservice/hello?wsdl
调用免费的web service(天气预报)
-
Google”免费WebService”,找到提供天气预报Webservice的网络地址
-
使用eclipse的web service浏览器访问
-
客户端编码方式访问
- 借助命令工具自动生成客户端代码
- 借助生成的代码编写请求代码
-
说明: 直接生成客户端代码会抛异常,无法生成客户端代码, 解决办法:
- 将对应的wsdl文档保存到本地
- 修改wsdl文档的部分内容:
- 将 <s:element ref="s:schema" /><s:any /> 替换成 <s:any minOccurs="2" maxOccurs="2"/>
- 备注: 这个是Java调用net的webservice都有的问题
使用CXF开发web service
- 加入cxf的jar包即可,其它不需要改动
- E:\workspace\webserviceClient\src>wsdl2java http://localhost:8888/webservice/hello?wsdl
WebService请求深入分析
<definitions>
<types>
<schema>
<element>
</types>
<message>
<part>
</message>
<portType>
<operation>
<input>
<output>
</portType>
<binding>
<operation>
<input>
<output>
</binding>
<service>
<port>
<address>
</service>
</definitions>
- : 用了定义消息的结构
- :指定引用types中定义的标签片段
- :用来定义服务端的SEI
- :用来指定SEI中的处理请求的方法
- :指定客户端用来传过来的数据,会引用上面的定义的
- :指定服务端返回给客户端的数据,会引用上面的定义的
- :用来指定SEI中的处理请求的方法
- :用于定义SEI的实现类
- type属性:引用上面的
- <soap:binding style="document">:绑定的数据是一个document(xml)
- operation:用来定义实现的方法
- <soap:operation style="document" /> 传输的是document(xml)
- input 指定客户端用来传过来的数据
- <soap:body use="literal"> 文本数据
- output 指定服务端返回给客户端的数据
- :服务器端的一个webservice的容器
- name属性:它用于指定客户端容器类
- :用来指定一个服务器端处理请求的入口
- < address >:当前webservice的请求地址
一次Web service请求的流程
- 一次web service请求的本质:
- 1)客户端向服务器端发送了一个soap消息(http请求+xml片断)
-
- 服务器端处理完请求后, 向客户端返回一个soap消息