Axis学习笔记

系统 1565 0

关于WEBSERVICE的架构有很多,本章着重记录Axis框架的简单应用。在其后的文章中将给出高级应用示例以及SUN公司GLASSFISH中集成的Metro框架的应用。

 

Axis到目前为止,最新版本为1.4版,阿帕奇官网上已经有2年没有更新过此项目。

 

实例(参考了 axis-bin-1_4.zip \axis-1_4\samples\userguide 中的例子)使用版本为 Axis1.4.

axis-bin-1_4.zip 下载地址 http://www.apache.org/dist/ws/axis/1_4/

工程 axis_example 目录结构如下:

Axis学习笔记

目录说明如下:

jws: 存放 *.jws 文件

src : java 源码    

WEB-INF/classes : java 编译后的 class 文件

WEB-INF/lib : 需要用到的 jar

  Axis

1. Dynamic Invocation Interface ( DII)

2 . Dynamic Proxy 方式

3. Stubs 方式

JWS文件中不允许带有包名称,故只能使用默认包,这种发布方式显得非常笨拙.

使用WSDD文件发布的WEBSERVICE服务,则相对而言,有更大的灵活性.当使用的使第三方提供的jar包时,无法得到对方提供的源代码,此时JWS明显无法胜任自己的工作.而且,使用WSDD文件发布WEB服务,还可以在其中使用如Handler.使用非常方便,故项目中大多使用第三种方式也就是使用WSDD文件发布服务.

 

通过下面三个例子进行说明。 在开始例子前,把

axis-bin-1_4.zip \axis-1_4\lib 下的所有包拷贝到 axis_example/WEB-INF/lib 目录下,

axis-bin-1_4.zip \axis-1_4\webapps\axis\WEB-INF 下的 web.xml 文件拷贝到 axis_example/WEB-INF 目录下。

实例 1 DII )步骤

 

1. axis_example /src 新建一 MyServic.java 文件,内容为 :

    public class MyService { 
    public String processService(String arg){ 
        return arg;
    }   
}

  

  

 

 

 

 

2. 无需编译 (编译由 axis 进行 ) ,拷贝 MyServic.java axis_example/jws 目录下,更改文件名为 MyService.jws 3. axis_example/src 新建一 Client.java 文件,内容为 :

 

    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:" + "8081" + "/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); 
    }
} 
  

  4. axis_example 工程放入 tomcat/webapps ,启动 tomcat 5. 编译 Client.java ,运行其中的 main 方法进行测试,可以看到屏幕打印出: "This is Test!" ,可以看到 axis_example/WEB-INF 目录下生 jwsClasses /jws /MyService.class 文件—— axis 会根据你访问时的 endpoint ,自动编译其中的 *.jws 文件,并置于生成的 jwsClasses 相应目录下。

 

(通过 http://localhost:8081/axis_example/jws/MyService.jws?wsdl 可以查看生成的 WSDL 文件—— SOAP 服务描述文件)

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/

实例 2 Dynamic Proxy )步骤

1. 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; 
} 
  

   编译 MyServiceInterface.java 2. 修改 axis_example /src MyServic.java 文件,把类声明

public class MyService 改为 public class MyService implements MyServiceInterface

3. 无需编译,拷贝 MyServic.java axis_example/jws 目录下,更改文件名为 MyService.jws 4. 更改 axis_example/src /Client.java 中的 main 方法,内容为:  

 

 

5. axis_example 工程放入 tomcat/webapps ,启动 tomcat    

6. 编译 Client.java ,运行其中的 main 方法进行测试,可以看到屏幕打印出: " This is Dynamic Proxy test!"

实例 3 Stubs )步骤    

1. axis_example/src 下新建一 MyServic.java 文件,内容为 :

 

    public class MyService { 
    public String processService(String arg){ 
        return arg; 
    } 

} 
  

 

编译 MyServic.java

2. 在新建一 deploy.wsdd (可参考 axis-bin-1_4.zip \axis-1_4\samples 中的 deploy.wsdd )文件,内容为:

    <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="MyService"/>
  <parameter name="allowedMethods" value="processService"/> 
 </service> 
</deployment> 

  

 

 

 

 

3. 启动 tomcat

4. axis_example/WEB-INF 目录下执行:

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8081/axis_example/servlet/AxisServlet deploy.wsdd

 

执行后可看到在 axis_example/WEB-INF 目录下生成 server-config.wsdd 文件。

5. 重新启动 tomcat , 以便加载 server-config.wsdd 文件。

6. 更改 axis_example/src /Client.java 中的 main 方法,内容为:

    public static void main(String [] args) throws Exception { 
        // 指出service所在URL 
        String endpoint = "http://localhost:" + "8081" + "/axis_example/services/MyService"; 
        // 创建一个服务(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); 
    } 
  

 

 

  注: 在这里可以看出, DII 方式安全性不高( url MyService.jws axis 自动生成),且无法进行一些复杂的配置, Dynamic Invocation Interface(DII) Stubs 方式的区别主要有两个地方:

① 两种不同的 endpoint  

DII http://localhost:8081/axis_example/jws/ MyService.jws

Stubs http://localhost:8081/axis_example/services/MyService

② 两种不同的编译方式  

DII :根据 endpoint 访问 web service 时, axis 自动编译 endpoint 指定的 *.jws 文件,并放在生成的 WEB-INF/ jwsClasses 目录下。

Stubs :手工编译 java 文件,手工编写 server-config.wsdd 配置文件(这里可以编写 deploy.wsdd ,用 axis 提供的 java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8081/axis_example/servlet/AxisServlet deploy.wsdd

 

命令生成 server-config.wsdd 文件中的其他通用部分)

Dynamic Proxy 方式仅仅在 DII 的基础上采用了代理机制 , 实际上和 DII 区别不大,。

  7. 编译 Client.java ,运行其中的 main 方法进行测试,可以看到屏幕打印出: " This is Dynamic Proxy test!"

(通过 http://localhost:8081/axis_example/services/MyService?wsdl 可以查看生成的 WSDL 文件—— SOAP 服务描述文件)

axis 提供了 wsdl2java 工具, web service 服务器端提供了一个地址,可以访问到 WSDL 文件, wsdl2java 工具格式为: java org.apache.axis.wsdl.WSDL2Java [options] WSDL-URI

采用 DII 方式,可以使用

 

java -Djava.ext.dirs= E:\project\axis_example\WEB-INF\lib org.apache.axis.wsdl.WSDL2Java http://localhost:8081/axis_example/jws/MyService.jws?wsdl -p test.mytest -o E:\project\axis_example\src

 

生成相应的客户端 java 文件。

采用 Stubs 方式,可以使用

java -Djava.ext.dirs= E:\project\axis_example\WEB-INF\lib org.apache.axis.wsdl.WSDL2Java http://localhost:8081/axis_example/services/MyService?wsdl -p test.mytest -o E:\project\axis_example\src

 

生成相应的客户端 java 文件。

参数

- p   指定生成的 java 文件包名

-o   指定生成的 java 文件输出目录

如果不指定包名, axis 会根据命令参数 WSDL-URI 生成相应的包名,如 localhost\axis_example\jws\MyService_jws

 

上述命令会在 E:\project\axis_example\src\test\mytest 目录下生成四个文件:

MyServiceSoapBindingStub.java (相当于上面的 MyService.java

MyService_PortType.java (相当于上面的 MyServiceInterface.java

MyServiceService.java/MyServiceServiceLocator.java Service Locator 模式,隐藏了具体的业务逻辑)

  编写 junit 单元测试,在 axis_example\src\test\mytest 下新建一 TestClient.java 文件(拷贝 junit.jar 包到 axis_example/WEB-INF 目录下),内容为:

    package test.mytest; 

import junit.framework.TestSuite;  
import junit.framework.TestCase; 
import junit.framework.Test; 

public class TestClient extends TestCase { 

    public TestClient(String string) { 
        super(string); 
    } 

    public void MyServiceClient() throws Exception { 

        MyServiceService service = new MyServiceServiceLocator(); 

        MyService_PortType client = service.getMyService() ; 

        String ret = client.processService("This is Junit Test!"); 

        System.out.println(ret); 

    } 

    public static Test suite() { 

        TestSuite suite = new TestSuite(); 

        suite.addTest(new TestClient("MyServiceClient"));

        return suite; 
    } 

} 

  

   8. 编译上面四个 service 文件,并编译运行 TestClient.java ,看到屏幕打印出: " This is Junit Test!"

Axis学习笔记


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论