非常详细的webservice部署测试程序

网站来源: http://lavasoft.blog.51cto.com/62575/105956/

版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。
XFire WebService开发快速起步
环境:
XFire-1.2.6
JDK1.5
MyEclipse 6.5
Tomcat-5.5.27
Windows XP Professional简体中文版
软件下载地址:
有关WebService的概念、原理、数据发现、描述、绑定等过程、方式也不说了。这里就只关注如何快速开发出来一个通用的、易懂的Hello World例子。
以下是开发步骤:
1、创建工程
打开MyEclipse 6.5,新建一个WebService工程。如下图
非常详细的webservice部署测试程序
非常详细的webservice部署测试程序
然后一路next,直到完成。
创建完成后,打开生成的web.xml文件,可以看到,XFire已经配置好了。
<?xml version="1.0" encoding="UTF-8"?>

<web-appxmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"version="2.5"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee[url]http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd[/url]">

<servlet>

<servlet-name>XFireServlet</servlet-name>

<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>

<load-on-startup>0</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>XFireServlet</servlet-name>

<url-pattern>/services/*</url-pattern>

</servlet-mapping>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>
2、创建WebService服务
创建两个个包“wstest.server”和“wstest.client”,用来保存服务端和客户端程序。然后开始创建服务端程序,如下图
非常详细的webservice部署测试程序
非常详细的webservice部署测试程序
非常详细的webservice部署测试程序
完成后,生成了一个Service的配置services.xml:
<?xml version="1.0" encoding="UTF-8"?>

<beansxmlns="http://xfire.codehaus.org/config/1.0">

<service>

<name>MyService</name>

<serviceClass>wstest.server.IMyService</serviceClass>

<implementationClass>

wstest.server.MyServiceImpl

</implementationClass>

<style>wrapped</style>

<use>literal</use>

<scope>application</scope>

</service>

</beans>
也生成了接口和默认实现,改写后如下:
package wstest.server;

//GeneratedbyMyEclipse

publicinterfaceIMyService{

publicStringsayHello(Stringuser);

}
package wstest.server;

//GeneratedbyMyEclipse

publicclassMyServiceImplimplementsIMyService{

publicStringsayHello(Stringuser){

return"您好,"+user;

}

}
至此,服务端代码已经完成。
3、测试服务端代码
测试依赖与Servlet容器Tomcat,需要将做好的服务端打包部署到tomcat上,然后启动。才可以进行测试。假设你已经配置了Tomcat服务器,并完成了WebService服务端的部署。那么,现在就启动Tomcat,然后:
非常详细的webservice部署测试程序
非常详细的webservice部署测试程序
非常详细的webservice部署测试程序
非常详细的webservice部署测试程序
这样,出现上上面的结果,表明测试成功了。
4、生成客户端代码
非常详细的webservice部署测试程序
非常详细的webservice部署测试程序
非常详细的webservice部署测试程序
非常详细的webservice部署测试程序
很郁闷,这个生成的客户端代码一部分跑到服务端的包里面了。真是垃圾,rubbish!!!
但是,这就是MyEclipse的功能,我改变不了。
5、客户端测试
下面就耐心看怎么用这个客户端代码。
打开生成的代码如下:

packagewstest.client;

importjava.net.MalformedURLException;

importjava.util.Collection;

importjava.util.HashMap;

importjavax.xml.namespace.QName;

importorg.codehaus.xfire.XFireRuntimeException;

importorg.codehaus.xfire.aegis.AegisBindingProvider;

importorg.codehaus.xfire.annotations.AnnotationServiceFactory;

importorg.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations;

importorg.codehaus.xfire.client.XFireProxyFactory;

importorg.codehaus.xfire.jaxb2.JaxbTypeRegistry;

importorg.codehaus.xfire.service.Endpoint;

importorg.codehaus.xfire.service.Service;

importorg.codehaus.xfire.soap.AbstractSoapBinding;

importorg.codehaus.xfire.transport.TransportManager;

publicclassMyServiceClient{

privatestaticXFireProxyFactoryproxyFactory=newXFireProxyFactory();

privateHashMapendpoints=newHashMap();

privateServiceservice0;

publicMyServiceClient(){

create0();

EndpointMyServicePortTypeLocalEndpointEP=service0.addEndpoint(newQName("http://server.wstest","MyServicePortTypeLocalEndpoint"),newQName("http://server.wstest","MyServicePortTypeLocalBinding"),"xfire.local://MyService");

endpoints.put(newQName("http://server.wstest","MyServicePortTypeLocalEndpoint"),MyServicePortTypeLocalEndpointEP);

EndpointMyServiceHttpPortEP=service0.addEndpoint(newQName("http://server.wstest","MyServiceHttpPort"),newQName("http://server.wstest","MyServiceHttpBinding"),"http://localhost:8080/xfire126Demo/services/MyService");

endpoints.put(newQName("http://server.wstest","MyServiceHttpPort"),MyServiceHttpPortEP);

}

publicObjectgetEndpoint(Endpointendpoint){

try{

returnproxyFactory.create((endpoint).getBinding(),(endpoint).getUrl());

}catch(MalformedURLExceptione){

thrownewXFireRuntimeException("InvalidURL",e);

}

}

publicObjectgetEndpoint(QNamename){

Endpointendpoint=((Endpoint)endpoints.get((name)));

if((endpoint)==null){

thrownewIllegalStateException("Nosuchendpoint!");

}

returngetEndpoint((endpoint));

}

publicCollectiongetEndpoints(){

returnendpoints.values();

}

privatevoidcreate0(){

TransportManagertm=(org.codehaus.xfire.XFireFactory.newInstance().getXFire().getTransportManager());

HashMapprops=newHashMap();

props.put("annotations.allow.interface",true);

AnnotationServiceFactoryasf=newAnnotationServiceFactory(newJsr181WebAnnotations(),tm,newAegisBindingProvider(newJaxbTypeRegistry()));

asf.setBindingCreationEnabled(false);

service0=asf.create((wstest.client.MyServicePortType.class),props);

{

AbstractSoapBindingsoapBinding=asf.createSoap11Binding(service0,newQName("http://server.wstest","MyServiceHttpBinding"),"http://schemas.xmlsoap.org/soap/http");

}

{

AbstractSoapBindingsoapBinding=asf.createSoap11Binding(service0,newQName("http://server.wstest","MyServicePortTypeLocalBinding"),"urn:xfire:transport:local");

}

}

publicMyServicePortTypegetMyServicePortTypeLocalEndpoint(){

return((MyServicePortType)(this).getEndpoint(newQName("http://server.wstest","MyServicePortTypeLocalEndpoint")));

}

publicMyServicePortTypegetMyServicePortTypeLocalEndpoint(Stringurl){

MyServicePortTypevar=getMyServicePortTypeLocalEndpoint();

org.codehaus.xfire.client.Client.getInstance(var).setUrl(url);

returnvar;

}

publicMyServicePortTypegetMyServiceHttpPort(){

return((MyServicePortType)(this).getEndpoint(newQName("http://server.wstest","MyServiceHttpPort")));

}

publicMyServicePortTypegetMyServiceHttpPort(Stringurl){

MyServicePortTypevar=getMyServiceHttpPort();

org.codehaus.xfire.client.Client.getInstance(var).setUrl(url);

returnvar;

}

publicstaticvoidmain(String[]args){

MyServiceClientclient=newMyServiceClient();

//createadefaultserviceendpoint

MyServicePortTypeservice=client.getMyServiceHttpPort();

//TODO:Addcustomclientcodehere

//

//service.yourServiceOperationHere();

System.out.println("testclientcompleted");

System.exit(0);

}

}

看得很晕,不知道啥意思,但是从“TODO”标记处,我知道了:
//TODO: Add custom client code here

//

//service.yourServiceOperationHere();

现在就在这里添加测试代码吧:
//TODO: Add custom client code here

//

//service.yourServiceOperationHere();

StringhelloString=service.sayHello("熔岩");

System.out.println(helloString);
添加了很傻蛋的两行代码后,就可以运行起来看看测试代码了。
运行结果如下:
您好,熔岩 test client completed
终于可以松一口气了。完整的例子跑起来了。
6、总结
总感觉这个开发过程不爽,其实有更好的工具和开发方式:
WebService的编写,比较麻烦的是客户端代码,客户端代码依靠人工去写基本上是不可能的,除非你愿意付出惊人的时间和精力,既便如此也得不偿失。
MyEclipse的客户端开发太差,主要是生成的客户端代码混乱,解决办法是将客户端的编写放到单独一个工程里面来做。
其实,只要服务端编写好了,就完全可以用别的方式根据wsdl的url去生成客户端代码,在这里不得不将一个强大的工具IDEA8推荐出来,IDEA8自带WebService开发工具,插件非常强大,易用。在后面的篇幅中,我会做专门介绍,敬请关注。
当然,MyEclipse也并非一无是处,MyEclipse的服务端调试工具就很不错,很喜欢。提高了开发效率,这也是MyEclipse的过人之处。
最后,告诫各位,即使WebService支持复杂对象参数,也不建议使用,因为数据绑定还不是那么完美,总有些缺憾,为了保险起见,还是建议使用String作为参数最好了。

本文出自 “熔 岩” 博客,转载请与作者联系!

相关推荐