Webservice,基于Axis的最佳实践。
?
Web Service实战 1.???? 基本原理:
?
?
2.????
3.???? 4.???? 用途: 5.???? 实战部分
实现类:
建立一个WebService的工程,其实没有什么什么特别,仅仅是比普通的Tomcat工程多WebService.xml文件---这个时候的此文件啥内容都没有。 然后再建立一个WebService,这个时候会提示
默认会把当前所有的webService工程都列出来。选择其中一个,进入一下步:选择你的发布名字,以及要把那个API开放出去(接口和实现类,默认会把所有public的方法都开放出去)。
?
点击完成。其实做这一步骤仅仅是为了修改webservice.xml文件。 请看修改后的文件内容:
?
至此,一个WebService已经建立完成,发布到web容器上(Tomcat和jboss都是可以的)你可以有三种方式来测试。 第一种方式是: 利用MyEclipse自带的Web service explorer。
点击go以后。
点击bindings的link以后,就能看到binding了的所有方法,这些方法都是可以在这里调用的。
我们以一个简单的方法testMethod()作为测试使用。
看看执行后得效果:
第二种方法就是通过,使用浏览器的: 直接在浏览器的地址栏里输入:
应该可以看到一个XML文件(此文件就是描述文件WSDL)的内容,不过这里只摘写部分内容:
能看到这部分内容也是说明你的WebService已经好了。
?
第三种方法就是编写一个客户端程序去测试,特别说明的是,这个客户端可以人适合程序,asp,VB.net,C#,等 我们是使用了一个java的Application
程序顺利执行,其结果就在tomcat的控制台打印出来了我们想看到的内容了。这里需要特别说明的是,假如不用XFire框架,可是可以编写你自己的WebService的客户端程序的。或者使用了其他的框架(这里以Axis为例):
?
---------------------------------------------------------------------------------
Axis原理探讨与实战演练 Axis是支持Webservice的java平台的框架,和Xfire是一样的。不过使用起来好像比Xfire要麻烦很多。 它有三种方式支持Webservice: 1. ?Dynamic Invocation Interface ( DII) ? 2.? Dynamic Proxy, 3.? Stubs,
?
三种方式的介绍:
?
<!--[if !supportLists]-->1.? <!--[endif]-->?DII是最简单的方式,编写一个java文件比如说MyService,记住不需要编译成class文件,因为Axis会帮您编译,你需要做的是拷贝这个java文件到一个目录下,我们是拷贝MyServic.java到axis_example/jws目录下,更改文件名为MyService.jws,然后编写一个Client程序,直接访问之, import org.apache.axis.client.Call; ? import org.apache.axis.client.Service; ? import javax.xml.namespace.QName; ? import javax.xml.rpc.ServiceFactory; ? import java.net.URL; ? public class Client { ? ??? public static void main(String [] args) throws Exception { ? ??????? // 指出service所在URL ? ??????? String endpoint = "http://localhost:8080/axis_example/jws/MyService.jws"; ? ??????? // 创建一个服务(service)调用(call) ? ??????? Service service = new Service(); ? ??????? Call call = (Call) service.createCall();// 通过service创建call对象 ??????? // 设置service所在URL ? ??????? call.setTargetEndpointAddress(new java.net.URL(endpoint)); ? ??????? // 方法名(processService)与MyService.java方法名保持一致 ? ??????? call.setOperationName("processService"); ? ??????? // Object 数组封装了参数,参数为"This is Test!",调用processService(String arg) ? ??????? String ret = (String) call.invoke(new Object[]{"This is Test!"}); ? ??????? System.out.println(ret); ? ??? } ? } ?
?
axis_example 工程放入tomcat/webapps,启动tomcat。 ? 编译Client.java,运行其中的main方法进行测试,可以看到屏幕打印出:"This is Test!",可以看到axis_example/WEB-INF目录下生jwsClasses/jws/MyService.class文件——axis会根据你访问时的endpoint,自动编译其中的*.jws文件,并置于生成的jwsClasses相应目录下。
?
注1: 在上面的 new Object[]{"This is Test!"} 语句中,只传递了一个参数。如果MyServic.java中 ? processService(String arg) 改写为 ? processService(String arg,String arg2) ? 你可以通过new Object[]{"test","test2"}传递多个参数。 ? 注2: 启动tomcat 后控制台出现下面警告: ? - Unable to find required classes (javax.activation.DataHandler and javax.mail.i ?nternet.MimeMultipart). Attachment support is disabled. ? 这是因为缺少activation.jar和mail.jar(本文中的实例可以忽略此警告)。 ? activation.jar (目前版本为1.1)下载地址 ? http://java.sun.com/products/javabeans/jaf/downloads/index.html ? mail.jar (目前版本为1.4)下载地址 ? http://java.sun.com/products/javamail/downloads/ ?
?
<!--[if !supportLists]-->2.? <!--[endif]-->(Dynamic Proxy)动态代理 ? 在axis_example /src 下 新建一MyServiceInterface.java文件,内容为: ? import java.rmi.Remote; ? import java.rmi.RemoteException; ? public interface MyServiceInterface extends Remote { ? ??? public String processService(String arg) throws RemoteException; ? } public class MyService ? 改为 ? public class MyService implements MyServiceInterface ? 无需编译,拷贝MyServic.java到axis_example/jws目录下,更改文件名为MyService.jws 。 ??? public static void main(String [] args) throws Exception { ? ??????? String wsdlUrl = "http://localhost:8080/axis_example/jws/MyService.jws?wsdl"; ? ??????? String nameSpaceUri = "http://localhost:8080/axis_example/jws/MyService.jws"; ? ??????? String serviceName = "MyServiceService"; ? ??????? ServiceFactory serviceFactory = ServiceFactory.newInstance(); ? ??????? javax.xml.rpc.Service service = serviceFactory.createService(new URL(wsdlUrl),new QName(nameSpaceUri,serviceName)); ? ??????? MyServiceInterface proxy = (MyServiceInterface) ? ??????????????? service.getPort(new QName(nameSpaceUri,portName),MyServiceInterface.class); ? ??????? System.out.println("This is " + proxy.processService("Dynamic Proxy test!")); ? } 把axis_example/src工程下的放入tomcat/webapps下面,启动tomcat。 编译Client,运行其中的main方法,你会看到程序执行的结果。
?
Stub方式(推荐的方式)。
?
在axis_example/src下新建一MyServic.java文件,内容为: ? public class MyService { ? ??? public String processService(String arg){ ? ??????? return arg; ? ??? } ? } ?
?
编译 MyServic.java 在新建一deploy.wsdd(可参考 axis-bin-1_4.zip /axis-1_4/samples 中的deploy.wsdd----只要保证在classpath下就可以了)文件,内容为: ? <deployment xmlns="http://xml.apache.org/axis/wsdd/" ? ??????????? xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> ? ?<service name=" MyService" provider="java:RPC"> ? ? <parameter name="className" value=" com.cjl.test.MyService"/> ? ? <parameter name="allowedMethods" value="processService"/> ? ?</service> ? </deployment> ?
?
启动tomcat 采用这种方式,先要保证axis所需要的jar在你的环境的classpath下。我是采用把所有的jar,classpath = D:/eCustoms/j2sdk1.4.2_07/lib;D:/Alex/workspace/mywebservice/WebRoot/WEB-INF/lib/activation.jar;D:/Alex/workspace/mywebservice/WebRoot/WEB-INF/lib/axis.jar;axis-ant.jar;D:/Alex/workspace/mywebservice/WebRoot/WEB-INF/lib/commons-discovery-0.2.jar;D:/Alex/workspace/mywebservice/WebRoot/WEB-INF/lib/jaxrpc.jar;D:/Alex/workspace/mywebservice/WebRoot/WEB-INF/lib/saaj.jar;D:/Alex/workspace/mywebservice/WebRoot/WEB-INF/lib/tools.jar;D:/Alex/workspace/mywebservice/WebRoot/WEB-INF/lib/wsdl4j-1.5.1.jar;D:/Alex/workspace/mywebservice/WebRoot/WEB-INF/lib/commons-logging-1.0.4.jar 在axis_example/WEB-INF目录下执行: java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8080/axis_example/servlet/AxisServlet deploy.wsdd 执行后可看到在axis_example/WEB-INF目录下生成server-config.wsdd文件。
?
从文件名称上就能看到大概的意思,是一个配置文件,这个文件就是一个Webservice工程的核心。
?
启动tomcat,Axis框架会自动加载这个server-config.wsdd文件(相当于struts-config.xml,假如你使用struts框架),然后你就可以通过在浏览器的地址栏输入: http://localhost:8080/axis_example/services/MyService?wsdl,
?
假如能看到xml文件了,表示这个Webservice的服务器已经部署完成,可以接受它的客户端的访问咯。 你可以编写客户端程序来访问这个Webservice了。
假如你的service传递的方法是用户自定义的对象类型的话,需要增加一个映射配置 1.客户端程序里。
2 服务器端: 修改Service-config.wsdd文件:
表色加粗的部分就是添加项。 那样就可以。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |