现在的位置: 首页 > 综合 > 正文

wsdl dtd schema

2018年05月11日 ⁄ 综合 ⁄ 共 7126字 ⁄ 字号 评论关闭

服务器端的建立:创建接口、创建实现类、开启服务。

SEI:service endpoint interface;实现类的接口
SIB:service implements bean实现类

?wsdl

wsimport:依据wsdl文件生成相应的类文件,然后用这些类文件,就可以像调用本地的类一样调用WebService提供的方。该工具可以用于非Java的服务器,如:用C#编写的WebService,通过wsimport则生成Java的客户端实现。

-d:生成客户端执行类的class文件的存放目录
-s:生成客户端执行类的源文件的存放目录
-p:定义生成类的包名
-keep:指定是否生成.java的源文件
-verbose:显示生成的详细过程
wsimport -keep -p com.demo.client http://localhost:8080/Demo/services/MyService?wsdl

wsgen 是在JDK的bin目录下的一个exe文件,该命 令的主要功能是用来生成合适的JAX-WS。它读取Web Service的终端类文件,同时生成所有用于发布Web
Service所依赖的源代码文件和经过编译过的二进制类文件。这里要特别说明的是,通常在Web Service Bean中用到的异常类会另外生成一个描述Bean,如果Web Service Bean中的方法有申明抛出异常,这一步是必需的,否则服务器无法绑定该对像。此外,
wsgen 还能辅助生成WSDL和相关的xsd文件。wsgen 从资源文件生成一个完整的操作列表并验证web
service是否合法,可以完整发布。 

-cp 定义classpath
-r 生成 bean的wsdl文件的存放目录
-s 生成发布Web Service的源代码文件的存放目录
-d 生成发布Web Service的编译过的二进制类文件的存放目录

wsdl:

WSDL文档可以分为两部分。顶部分由抽象定义组成,而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息,它们并不包含任何随
机器或语言而变的元素。这就定义了一系列服务,截然不同的应用都可以实现。具体部分,如数据的序列化则归入底部分,因为它包含具体的定义。在上述的文档元 素中,<types>、<message>、<portType>属于抽象定义 层,<binding>、<service>属于具体定义层。所有的抽象可以是单独存在于别的文件中,也可以从主文档中导入。 

0、WSDL文档的根元素:<definitions>

<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  
   xmlns:tns="http://www.jsoso.com/wstest"  
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
   xmlns="http://schemas.xmlsoap.org/wsdl/"  
   targetNamespace="http://www.jsoso.com/wstest"  
   name="Example">  
   ……  
   ……  
</definitions>  

<definitions>定义了文档中用到的各个xml元素的namespace缩写,也界定了本文档自己的 targetNamespace="http://www.jsoso.com/wstest",这意味着其它的XML要引用当前XML中的元素时,要声 明这个namespace。注意xmlns:tns="http://www.jsoso.com/wstest"这个声明,它标示了使用tns这个前缀
指向自身的命名空间。

1、WSDL文档数据类型定义元素:<types>

<types>
  <xsd:schema>
     <xsd:import namespace="http://www.jsoso.com/wstest" schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>
  </xsd:schema>
</types>

<types>标签定义了当前的WSDL文档用到的数据类型。要说明的是,为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。这些数据类型用来定义web service方法的参数和返回指。对于通用的原生数据类型如:integer , boolean , char , float等,在W3C的标准文档http://www.w3.org/2001/XMLSchema中已经做了定义。这里我们要引入的schema定义
schemaLocation="http://localhost:8080/hello?xsd=1"是我们自定义的Java对象类型。

2、WSDL文档消息体定义元素:< message>

<message name="sayHello">  
   <part name="person" type="tns:person"></part>  
   <part name="arg1" type="xsd:string"></part>  
</message>  
<message name="sayHelloResponse">  
   <part name="personList" type="tns:personArray"></part>  
</message>  
<message name="HelloException">  
   <part name="fault" element="tns:HelloException"></part>  
</message>  

 message就是用来川soap消息的。<message>元素定义了web service函数的参数。<message>元素中的每个<part>子元素都和某个参数相符。输入参数在<message>元素中定义,与输出参数相
隔离,输出参数有自己的<message>元素。兼作输入、输出的参数在输入输出的<message>元素中有它们相应的<part>元素。输出 <message>元素以"Response"结尾,对Java而言方法得返回值就对应一个输出的<message>。每个<part>元素都有名字和类 型属性,就像函数的参数有参数名和参数类型。 


3、WSDL文档函数体定义元素:< portType>

<portType name="Example">  
   <operation name="toSayHello" parameterOrder="userName">  
     <input message="tns:toSayHello"></input>  
     <output message="tns:toSayHelloResponse"></output>  
   </operation>  
   <operation name="sayHello" parameterOrder="person arg1">  
     <input message="tns:sayHello"></input>  
     <output message="tns:sayHelloResponse"></output>  
     <fault message="tns:HelloException" name="HelloException"></fault>  
   </operation>  
</portType>  

指明服务的接口名称。在<operation>元素中,name属性表示服务方法名,parameterOrder属性表示方法的参数顺序,使用空格符分割多个参 数,如:“parameterOrder="person arg1”。<operation>元素的子标签<input>表示输入参数说明,它引用<message>标签中的输入参
数。<output>表示输出参数说明,它引用<message>标签中的输出参数。<fault>标签在Java方法中的特别 用来表示异常(其它语言有对应的错误处理机制),它引用<message>标签中的错误参数。 

4、WSDL绑定实现定义元素:<
binding >

<binding name="ExamplePortBinding" type="tns:Example">  
   <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"></soap:binding>  
   <operation name="toSayHello">  
      <soap:operation soapAction="sayHello"></soap:operation>  
      <input>  
         <soap:body use="literal" namespace="http://www.jsoso.com/wstest"></soap:body>  
      </input>  
      <output>  
        <soap:body use="literal" namespace="http://www.jsoso.com/wstest"></soap:body>  
      </output>  
   </operation>  
   <operation name="sayHello">  
      <soap:operation soapAction="sayHello"></soap:operation>  
      <input>  
         <soap:body use="literal" namespace="http://www.jsoso.com/wstest"></soap:body>  
      </input>  
      <output>  
         <soap:body use="literal" namespace="http://www.jsoso.com/wstest"></soap:body>  
      </output>  
      <fault name="HelloException">  
          <soap:fault name="HelloException" use="literal"></soap:fault>  
      </fault>  
   </operation>  
</binding>

指定消息传递的格式,<binding>标签是完整描述协议、序列化和编码的地方,<types>,<message>和<portType>标签处理抽象的数据内容,而<binding>标签是处理数据传输的物理实现。 <binding>标签把前三部分的抽象定义具体化。 

style="rpc":消息的展现形式;有两个值,rpc和content
use="literal":消息应该以什么样的形式来传递;有两个值,literal和encodes。但目前都是用literal。
<operation>子标签将portType中定义的 operation同SOAP的请求绑定,定义了操作名称soapAction,输出输入参数和异常的编码方式及命名空间。 
5、WSDL服务地址绑定元素:
< service >

<service name="Example">  
   <port name="ExamplePort" binding="tns:ExamplePortBinding">  
      <soap:address location="http://localhost:8080/hello"></soap:address>  
   </port>  
</service> 

service是一套<port>元素。在一一对应形式下,每个<port>元素都和一个location关联。如果同一个<binding>有多个<port>元素与之关联,可以使用额外的URL地址作为替换。
一个WSDL文档中可以有多个<service>元素,而且多个<service>元素十分有用,其中之一就是可以根据目标URL来组织端口。在一个 WSDL文档中,<service>的name属性用来区分不同的service。在同一个service中,不同端口,使用端口的"name"属性区 分。 

 

tcpmon:管理wsdl的工具


代码优先:

契约优先:定义了契约就是定义好了标准,代码在这个标准上进行开发。

服务类型:基于实体的服务、基于功能的服务、基于业务流程的服务(详细的见我的百度网盘上的文件)
1、契约优先的编写方式    
   1)  先写schema或者wsdl文件 
   2)  根据这个文件生成一个客户端代码 
   3)  编写实现类(在实现类上指定wsdlLocation)
   4)  发布服务

DTD

为什么选择dtd?
0、通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
1、通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
2、而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
3、您还可以使用 DTD 来验证您自身的数据。

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:元素、属性、实体、PCDATA、CDATA。
。PCDATA 的意思是被解析的字符数据(parsed character data)。可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。
。CDATA 的意思是字符数据(character data)。CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

外部引用的方法:
假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被
封装在一个 DOCTYPE 定义中:
<!DOCTYPE 根元素 SYSTEM
"文件名"> 
这个有两个值publicsystem,public一般引用网络上的资源;system引用本地的文件。

dtd的缺陷:1)嵌套对象不能出现重名的字段;2)控制的精细程度不够,比如性别只能输入男女;3)与xml是独立的两种语法。

Schema

schema出现的目的是通过一种更加合理的方式来编写xml的限制文件(基于xml语法的方式);
schema可以使用命名空间来支持多个名称相同的元素;
schema可以很好的完成对java或者所有对象的修饰并且提供了大量的数据类型。

<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace=http://www.example.com/01
        xmlns:ns="http://www.example.com/01"
        elementFormDefault="qualified">

。xmlns:默认的命名空间,只能存在一个默认的命名空间;
。targetNamespace:自己文档的命名空间,外部引用这个schema的地址;
。xmlns:ns:自定义的命名空间;
引用schema:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“。。。”

属性的定义是在sequence之后定义的。属性只能在复杂的元素中使用,简单类型的元素时无法使用的。

编写schema的三种方式:
1、Russian Doll:嵌套的方式,只有一个根元素,通过嵌套的方式完成编写。优点是结构清晰;缺点是不能重用。
2、Salami Slice:将每个元素的定义都放在外面。缺点是根节点不清晰,都可作为根。

<element name="book" type="tns:bookType" />
<element name="id" type="int" />
<element name="title" type="string" />
<element name="content" type="string" />
<complexType name="bookType">
   <sequence>
       <element ref="tns:id" />
	   <element ref="tns:title" />
	   <element ref="tns:content" />
   </sequence>
</complexType>

3、百叶窗方式。只有一个根节点,可以重用。重用多个类型。

<element name="person" type="personType"/>
<complexType name="personType">
   <sequence>
       <element name="age" type="tns:ageType"/>
   </sequence>
   <attribute name="sex" type="tns:sexType" />
</complexType>

<simpleType name="ageType">
   <restriction base="int">
      <minInclusive value="1" />
	  <minExclusive value="100" />
   </restriction>
</simpleType>

<simpleType name="sexType">
   <restriction base="string">
      <enumeration value="man" />
	  <enumeration value="women" />
   </restriction>
</simpleType>

 

xjc:就是把xml类型的文件转换成java文件。在写完wsdl后,可以通过这个来生成java文件。
在xsd中引入其他的xsd:

<!-- 引入student.xsd来引用student中的约束 -->  
<include schemaLocation="student.xsd"></include>

 

抱歉!评论已关闭.