——实践篇
上一篇我们简要的说了一些关于webservices的一些理论,在这一篇中我们来写一个简单的例子。我们知道现在webserices规范都只是一个框架,具体用java实现有好几个版本(如apache,bea,ibm,sun都有其实现版本),我们在这里用apache的axis,所以我们的环境是:JB8+weblogic6.1或者更高版本,因为在JB8中已经集成了axis。下面就让我们开始吧。
事前在JB8中我们已经建立一个项目HELLOWORLD,在这个项目中已经建立了一个名字为helloworld的war、一个名字为HELLOWORLD的ear以及一个名为BeanHelloworld的Class。在这个Web Services里面我们将把BeanHelloworld类里面的sayHelloworld()方法和sayHello()方法都发布为Web Services的方法。
项目如图一:
图一
事中下面我们开始来发布这个Webservices:
1、右键单击BeanHelloworld.java => Export as a web service菜单。
如图二:
图二
2、 配置WebServices,
如图三,其中EAR、webApp分别是我们项目里面的ear、war,当然你也可以新建这两个东西;Toolket可以选Apache Axis和Apache Soap 2,这两个都是Apache对Webservices,我们选用Apache Axes。
图三
3、 按照向导完成这两步以后会出现下面的界面。这个界面主要是导出我们服务的描述文件(WSDL),其中Interface or class是选择要发布那个Interface、class,如果我们是发布Interface,需要给他指定实现类,也就是Implementation class将不会是灰色;Generate client stub是否要求产生客户端的测试代码。如图四
图四
4、在这一步里主要是设置服务描述文件(WSDL)的一些属性,
如图五:
Deploy scope :有三种,分别是Request、Application、Session,Request:表明这个对象在SOAP请求/响应周期内存在;Application:表明只创建一个对象实例,这个对象将会处理后面所有的请求;Session:表明容器会为每个客户创建一个对象实例,并在多个请求/响应会话中保存这个对象。顺便说一句,在axis中的session是用web服务器的session来实现的。
Location URL是WebServices的请求地址;
其他属性按照默认值就可以。
图五
5、这一步中主要是选择要发布的方法,如图六:
在Selection mode中如果是Allow selected methods:会把BeanHelloworld.java中的所有public方法发布出去;Allow selected mothods:会把选择的方法发布出去;而Desallow selected methods :正好与Allow selected mothods相反。
图六
我们把sayHello()、sayHelloworld()两个方法都发布成为Web Services 的方法
图七
6、这一步中我们主要设置SOAP版本,如图八:
把Type vesion设为 SOAP1.1。然后按照向导完成发布,重新打包就可以部署到WebLogic中啦!
图八
7、这一步中可以用Axis说生成的测试用例来测试我们的WebServices;
事后让我们来看看生成的WSDL文档,客户有了这个文档就可以调用刚才发布的Web Services的方法。
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
上面这一句是wsdl文档的开头
targetNamespace="http://bean.helloworld.test.com"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:impl="http://bean.helloworld.test.com-impl"
xmlns:intf="http://bean.helloworld.test.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
上面这一段描述的是这个文档的所要用到的命名空间。
<wsdl:types/>
上面这句是定义wsdl文档要用到复合数据类型,它是符合XML Schema(XSD)定义了一套标准的数据类型,而在我们这个文档中我们只用了简单的数据类型,所以它是个控值。
<wsdl:message name="sayHelloRequest">
<wsdl:part name="name" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="sayHelloworldResponse">
<wsdl:part name="sayHelloworldReturn" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="sayHelloResponse">
<wsdl:part name="sayHelloReturn" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="sayHelloworldRequest">
</wsdl:message>
上面这一段定义了四个Message,在理论篇中介绍过Message是通信消息的数据结构的抽象类型化定义。有人会说上面为什么是四个而不是三个或五个,因为我们发布了两个方法,而每一个方法都有请求/响应消息,这个
<wsdl:message name="sayHelloRequest">
<wsdl:part name="name" type="xsd:string"/>
</wsdl:message>
Message就只是去请求sayHello()的消息,该Message中包括调用sayHello()的参数,这个参数的名字是name,类型为String。
这个
<wsdl:message name="sayHelloResponse">
<wsdl:part name="sayHelloReturn" type="xsd:string"/>
</wsdl:message>
Message是sayHello()响应的消息,该Message中包括sayHello()返回值这个返回值的名字为sayHelloReturn,类型为String.其他两个是调用sayHelloWorld()方法的请求/响应的消息。
<wsdl:portType name="BeanHelloworld">
<wsdl:operation name="sayHelloworld">
<wsdl:input message="intf:sayHelloworldRequest" name="sayHelloworldRequest"/>
<wsdl:output message="intf:sayHelloworldResponse" name="sayHelloworldResponse"/>
</wsdl:operation>
<wsdl:operation name="sayHello" parameterOrder="name">
<wsdl:input message="intf:sayHelloRequest" name="sayHelloRequest"/>
<wsdl:output message="intf:sayHelloResponse" name="sayHelloResponse"/>
</wsdl:operation>
</wsdl:portType>
上面这段定义了一个portType,在理论篇中我们知道portType是: 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。
在这个portType中包含了两个operation,我们知道operation是:对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。下面这个operation:
<wsdl:operation name="sayHello" parameterOrder="name">
<wsdl:input message="intf:sayHelloRequest" name="sayHelloRequest"/>
<wsdl:output message="intf:sayHelloResponse" name="sayHelloResponse"/>
</wsdl:operation>
包含了前面定义的sayHelloRequest消息和sayHelloResponse消息。上面parameterOrder="name"调用方法sayHello()的参数序列。
<wsdl:binding name="BeanHelloworldSoapBinding" type="intf:BeanHelloworld">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="sayHelloworld">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="sayHelloworldRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://bean.helloworld.test.com" use="encoded"/>
</wsdl:input>
<wsdl:output name="sayHelloworldResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://bean.helloworld.test.com" use="encoded"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="sayHello">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="sayHelloRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://bean.helloworld.test.com" use="encoded"/>
</wsdl:input>
<wsdl:output name="sayHelloResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://bean.helloworld.test.com" use="encoded"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
上面这一段定义了Binding,我们知道Binding :特定端口类型的具体协议和数据格式规范的绑定。Binding结构定义了某个PortType与某一种具体的网络传输协议或消息传输协议相绑定,从这一层次开始,描述的内容就与具体服务的部署相关了。比如可以将PortType与SOAP/HTTP绑定,也可以将PortType与MIME/SMTP相绑定等。
上面<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>描述了调用的方式style="rpc" (远程过程调用),具体的网络传输协议transport="http://schemas.xmlsoap.org/soap/http", 也就是soap/http协议.其他的就是具体描述每个operation.
<wsdl:service name="BeanHelloworldService">
<wsdl:port binding="intf:BeanHelloworldSoapBinding" name="BeanHelloworld">
<wsdlsoap:address location="http://localhost:7001/helloworld/services/BeanHelloworld"/>
</wsdl:port>
</wsdl:service>
上面这一段定义了service,我们知道Service :描述的是一个具体的被部署的Web服务所提供的所有访问入口的部署细节,一个Service往往会包含多个服务访问入口,而每个访问入口都会使用一个Port元素来描述。
<wsdl:port binding="intf:BeanHelloworldSoapBinding" name="BeanHelloworld">描述了上面定义的binding.
<wsdlsoap:address location="http://localhost:7001/helloworld/services/BeanHelloworld"/>描述了具体的请求地址
</wsdl:definitions>
当然上面这句就是整个文档的结束标记啦。
以后有机会我们在看看soap请求或响应的文档。
本文地址:http://com.8s8s.com/it/it17396.htm