服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

通过webservice实现java与.net互联

通过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)

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

通过webservice实现java与.net互联(图一)

web service协议标准

简单对象访问协议(soap

       soapsimple object access protocol的缩写,是一种基于xml的不依赖传输协议的表示层协议,用来在分散或分布式的应用程序之间方便地以对象的形式交换数据。在soap的下层,可以是http/http,也可以是smtp/pop3,还可以是为一些应用而专门设计的特殊的通信协议。

       soap包括三个主要部分:

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

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

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

web service描述语言(wsdl

       wsdlweb 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描述如下所示:
通过webservice实现java与.net互联(图二)

通过jbuilder9调用该web service

建立一个新项目testwebservice

       新建一项目,指定项目名称“testwebservice”,及所在目录,其它全部按缺省设置。
通过webservice实现java与.net互联(图三)

url中导入web service

通过快捷方式“ctrl+n”,打开新建窗口,选择“web services”项,然后选择“import a web service”,单击“ok”。
通过webservice实现java与.net互联(图四)

       输入wsdl文件地址:http://10.16.92.29/java/math.asmx?wsdl,然后单击“next”。
通过webservice实现java与.net互联(图五)
这一步中,所有的选项按缺省设置就可以了。然后单击"next"。 
通过webservice实现java与.net互联(图六)

       这一步中,您可以随意指定包名,如果将“package options”中的复选框选中的话。生成的所有类将使用同样的包名。然后还可以选择“soap”协议类型,在此我们选择soap1.2协议,其它的设置就按缺省设置就可以了,单击“next”按钮。
通过webservice实现java与.net互联(图七)

       在确认窗口中,单击“finish”完成导入工作。
通过webservice实现java与.net互联(图八)

       导入成功后,jbuilder9会自动生成如下文件,如下所示。
通过webservice实现java与.net互联(图九)

自动生成文件的作用

Ø         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

返回结果: 199web 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.jarcommons-discovery.jar jaxrpc.jarlog4j-1.2.8.jarcommons-logging.jarsaaj.jarwsdl4j.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);