通过WebService实现Java与.Net互联

类别:Java 点击:0 评论:0 推荐:

通过Web Service实现Java与.net互联

        (将.net程序封装成为Web Service,通过Java程序进行调用)

Web Service概述 什么是Web Service

       Web Service是能够基于网络,尤其是基于万维网(World Wide Web)直接调用的能够处理离散任务或连续任务的软件模型。目前较为流行的应用是,由一家公司对其专有数据进行封装,提供Web Service,然后其它公司就可以通过Internet来动态使用这些在线服务。这为未来全球的电子商务发展提供了新的标准和架构。

Web Service架构

Web Service是独立的、模块化的应用,能够通过因特网来描述、发布、定位以及调用。在Web Service的体系架构中包括三个角色:服务提供者(Service Provider)、服务请求者(Service Requestor)、服务注册器(Service Registry)。角色间主要有三个操作:发布(Publish)、查找(Find)、绑定(Bind)。

下图清楚的描述了三种角色,以及角色之间的作用关系。


Web Service协议标准 简单对象访问协议(SOAP)

       SOAP是Simple Object Access Protocol的缩写,是一种基于XML的不依赖传输协议的表示层协议,用来在分散或分布式的应用程序之间方便地以对象的形式交换数据。在SOAP的下层,可以是HTTP/HTTP,也可以是SMTP/POP3,还可以是为一些应用而专门设计的特殊的通信协议。

       SOAP包括三个主要部分:

²        SOAP封装结构:定义了一个整体框架,以表示消息中包含什么内容,谁来处理这些内容以及这些内容是可选的或是必需的。

²        SOAP编码规则:定义了用以交换应用程序定义的数据类型的实例的一系列机制。

²        SOAP RPC表示:定义了一个用来表示远程过程调用和应答的协定。

Web Service描述语言(WSDL)

       WSDL是Web Service Description Language的缩写,该语言将网络服务定义成一个能交换消息的通信端点集,为分布式系统提供了帮助文档,同时也可作为自动实现应用间通信的解决方案。

统一描述、发现和集成协议(UDDI)

       UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

通过Java调用Web Service

       在这里我们通过.net实现了一个Web Service,它提供了这样的功能,将输入的两个数相加,返回结果。

示例Web Service提供的功能

       该示例Web Service提供了两个整数相加的功能,使用C#来实现Web Service,可以通过http://10.16.92.29/java/math.asmx?wsdl访问Web Service描述文件,其对应的WSDL描述如下所示:

通过JBuilder9调用该Web Service 建立一个新项目TestWebService

       新建一项目,指定项目名称“TestWebService”,及所在目录,其它全部按缺省设置。

从URL中导入Web Service

通过快捷方式“CTRL+N”,打开新建窗口,选择“Web Services”项,然后选择“Import a Web Service”,单击“OK”。

       输入WSDL文件地址:http://10.16.92.29/java/math.asmx?wsdl,然后单击“Next”。

这一步中,所有的选项按缺省设置就可以了。然后单击"Next"。 

       这一步中,您可以随意指定包名,如果将“Package options”中的复选框选中的话。生成的所有类将使用同样的包名。然后还可以选择“SOAP”协议类型,在此我们选择SOAP1.2协议,其它的设置就按缺省设置就可以了,单击“Next”按钮。

       在确认窗口中,单击“Finish”完成导入工作。

       导入成功后,JBuilder9会自动生成如下文件,如下所示。

自动生成文件的作用

Ø         Service1.java

该类定义了所需要的接口

Ø         Service1Locator.java

该类实现了Service1接口,主要用于定位WSDL文件

Ø         Service1Soap.java

该类定义了Web Service提供的接口方法

Ø         Service1SoapImpl.java

该类实现了Service1Soap接口

Ø         Service1SoapStub.java

该类实现了Service1Soap接口,用于实现Web Service调用。

Ø         Service1TestCase.java

JBuilder自动生成的单元测试类

编写测试代码

package org.tempuri;

 

import java.util.*;

 

/**

 * 测试程序

 * <p>Title: 通过客户端来测试Web Service</p>

 * <p>Description: 通过客户端来测试Web Service</p>

 * <p>Copyright: Copyright (c) 2004</p>

 * <p>Company: Tiger</p>

 * @author SucreTiger

 * @version 1.0

 */

public class Test

{

    public static void main(String[] agrs)

    {

        long startW = Calendar.getInstance().getTime().getTime();

        for (int i = 0; i < 3; i++) {

            try {

                //定位WSDL文件的位置

                Service1Locator sl = new Service1Locator();

                //获得Web Service的引用

                Service1Soap ss = (Service1Soap) sl.getService1Soap();

                //通过记录开始和结束的时间,来测试Web服务调用所花费的时间

                long start = Calendar.getInstance().getTime().getTime();

                System.out.println("开始时间 : " + start);

                //调用Web Service提供的功能方法

                int result = ss.add(100, 99);

                System.out.println("返回结果: " + result);

                long end = Calendar.getInstance().getTime().getTime();

                System.out.println("结束时间: " + end);

                System.out.println("时间消费: " + (end - start));

            }

            catch (Exception ex) {

                ex.printStackTrace();

            }

        }

    }

}

查看测试结果

D:\JBuilder9\jdk1.4\bin\javaw -classpath "D:\Projects\TestWebService\classes;D:\JBuilder9\thirdparty\junit3.8\junit.jar;D:\JBuilder9\lib\unittest.jar;D:\JBuilder9\lib\saaj.jar;D:\JBuilder9\lib\jaxrpc.jar;D:\JBuilder9\lib\axis.jar;D:\JBuilder9\lib\wsdl4j.jar;D:\JBuilder9\lib\log4j-1.2.8.jar;D:\JBuilder9\lib\commons-logging.jar;D:\JBuilder9\lib\commons-discovery.jar;D:\JBuilder9\lib\xercesImpl.jar;D:\JBuilder9\lib\xmlParserAPIs.jar;D:\JBuilder9\lib\activation.jar;D:\JBuilder9\lib\mail.jar;D:\JBuilder9\jdk1.4\demo\jfc\Java2D\Java2Demo.jar;D:\JBuilder9\jdk1.4\demo\plugin\jfc\Java2D\Java2Demo.jar;D:\JBuilder9\jdk1.4\jre\lib\charsets.jar;D:\JBuilder9\jdk1.4\jre\lib\ext\dnsns.jar;D:\JBuilder9\jdk1.4\jre\lib\ext\ldapsec.jar;D:\JBuilder9\jdk1.4\jre\lib\ext\localedata.jar;D:\JBuilder9\jdk1.4\jre\lib\ext\sunjce_provider.jar;D:\JBuilder9\jdk1.4\jre\lib\im\indicim.jar;D:\JBuilder9\jdk1.4\jre\lib\jaws.jar;D:\JBuilder9\jdk1.4\jre\lib\jce.jar;D:\JBuilder9\jdk1.4\jre\lib\jsse.jar;D:\JBuilder9\jdk1.4\jre\lib\rt.jar;D:\JBuilder9\jdk1.4\jre\lib\sunrsasign.jar;D:\JBuilder9\jdk1.4\lib\dt.jar;D:\JBuilder9\jdk1.4\lib\htmlconverter.jar;D:\JBuilder9\jdk1.4\lib\tools.jar"  org.tempuri.Test

开始时间: 1084968122004

返回结果: 199(Web Service返回的操作结果)

结束时间: 1084968122833

时间消费: 829(//调用一次Web Service所花费的时间,单位毫秒)

开始时间: 1084968122848

返回结果: 199

结束时间: 1084968123036

时间消费: 188

开始时间: 1084968123036

返回结果: 199

结束时间: 1084968123223

时间消费: 187

通过JSP来调用Web Service

Ø         将JBuilder9通过导入WSDL文件生成的类,打包成Client.jar。

上图是要打包的类文件的目录结构,使用如下命令完成打包操作:

jar –cvf Client.jar org

Ø         在JBuilder9的安装目录的LIB子目录下,查找如下类包(axis.jar、commons-discovery.jar 、jaxrpc.jar、log4j-1.2.8.jar、commons-logging.jar、saaj.jar、wsdl4j.jar)。

Ø         编写JSP测试代码,并将其打包生成测试的WEB应用。

上图是要打包的Web应用的目录结构,使用如下命令完成打包操作:

jar –cvf DefaultWebApp.war DefaultWebApp

Ø         然后通过http://localhost:7001/index.jsp 就可以测试Web Service了。

Ø         JSP测试源代码

<%@ page contentType="text/html; charset=GBK" %>

<%@ page import="java.util.*" %>

<%@ page import="org.tempuri.*" %>

<%

        long startW = Calendar.getInstance().getTime().getTime();

        for (int i = 0; i < 3; i++) {

            try {

                //定位WSDL文件的位置

                Service1Locator sl = new Service1Locator();

                //获得Web Service的引用

                Service1Soap ss = (Service1Soap) sl.getService1Soap();

                //通过记录开始和结束的时间,来测试Web服务调用所花费的时间

                long start = Calendar.getInstance().getTime().getTime();

                System.out.println("开始时间 : " + start);

                //调用Web Service提供的功能方法

                int result = ss.add(100, 99);

                System.out.println("返回结果: " + result);

                long end = Calendar.getInstance().getTime().getTime();

                System.out.println("结束时间: " + end);

                System.out.println("时间消费: " + (end - start));

            }

            catch (Exception ex) {

                ex.printStackTrace();

            }

        }

%>

注:所需的JAR包,一定要在应用服务器启动时加载,否则JSP文件编译不过。

参考资料

²        JBuilder9帮助文件

²        http://www.w3.org/2002/ws/

²        http:// www-900.ibm.com/developerWorks/cn/webservices/ ws-wsar/part2/index.shtml

本文地址:http://com.8s8s.com/it/it12399.htm