webservice学习
发布时间:2020-12-17 02:10:49 所属栏目:安全 来源:网络整理
导读:注:红色部分为我添加的。 axis 支持三种 web service 的部署和开发,分别为: 1. Dynamic Invocation Interface ( DII) 2. Stubs 方式 使用 dii 的方式 :? 1. 编写服务端程序 HelloService public class HelloService{ public String getName(String name)
注:红色部分为我添加的。
axis
支持三种
web service
的部署和开发,分别为:
1.Dynamic Invocation Interface ( DII) 2.Stubs 方式 使用dii的方式:?
1.
编写服务端程序HelloService
public class HelloService{ public String getName(String name) { return "Welcome to Axis,?"+name; } } 2. 将源码拷贝到AXIS_HOME 下,重命名为 HelloService.jws 3. 访问连接http://localhost:8080/axis/HelloService.jws?wsdl ,页面显示axis 自动生成的wsdl( 并且在axisWEB-INFjwsClasses 生成HelloService.class 类文件) 4. 编写访问服务的客户端 HelloClient.java, 编译, 执行, 在命令提示行下会看到 "return value is Welcome to Axis,fengshan"
public
class HelloClient {
?? public static void main(String[] args) { ???? try { ??????String endpoint = "http://localhost:8080/axis/HelloService.jws"; ??????Service service = new Service(); ??????Call call = null; ??????call = (Call) service.createCall(); ??????call.setOperationName(new QName( ??????????"http://localhost:8080/axis/HelloService.jws","getName")); ??????call.setTargetEndpointAddress(new java.net.URL(endpoint)); ??????String ret = (String) call.invoke(new Object[] { "fengshan" }); ??????System.out.println("return value is " + ret); ????} catch (Exception ex) { ??????ex.printStackTrace(); ????} ??} }
总结:dii方式比较简单,服务器端暴露一个类,客户端通过固定的方式(套路来访问服务器提供的服务)
服务器:写一个类,里面有一个业务方法,然后将后缀名字从java改成jws
客户端:1.构造连接地址:http://localhost:8080/axis/HelloService.jws (ip+路径+类名.jws)
????? 2.构造vservice对象,掉用service对象的createCall()方法返回call对象
??????3.调用call对象的etOperationName()方法设置访问webservice资源的参数
??????4.调用call对象的invoke()方法,并且传递对象数组,字符串类型,(通过wsdl可以观察出request和response的参数,根据这些表述,来设置请求参数和接受返回数据)
?
?
使用Stubs方式:?
1.服务器端仍然使用HelloService.java,编译后将他放在axisWEB-INFclasses下
2.编写deploy.wsdd文件,声明服务器端需要发布的webservice的名字,和她的方法(放在web-inf目录下)
deploy.wsdd
内容
:
<
deployment
xmlns
="http://xml.apache.org/axis/wsdd/"
???????? xmlns:java ="http://xml.apache.org/axis/wsdd/providers/java" > < service name ="HelloService" provider ="java:RPC" > ???? < parameter name ="className"???? ???????????? value ="HelloService" /> ???? < parameter name ="allowedMethods" value ="*" />????<!---这里也可以填写需要暴露的方法的名字-> </ service > </ deployment >????
?
3.切换到deploy.wsdd所在目录,运行java org.apache.axis.client.AdminClient deploy.wsdd,如果部署成功,会输出<Admin>Done processing</Admin>信息。可以点击http://localhost:8080/axis浏览器中List来查看所发布的服务。
4.
接下来客户端测试该服务。
首先,在环境变量中设置 CLASSPATH ,加入以下 jar : %AXIS_LIB%axis.jar; %AXIS_LIB%axis-ant.jar; %AXIS_LIB%commons-discovery.jar; %AXIS_LIB%commons-logging.jar; %AXIS_LIB%jaxrpc.jar; %AXIS_LIB%saaj.jar; %AXIS_LIB%log4j- %AXIS_LIB%wsdl4j.jar 可以通过以下命令查看是否设置好了 CLASSPATH : Echo %CLASSPATH% 。 Axis 提供了实现WSDL2Java 的命令行工具org.apache.axis.wsdl.WSDL2Java ,利用这个工具可以从WSDL 地址处生成Java 代码。命令如下:( 在axis 目录下) java org.apache.axis.wsdl.WSDL2Java -Nhttp://localhost:8080/axis/services/HelloService=com http://localhost:8080/axis/services/HelloService?wsdl 会在com (由上述命令行中参数设定)包下生成HelloService.java 、HelloServiceService.java 、HelloServiceServiceLocator.java 和HelloServiceSoapBindingStub.java 四个文件。 5. 编写测试类( 在axis 目录下)
public
class HelloClient
{ ???? public static void main(String[] args) ????{ ???? try ???? {???? ????????com.HelloServiceServiceLocator locator= new com.HelloServiceServiceLocator(); ????????com.HelloService service=locator.getHelloService(); ????????System.out.println(service.getName( "fengshan")); ???? } ???? catch(Exception e) ???? { ???????? System.err.println( "Execution failed.Exception:"+e); ???? } ????} }
总结:Stubs方式主要是服务器端使用deploy.wsdd 文件,写好需要暴露的webservice的名字和其中的方法,使用?java org.apache.axis.client.AdminClient deploy.wsdd 将她部署在服务器上供外界调用,而外界使用 java org.apache.axis.wsdl.WSDL2Java -Nhttp://localhost:8080/axis/services/HelloService=com http://localhost:8080/axis/services/HelloService?wsdl?将远端的webservice映射成本地类,供自己使用
?
使用步骤:
1.???
在获得自动映射的4个类以后,new一个 loctor对象,这个对象实现了 一个接口(HelloServiceService ),调用接口种的方法getHelloService()获得一个service对象,然后用这个对象调用webservice暴露的方法会得到一个返回值(String).
我们自己也可以简单写一个客户端来调用:
public class HelloWorldClient1 {
?????? public static void main(String[] args) { ????????????? try { ???????????????????? Service service = new Service(); ???????????????????? String Url = "http://localhost:8080/axis/services/HelloService"; ???????????????????? Call call = (Call) service.createCall(); ???????????????????? call.setTargetEndpointAddress(Url); ???????????????????? call.setOperationName(new QName(Url,"getName")); ???????????????????? String result = (String) call.invoke(new Object[] { "winwin" }); ???????????????????? System.out.println(result); ????????????? } catch (ServiceException e) { ???????????????????? e.printStackTrace(); ????????????? } catch (RemoteException e) { ???????????????????? e.printStackTrace(); ????????????? } ?????? } } 其实上面四个自动生成的java文件也就是像以上这个客户端这样来调用的。可以对照看看。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |