构建web服务端(参考http://blog.csdn.net/sxqem/archive/2006/06/05/774327.aspx)
1.在eclipse中新建名为xfireTest的dynamic Web Project项目 2.导入XFire用户库到WebContent/WEB-INF/lib目录下。该库中应包含xfire-1.1目录下的xfire-all-1.1.jar文件,以及xfire-1.1/lib目录下的所有文件
3.修改WebContent/WEB-INF/web.xml配置文件的内容,下面是修改后web.xml (红色部分为修改内容):
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name> xfireTest</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>XFireServlet</servlet-name> <servlet-class> org.codehaus.xfire.transport.http.XFireConfigurableServlet </servlet-class> </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> </web-app> |
4.编写需要发布为web service的Java类,这个例子中编写了一个简单的Hello.java,代码如下:
package com.life; public class Hello { public String hello(String name){ return "hello "+name; } } |
5.在WebContent/META-INF目录下新建xfire文件夹,然后在xfire目录下添加一个XFire使用的配置文件services.xml,该配置文件中的内容反映了要将哪些java类发布为web服务。本例中的services.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://xfire.codehaus.org/config/1.0"> <service> <name>Hello</name> <namespace>http://com.life/Hello</namespace> <serviceClass>com.life.Hello</serviceClass> </service> </beans> |
XFire会借助Spring来解析services.xml从中提取需要发布为WebService的配置信息。
很多文章介绍到这里就完了,然而当按照他们所说的启动WebService ,然后通过http://localhost:8080/xfireTest/services/Hello?wsdl 来访问服务描述时,却抛出了异常,说services.xml文件不存在
“org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [META-INF/xfire/services.xml]; nested exception is java.io.FileNotFoundException: class path resource [META-INF/xfire/services.xml] cannot be opened because it does not exist”.
6.以上的问题的解决方案:在WebContent/WEB-INF目录下新建classes文件夹,然后需要将WebContent下的整个META-INF文件夹剪切到新建的classes文件夹下。
至此,服务器端的构建已完成,下面是eclipse下的项目文件结构图:
客户端的构建
说明:本客户端使用xfire针对eclipse开发的插件(还可使用ant生成客户端,请参考其他材料),下载和使用说明参见:http://xfire.codehaus.org/Eclipse+Plugin
1.在eclipse中新建一个名为helloClient的java object。
2.使用xfire插件调用服务器端的wsdl(web服务描述语言)文档生成客户端可调用的java类(步骤参见官网说明)。
3.新建一个名为Client的客户端类。其代码如下:
package life.com.hello; public class Client { HelloClient hello; HelloPortType port; public Client(){ hello=new HelloClient(); port=hello.getHelloHttpPort(); System.out.println(port.hello("life")); } public static void main(String[] args){ new Client(); } } |
4.如果这个时候运行,你可能会遇见以下报错信息:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/httpclient/methods/RequestEntity at java.lang.Class.getDeclaredConstructors0(Native Method) at java.lang.Class.privateGetDeclaredConstructors(Unknown Source) at java.lang.Class.getConstructor0(Unknown Source) at java.lang.Class.getConstructor(Unknown Source) at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:108) at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48) at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26) at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131) at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79) at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114) at org.codehaus.xfire.client.Client.invoke(Client.java:336) at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77) at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57) at $Proxy8.hello(Unknown Source) at life.com.hello.Client.<init>(Client.java:11) at life.com.hello.Client.main(Client.java:15) |
这是由于缺少apache的commons httpclient库文件.添加进去再试,又报错
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/codec/DecoderException at org.apache.commons.httpclient.HttpMethodBase.<init>(HttpMethodBase.java:220) at org.apache.commons.httpclient.methods.ExpectContinueMethod.<init>(ExpectContinueMethod.java:93) at org.apache.commons.httpclient.methods.EntityEnclosingMethod.<init>(EntityEnclosingMethod.java:119) at org.apache.commons.httpclient.methods.PostMethod.<init>(PostMethod.java:106) at org.codehaus.xfire.transport.http.CommonsHttpMessageSender.open(CommonsHttpMessageSender.java:135) at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:121) at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48) at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26) at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131) at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79) at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114) at org.codehaus.xfire.client.Client.invoke(Client.java:336) at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77) at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57) at $Proxy8.hello(Unknown Source) at life.com.hello.Client.<init>(Client.java:11) at life.com.hello.Client.main(Client.java:15) |
这是由于缺少apache的commons codec库文件,添加进去再试,成功显示如下
|
发件人 备用 |
客户端项目文件结构图: