wsdl的结构:
<?xml version="1.0" encoding="UTF-8"?>
<definitions name=" " xmlns="默认wsdl命名空间"
xmln:soap="soap命名空间"
xmlns:tns="自定义schema命名空间"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNameSpace="自定义schema命名空间">
<types><xsd:schema>自定义的schema</xsd:schema></types>
<message name="...request"><part></part></message>
<message name="...response"><part></part></message>
<portype>定义抽象操作和抽象消息的组合</portype>
<binding>具体化<portype>元素</binding>
<service></service>
</definitions>
通过wsdl生成的Java客户端包含5类Java类:
(1)schema定义的数据结构类;
(2)ObjectFactory.java:每个wsdl生成的java类中都有这个;
在调用客户端的时候,似乎不需要用到ObjectFactory
(3)<service>中定义的webservice类,类名与name元素值一致
(4)<portType>定义的Java类,类名与name元素值一致
(5)package-info.java:每个wsdl生成的Java类中都有这个。
通过wsdl生成的Java服务端也包含5类Java类:
(1)schema定义的数据结构类;
(2)ObjectFactory.java:每个wsdl生成的java类中都有这个;
(3)<service>中定义的webservice类,类名与name元素值一致
(4)<portType>定义的Java类,类名在name元素值基础上加了SOAPImpl
(5)package-info.java:每个wsdl生成的Java类中都有这个。
只有(4)不同。但server中的(4)生成的类与(3)中的类相同
然后是wsdl生成的web service访问问题:
然后是wsdl生成的web service访问问题:
1.根据wsdl虽然生成了webservice,但是如何访问这个通过tomcat发布的webservice
根据HelloWolrd的对比研究发现:作为webservice发布后,会生成一个sun-jaxws.xml的文件,其中定义了访问该webservice的接口部分,在url-pattern部分。
工程被发布后,浏览器端访问工程是通过localhost:8080/工程名/url-pattern来调用实现的。
2.根据wsdl生成了客户端跟服务端 ,客户端只是一个调用接口,那么服务端还需要实现函数,在用wsdl生成的服务端中实现函数,会不会对造成已生成的其他Java类造成影响。导致程序无法正常运行。
由1得知:正确的由wsdl生成的webservice client和web service server的流程是,先通过tomcat部署,根据生成的sun-jaxws.xml文件中url-pattern来重新定义wsdl中service的地址,即soap:address location。要注意的是,sun-jaxws.xml是在由wsdl生成webservice服务端只后产生的。
也就是说要在wsdl中定义service的location地址需要严格的定义:localhost:8080/工程名/port中定义的name