webservice学习

注:红色部分为我添加的。
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( 并且在axis\WEB-INF\jwsClasses 生成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, 编译后将他放在 axis\WEB-INF\classes
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- 1.2.8 .jar;
%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 文件也就是像以上这个客户端这样来调用的。可以对照看看。

你可能感兴趣的:(webservice,职场,休闲)