编写WebService的WSDL文件,当然在编写前需要初略的了解一下XML,XML是可扩展标记语言,话说这个词我开始也不理解,后来渐渐的有了自己的概念,什么是可扩展呢?就是想怎么写就怎么写,想写什么就写什么,但是写完了怎么让别人懂呢?于是给我们写的东西贴上标记便成了XML的书写规范。
就拿最简单的举例子,我们是个学生学校要记录下每个人的信息,老师会给我们发个表格填写自己的信息,这个表格就相当于XML的标记,而可扩展就相当于在姓名栏里面,我是张三,你是李四一个标记下你可以随便写任何信息。于是这张表格在XML是这样展现的
<user>?????????????????????????? ??<user>
?????? <name>李雷</name>?????????????? ??<name>韩梅梅</name>
?????? <sex>男</sex>????????????????????? <sex>女</sex>
<age>12</age>????????????????????? <age>12</age>
<email>lilei@msn</email>??????????? <email>hmm@163</email>
</user>??????????????????????????? </user>
于是我们就知道了有一个叫李雷的人和一个叫韩梅梅的人,我们也就可以通过程序将这些信息解析出来。
?????? 但是我们有一天发现一个人在年龄那栏写个“二十”<age>二十</age>,这个东西要传到程序中我们是没有办法解析的,于是就出现了2种对XML的内容做约束的规范(这个名词可能不太准确),一种就是DTD,一种是schema,当然现在DTD大部分被schema所替代
弄个DTD的简单例子,
?
<?xml version="1.0" encoding="UTF-8"?> <!-- 定义一个班级,班级有班级名称,有年纪,有学生 --> <!ELEMENT classroom (claName,grade,students)> <!―将id定义为班级的一个属性(ID性质不能有同名的) --> <!ATTLIST classroom id ID #REQUIRED> <!-- 设置节点的类型“#PCDATA”,在DTD里面只有“#PCDATA”这一种类型限制(它的局限性) --> <!ELEMENT claName (#PCDATA)> <!ELEMENT grade (#PCDATA)> <!-- 一个班级内会有好多学生于是学生是个复数,然后再定义每个学生 --> <!ELEMENT students (student+)><!―常用控制符?表示0或者1次,*代表0或者多次,+1 次以上包含1次,默认不写就表示1次(这些是正则规则) --> <!-- 定义每个学生的信息 --> <!ELEMENT student (id,stuName,age)> <!ELEMENT id (#PCDATA)> <!ELEMENT stuName (#PCDATA)> <!ELEMENT age (#PCDATA)>
?
<!-- 写一个XML引用上面的DTD做限制,如果用编写工具,写错信息就将会有提示 -->
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE classroom SYSTEM "classroom.dtd"> <classroom id="c1"> <claName>10计算机应用技术</claName> <grade>2010</grade> <students> <student> <id>1</id> <stuName>zhangsan</stuName> <age>12</age> </student> <student> <id>2</id> <stuName>lisi</stuName> <age>122</age> </student> </students> </classroom>
?
<?xml version="1.0" encoding="UTF-8"?> <!-- 首先,先看一下schema的几个属性,xmlns:xsd引用schema的文件固定写法, 当然后面的:xsd可以不写也可以换其他的,他表示要引用schema的信息需要在xsd:下引用,tagetNameSpace指定的本文件的命名空间,xmlns:tns与tagetNameSpace是一致的, 其后面的tns是指明要引用当前命名空间下的信息需要在前面加上tns前缀 --> <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/classroom" xmlns:tns="http://www.example.org/classroom" elementFormDefault="qualified"> <!-- 定义一个节点学生,是学生类型 --> <xsd:element name="student" type="tns:studentType"/> <!-- 下面定义学生类型是什么样子的,complexType代表是复杂类型 --> <xsd:complexType name="studentType"> <!-- 复杂类型一般都需要建立一个序列 --> <xsd:sequence> <!-- 设置属性及类型 --> <xsd:element name="name" type="xsd:string"/> <xsd:element name="sex" type="tns:sexType"/> </xsd:sequence> </xsd:complexType> <!-- 设置类型的限制条件 --> <xsd:simpleType name="sexType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="男"/> <xsd:enumeration value="女"/> </xsd:restriction> </xsd:simpleType> </xsd:schema>
?
以上方面注释的不是很好,因为接触不多对此表达不是很准确,如有意见欢迎批改。
当然以上仅为了解,其真实的写WSDL时我们并不做这样的限制;因为我们的bean是没有那么多限制存在的,我们只有数据类型限制,以下写个例子吧
Wsdl文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.dhy.com/user/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="userService" targetNamespace="http://www.dhy.com/user/"> <!-- 引入xsd文件 --> <wsdl:types> <xsd:schema targetNamespace="http://www.dhy.com/user/"> <!-- <xsd:import namespace="http://www.dhy.com/user/" schemaLocation="user.xsd"/> --> <xsd:include schemaLocation="user.xsd"/> </xsd:schema> </wsdl:types> <!-- add的消息(相当于类有一个add方法) --> <wsdl:message name="add"> <!-- 消息里面包含add对象(相当于类中要传入的值) --> <wsdl:part element="tns:add" name="parameters" /> </wsdl:message> <!-- add的返回消息相当于return --> <wsdl:message name="addResponse"> <wsdl:part element="tns:addResponse" name="parameters" /> </wsdl:message> <wsdl:message name="delete"> <wsdl:part element="tns:delete" name="parameters" /> </wsdl:message> <wsdl:message name="deleteResponse"> <wsdl:part element="tns:deleteResponse" name="parameters" /> </wsdl:message> <!-- 接口方法 --> <wsdl:portType name="IUserService"> <!-- 具有add方法 ,这里注意wsdl的add和tns的add不是一个意思--> <wsdl:operation name="add"> <!-- 输入项 --> <wsdl:input message="tns:add" /> <!-- 输出项 --> <wsdl:output message="tns:addResponse" /> </wsdl:operation> <!-- 具有delete方法 --> <wsdl:operation name="delete"> <wsdl:input message="tns:delete" /> <wsdl:output message="tns:deleteResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="userServiceSOAP" type="tns:IUserService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="add"> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="delete"> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <!-- 服务名称,总结起来就是IUserService为服务接口, userService为服务的名称,我们想调用服务提供add方法, 我们传入add类型的信息(在user.xsd中定义)即User的信息, 然后服务端给返回个addResponse(也在user.xsd中定义) --> <wsdl:service name="userService"> <wsdl:port binding="tns:userSOAP" name="userSOAP"> <soap:address location="http://localhost:8989/ms/" /> </wsdl:port> </wsdl:service> </wsdl:definitions>
?
谢谢支持~~
现在企业开发确实都是使用第三方框架来做,大体用的多数的是AXIS和CXF,他们也都提供的JAVA2WSDL的生成工具,但是有些生成的信息可能并不很符合开发者的预期,所以我个人认为有些关键点手写WSDL文件的能力还是有需要的(当然我算是初学者,很多东西接触的还不够多多谢指点),谢谢支持!
