XFire是新一代的Java?Web服务引擎,XFire使得在JavaEE应用中发布Web服务变得轻而易举。和其他Web服务引擎相比,XFire的配置非常简单,可以非常容易地和Spring集成,它使得Java开发人员终于可以获得和.Net开发人员一样的开发效率。 --摘自百度百科
?
?
一 服务器端怎么用XFire发布服务?
1 创建web工程
2 将XFire目录下的各种jar包拷贝到web工程的lib下面
3 修改 web.xml 文件,在其中增加如下 Servlet 定义内容
?
?? ??<servlet-mapping>
<servlet-name>XFireServlet</servlet-name> <url-pattern>/servlet/XFireServlet/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>?
4 创建service配制文件:src/META-INF/xfire/services.xml
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service> <name> HelloWorldService </name> <namespace> http://locahost:8888/xfiredemo/HelloWorldService </namespace> <serviceClass> com.dxm.cyou.xfire.pojo.HelloWorldService </serviceClass> <implementationClass> com.dxm.cyou.xfire.pojo.HelloWorldServiceImpl </implementationClass> </service> </beans>
? 5 很显然,步骤4之前我创立了一个接口,和一个接口实现类,名字从service.xml中可以看出
6 java文件如下:
com.dxm.cyou.xfire.pojo.HelloWorldService.java
package com.dxm.cyou.xfire.pojo; public interface HelloWorldService { public String sayHelloWorld(String name, Integer size); public Integer add(Integer a, Integer b); }
?
???package com.dxm.cyou.xfire.pojo;
public class HelloWorldServiceImpl implements HelloWorldService { public String sayHelloWorld(String name, Integer size) { return "Hello World:" + name + "||size:" + size; } public Integer add(Integer a, Integer b){ return a + b; } }
?
7 发布Web服务,在浏览器中访问URL:http://localhost:8888/xfiredemo/services/HelloWorldService?wsdl
?
?
得到如下结果:
<wsdl:definitions targetNamespace="http://locahost:8888/xfiredemo/HelloWorldService">
? <wsdl:types> ? <xsd:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://locahost:8888/xfiredemo/HelloWorldService"> ? <xsd:element name="sayHelloWorld"> ? <xsd:complexType> ? <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="1" name="in1" nillable="true" type="xsd:int"/> </xsd:sequence> </xsd:complexType> </xsd:element> ? <xsd:element name="sayHelloWorldResponse"> ? <xsd:complexType> ? <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> </wsdl:types> ? <wsdl:message name="sayHelloWorldRequest"> <wsdl:part name="parameters" element="tns:sayHelloWorld"> </wsdl:part> </wsdl:message> ? <wsdl:message name="sayHelloWorldResponse"> <wsdl:part name="parameters" element="tns:sayHelloWorldResponse"> </wsdl:part> </wsdl:message> ? <wsdl:portType name="HelloWorldServicePortType"> ? <wsdl:operation name="sayHelloWorld"> <wsdl:input name="sayHelloWorldRequest" message="tns:sayHelloWorldRequest"> </wsdl:input> <wsdl:output name="sayHelloWorldResponse" message="tns:sayHelloWorldResponse"> </wsdl:output> </wsdl:operation> </wsdl:portType> ? <wsdl:binding name="HelloWorldServiceHttpBinding" type="tns:HelloWorldServicePortType"> <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> ? <wsdl:operation name="sayHelloWorld"> <wsdlsoap:operation soapAction=""/> ? <wsdl:input name="sayHelloWorldRequest"> <wsdlsoap:body use="literal"/> </wsdl:input> ? <wsdl:output name="sayHelloWorldResponse"> <wsdlsoap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> ? <wsdl:service name="HelloWorldService"> ? <wsdl:port name="HelloWorldServiceHttpPort" binding="tns:HelloWorldServiceHttpBinding"> <wsdlsoap:address location="http://localhost:8888/xfiredemo/services/HelloWorldService"/> </wsdl:port> </wsdl:service> </wsdl:definitions>?
二,WSDL的基本讲解
?
上面就是一个sayHelloWorld与add两个服务的WSDL,对于上面那段WSDL在这里简单的介绍一下。
从下往上看
1 Service- 相关服务访问点的集合:通过它你可以知道,你将通过哪个URL去访问你需要访问的的服务
元素包含一个或者多个Port元素?
2 Port-每一个Port元素对应一个不同的Web服务,port将一个URL赋予一个特定的binding,通过location实现?可以使两个或者多个port元素将不同的URL赋给相同的binding
3 binding无素:特定端口类型的具体协议和数据格式规范的绑定
4 Message元素描述了Web服务的有效负载。相当于函数调用中的参数和返回值:
5 PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。
6 Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。
7 Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构:相当于方法调用的参数与返回值定义
?
8 Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。:从我给出的例子中,你会发现,那些message最终都定义在types中。比如sayHelloWorld 输入两个参数,一个String,一个int,返回String, add服务输入两个int,返回一个int等
?
上面那些WSDL基本元素第一次看不懂,无所谓,你试着去改变你的服务(JAVA),然后再发布,再看相应的WSDL
?
如此重复几次,你就明白了。正所谓书读百遍,其义自现,这样比死记硬背好多了。
?
?
?
三,客户端怎么调用服务
?
用代码说明问题:
com.dxm.cyou.xfire.test.XFireTest.java
package com.dxm.cyou.xfire.test; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import org.codehaus.xfire.client.Client; public class XFireTest { /** * @param args */ public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub XFireTest xFireTest = new XFireTest(); xFireTest.test(); } public void test() throws Exception{ Client client = new Client(new URL("http://localhost:8888/xfiredemo//services/HelloWorldService?wsdl")); Object[] results = client.invoke("sayHelloWorld", new Object[] {"邓小明", 100}); System.out.println("results:" + results[0]); Object[] results2 = client.invoke("add", new Object[] {100, 200}); System.out.println("results:" + results2[0]); } }
?
?? ?结果如下:
results:Hello World:邓小明||age:24 100 + 200 : 300
?
That's all 说明一下,今天第一次接触这个东东。以前老师讲过axis2基本全忘记了。?