`
li-yuan
  • 浏览: 68569 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Web 服务2(入门教程)

阅读更多

1.5     JAX-RPC 开发 WEB 服务简介

JAX-RPC 就是 Java API for XML-Based RPC Java XML 为基础的远程过程调用 API )的缩写,它是在 java 平台上开发 WEB 服务重要技术规范。和其他 JAVA 技术规范一样, JAX-RPC 本身只是一组类和接口并非具体实现,所以使用 JAX-RPC 进行开发需要在一个具体实现了该规范的平台上来进行。

JAX-RPC 可以被用于开发基于 SOAP1.1 规范的 WEB 服务的服务器端和客户端。 JAX-RPC 提供一种简单的编程模式来开发基于 SOAP 协议的 WEB 服务,它屏蔽了 Web 服务的很多技术细节,开发人员在不需要了解底层协议的情况下就可以进行 Web 服务的开发。 JAX-RPC 还提供了把 WSDL 映射成 JAVA 代码以及把 JAVA 代码映射成 WSDL 的工具。

      Apache AXIS 1.X JAX-RPC 的开源实现,这里我们将使用 AXIS 来开发 WEB 服务。开发 web 服务有两种模式: 1 、契约优先模式; 2 程序优先模式;契约优先就是先用 WSDL 定义服务,然后在根据 WSDL 来编写程序,而程序优先模式则先编程程序然后在用工具将程序发布成 Web 服务。 AXIS 1.X 采用了第 2 种模式,先用 Java 编写代码再发布成 Web 服务。

    正如前面所描述的那样,在编写作为 Web 服务发布的程序时不需要考虑 RPC Web 服务。大多数 Web 服务最初并不是作为 Web 服务开发的;实际上,它们最初是一般的程序,包含一些在调用时返回值的方法。如果您熟悉这个概念,就说明已经理解了 Web 服务的本质:它们仅仅是可以通过 Web 而不是只有虚拟机访问的程序。

所以,在开始关注 RPC 语法或 Web Services Description Language WSDL )之前,我们需要一个可供 Web 客户机使用的类。

     假设我们需要开发一个可以根据贷款年限、贷款金额、利率计算总利息的 Web 服务,现在完全不用考虑 Web 服务,就写一个简单的 java 类来计算利息就行了。

 

public class CalculateInterest {

  public float calculate(float credit,int year,float rate){

             return credit*year*rate;

  }

}

 

 这段代码,不需要太多的解释,就是非常简单的 POJO 。接下来通过 AXIS 1.X 把这个 POJO 发布成 WEB 服务。 AXIS 提供立即发布和定义发布两种部署方式来发布 Web 服务,这里将先采用立即发布方式将 CalculateInterest 类发布成 Web 服务再来说明如何进行定制发布。采用立即发布方式只用将 CalculateInterest.java 重命名为 CalculateInterest.jws 并拷贝到部署了 AXIS 1.X 运行环境的 Web 应用中就算完成了 Web 服务的发布。有了 Web 服务但是谁来使用这个服务呢?当然是客户端,接下来我们开发 CalculateInterest 服务的客户端。按照 JAX-RPC 规范的要求客户端使用 javax.xml.rpc.Call javax.xml.rpc.Service 这两个接口来实现对服务器端的调用, AXIS 1.X 提了这两个接口的实现类 org.apache.axis.client.Call org.apache.axis.client.Service ,使用这两个实现类可以很轻松的构建出 Web 服务的客户端来。下面是 CalculateInterest 服务的客户端代码:

 

import java.io.IOException;

import javax.xml.namespace.QName;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import javax.xml.rpc.ServiceException;

 

public class CalculateInterestClient {

 

         public static final String 

        SERVICE_URL = "http://localhost:8080/AXIS_WS/CalculateInterest.jws";

         

         public float calculate(Float credit, Integer year, Float rate)

                            throws IOException {

                   try {

                            Service service = new Service();

                            Call call = (Call) service.createCall();

                            call.setTargetEndpointAddress(SERVICE_URL);

                            call.setOperationName(new QName("http://DefaultNamespace",

                                               "calculate"));

                            Object result = call.invoke(new Object[] { credit, year, rate });

                            if (result instanceof Float && result != null)

                                     return ((Float) result).floatValue();

                            else

                                     return -1f;

                   } catch (ServiceException e) {

                            throw new IOException("Error creating service call: "

                                               + e.getMessage());

                   }

         }

 

         public static void main(String[] args) {

                   CalculateInterestClient client = new CalculateInterestClient();

                   try {

                            System.out.println(client.calculate(100000f, 10,0.0523f));

                   } catch (IOException e) {

                            e.printStackTrace();

                   }

         }

}

 首先是创建 Service 类,然后创建 Call ,然后指定 Call 实例要访问的网络端点,设置 Web 服务具体操作的在 WSDL 中的限定名(这里不用太在意限定名的问题,后面会做进一步讲解),这个限定名包含了两个部分本地名 calculate 和名字空间 http://DefaultNamespace 然后调用 invoke 方法,就实现了对 Web 服务的调用。

 

从上面的代码来看和 WSLD 没有什么关系,这是因为 AXIS 1.X 采用 AXIS 默认的 RPC 服务方式访问 Web 服务,而这个 Web 服务也正好采用的 RPC 方式提供对外服务,但实际情况并不能保证所有 Web 服务都采用的这种方式,所以 AXIS 提供了可以根据 WSDL 生成客户端代码的工具,在接来介绍定制方式发布服务的部分会对这个工具进行介绍。

这个例子可以看出 AXIS 1.X 实现了对 web 服务底层的封装,不用了解 Web 服务。但是采用这种立即发布方式简单但是不够灵活,很多情况下不能适应实际的应用,例如一个 Java 有多个公有方法而很多情况下只需要把一个方法发布成 Web 服务,使用立即发布全部公有方法都会被暴露出来,这时候需要使用 AXIS 提供的定制发布。

为了方便说明定制发布,我们假设需要开发一个提供计算铁路列车票价的服务,该服务可以根据输入的历程公里数计算票价,每公里的成本票价为 0.075 元,除了成本还有 15% 的利润,这个服务有两个方法一个用于计算成本另一个用于计算加上利润后的票价,计算成本的方法不应该被发布成 Web 服务,但同一个 jvm 的类需要能访问这个方法。和前面的示例一样,这个 Web 服务的程序只是一个 POJO ,代码如下:

 

package railway;

 

public class TicketSvr {

  public float ticketPrice(float journey){

         return ticketCostPrice(journey)*(1+0.15f);

  }

  public float ticketCostPrice(float journey){

         return journey*0.075f;

  }

}

 编译 TicketSvr 并把 class 文件拷贝到部署了 AXIS Web 应用的 WEB-INF/classes 目录中,为了把 TicketSvr 发布成 Web 服务,使用定制方式发布服务需要编写一个名字为 deploy.wsdd XML 文件,里面的内容为:

 

<deployment xmlns="http://xml.apache.org/axis/wsdd/"

            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

 <service name="TicketSvr" provider="java:RPC">

   <parameter name="className" value="railway.TicketSvr"/>

   <parameter name="allowedMethods" value="ticketPrice"/>

 </service>

</deployment>

 

 启动部署了 AXIS Web 应用,使用 AXIS 提供的命令:

 

java org.apache.axis.client.AdminClient -lhttp://localhost:8080/AXIS_WS/services/AdminService deploy.wsdd

 这个命令会把相应的配置加入到 WEB-INF 目录下的 server-config.wsdd 文件中,用浏览器访问 http://localhost:8080/AXIS_WS/services/TicketSvr?wsdl 可以看到 TicketSvr WSDL 。这里将使用 AXIS 提供的工具 WSDL2Java 生成客户端的代码。启动部署了 AXIS Web 应用,把 WEB-INF/lib 目录下的所有 jar 包加入到类路径,然后执行如下命令:

 

 

 

java -Djava.ext.dirs=lib http://localhost:8080/AXIS_WS/services/TicketSvr?wsdl
 

 

 

 

这个命令将在 localhost/AXIS_WS/services/TicketSvr 目录下生成四个 java 文件,它们分别是:

TicketSvr.java Web 服务的接口,只有一个方法 ticketPrice

TicketSvrService.java 服务接口工厂的接口,定义了生成服务接口的方法;

TicketSvrServiceLocator.java TicketSvrService 接口的实现类;

TicketSvrSoapBindingStub.java 实现网络通信,具体调用 Web 服务;

只用调用这些生成的类就可以实现对 Web 服务的调用。下面就是访问 Web 服务的客户端代码。

 

import java.rmi.RemoteException;

 

import javax.xml.rpc.ServiceException;

 

import localhost.AXIS_WS.services.TicketSvr.*;

 

public class TicketSvrClient {

 

       public static void main(String[] args) throws ServiceException,

                     RemoteException {

              TicketSvrService ticketService = new TicketSvrServiceLocator();

              TicketSvr ticketSvr = ticketService.getTicketSvr();

              System.out.println("1100 km price is " + ticketSvr.ticketPrice(1100f));

       }

 

}

 

 使用 JAX-RPC 可以极大的简化 Web 服务的开发,但 JAX-RPC 适用于 RPC 模式 Web 服务的开发,而在异构系统集成方面更多情况下是采用基于文档模式的 Web 服务,为了适应技术发展 JAX-WS 标准被提出来了,下面的章节我们将介绍更新的 JAX-WS 标准。

 

 

分享到:
评论

相关推荐

    C#Web应用程序入门经典_程序设计

    它提供了丰富的控件、服务和工具,简化了Web开发流程。 2. 页面生命周期:理解Web页面从请求到响应的生命周期至关重要。这包括初始化、加载、回发和卸载等阶段,开发者需要知道在哪个阶段进行哪种操作。 3. 控件和...

    Web前端-入门教程集合

    在这个"Web前端-入门教程集合"中,你将找到一系列的学习资源,帮助你逐步踏入Web前端的大门。从基础概念到实践应用,每一步都至关重要。通过深入学习和不断实践,你将能够创建出美观且功能丰富的网页应用。所以,...

    web service入门教程ppt

    **Web服务入门教程** Web服务是一种基于互联网的通信协议,允许不同系统间的应用程序进行交互和数据交换。这个教程,由MCT(微软认证讲师)和MVP(微软最有价值专家)杨永智编撰,是专为微软校园大使设计的课件,...

    web+service入门教程

    **Web服务入门教程** 在信息技术领域,Web服务是一种标准化的机制,允许不同应用程序之间进行通信和数据交换。这个“Web+Service入门教程”PPT旨在为初学者提供一个全面了解和掌握Web服务的基础。 1. **Web服务的...

    最新Python-web开发视频教程从入门到精通.pdf

    精品课程 全程面授 千锋教育 www.qfedu.com 做真实的自己-用良心做教育 最新 Python web 开发视频教程从入门到精通 想学 Python web 开发?想成为 Python web 开发工程师?想进入 Python 行业拿高薪?但还没入行? ...

    WYSIWYG_Web_Builde入门教程.pdf

    WYSIWYG Web Builder 入门教程 WYSIWYG Web Builder 是一个网页制作工具,不需要编程,通过拖拽式操作,以所见即所得的方式快速制作网页。相对于 Dreamweaver 等专业工具,它更加轻量级,整个安装文件大小仅为 8.76...

    C#Web应用程序入门经典

    在随后的11章中从理论和实践两个方而讲解了web应用程序的创建、测试、调试和部署等环节,如服务器控件、数探访问、数据绑定、Asp.NET状态管理、XML与web开发、web应用程序中的web服务、ASP.NET身份验证、授权和安全...

    Spring Web MVC入门教程

    Spring Web MVC是一种基于MVC模式的轻量级Java Web应用框架,它是Spring框架的一部分,主要用于简化Web层的开发。Spring Web MVC允许开发者将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller...

    Web Services入门教程

    【Web Services入门教程】 Web服务是一种基于互联网的软件应用程序接口(API),允许不同的系统和应用程序之间进行交互。这种交互通常是通过使用开放标准如XML(可扩展标记语言)和SOAP(简单对象访问协议)来实现...

    Web RTC完美入门教程(康林)

    WebRTC完美入门教程由康林编写,主要介绍了网页实时通信(Web Real-Time Communication)技术。这是一种在浏览器中实现点对点实时通信的技术,可以支持语音、视频通话等功能。WebRTC技术在国内资料较少,因此本教程...

    NET_C#_Web_Service入门教程

    NET_C#_Web_Service入门教程

    web前端开发入门教程(20211215130803).pdf

    web前端开发入门教程(20211215130803).pdf

    Java-Web快速入门教程

    Java-Web快速入门教程

    OWL2 Web本体语言入门

    **OWL2 Web 本体语言入门** OWL2 Web 本体语言是W3C发布的一种强大的语义网本体描述语言,它允许用户创建、共享和重用具有精确形式化语义的结构化知识。本体是知识表示的框架,其中包含类(概念)、属性(关系)...

    C#Web应用程序入门教程

    本教程旨在引导初学者踏入C# Web开发的世界,通过超星阅览器进行阅读,可以方便地学习和理解相关概念。 1. **C#语言基础**:C#是微软开发的一种面向对象的编程语言,具有类型安全、垃圾回收等特点,适用于开发...

    Delphi+Web前端开发教程基于TMS+WEB+Core框架.pdf

    **TMS WEB Core入门与配置** 要开始使用TMS WEB Core,首先需要了解基本的Web开发知识,然后配置Delphi或Lazarus环境。教程中详细介绍了如何设置TMS WEB Core,包括项目设置和自动化版本管理,确保开发者能快速上手...

    c#Web_Service入门教程.pdf

    c#Web_Service入门教程.pdf

    stable diffusion webui使用入门教程(不含安装).pdf

    《stable diffusion webui使用入门详解》 stable diffusion webui 是一款强大的基于文本到图像生成的工具,尤其适合于艺术创作和图像编辑。该工具提供了直观的UI界面,让用户无需深入技术细节即可进行操作。本文将...

Global site tag (gtag.js) - Google Analytics