`
zerozone
  • 浏览: 203829 次
  • 来自: 北京
社区版块
存档分类
最新评论

访问Spring示例JPetStore的OrderService服务

    博客分类:
  • Java
阅读更多
Spring--当前流行的J2EE开发的轻量级框架,提供了对MVC web层、持久化层、声明性事务及远程调用的支持。借助Apache Axis的支持,Spring提供了基于WSDL的WebService服务。

本文主要讨论两个问题,如何提供一个WebService服务以及如何从外部访问该服务。我们研究一下JPetStore示例提供的OrderService。

代码需要以下环境。

1.spring-framework-1.2.8-with-dependencies.zip 解压缩。

2.eclipse3.2+JDK1.5

3.tomcat 5.0

4.数据库mySQL或Oracle9i

至少完成以下准备工作:

1.已经在Tomcat中部署Spring的示例JPetStore

2.可以在本机访问JPetStore的OrderService。

3.在eclipse环境建立jpetstore项目,指定路径(例如c:/spring-framework-1.2.8/samples/jpetstore)

Spring支持多种远程调用机制,本文开头也提到了。这里我们仅讨论基于WSDL的WebService的问题。首先,看如何在Spring中提供一个WebService。很简单,需要2个步骤。

1.编写一个继承ServletEndpointSupport类并实现你要提供的服务的接口。例如JPetStore已经提供了这个类JaxRpcOrderService。

2.编写server-confid.wsdd描述文件,请参照Spring示例查看该文件。以下是其中的一段,用于描述上步骤的服务端点。<service provider="java:RPC" name="OrderService"> <parameter value="*" name="allowedMethods"> <parameter value="org.springframework.samples.jpetstore.service.JaxRpcOrderService" name="className"><beanmapping languagespecifictype="java:org.springframework.samples.jpetstore.domain.Order" xmlns:jpetstore="urn:JPetStore" qname="jpetstore:Order"><beanmapping languagespecifictype="java:org.springframework.samples.jpetstore.domain.LineItem" xmlns:jpetstore="urn:JPetStore" qname="jpetstore:LineItem"><beanmapping languagespecifictype="java:org.springframework.samples.jpetstore.domain.Item" xmlns:jpetstore="urn:JPetStore" qname="jpetstore:Item"><beanmapping languagespecifictype="java:org.springframework.samples.jpetstore.domain.Product" xmlns:jpetstore="urn:JPetStore" qname="jpetstore:Product"></beanmapping>


注意,上述描述符的beanMapping段落描述了该服务端点的数据类型及其引用或以来类型。后文还会提到这些数据类型的意义。重新启动Tomcat即可。

如何在客户端访问OrderService?这里我们提供一种使用Java在客户端访问该服务的示例以及如何解决遇见错误could not find deserializer for type。通过这个示例,大家会加深对WebSerive工作机制的理解,例如obejct serialization/ deserialization(对象序列化/反序列化)。我们知道,现代的面对对象的语言(例如Java,C#)提供了对象序列化/反序列化机制。对象序列化就是把对象持久化到内存外的存储介质,反序列化就是逆过程。在应用到面向对象的软件系统提供远程调用服务,离不开对象序列化/反序列化机制。WebService基于XML标记语言。一个调用的返回结果如果是一个对象,那么XML文本其实就是对象的存储介质,我们需要反序列化它,把它还原到内存中真实的对象。这个过程Axis已经帮我们完成了。


好了,来看示例代码:


package com.test.www;

import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import org.springframework.samples.jpetstore.domain.Item;
import org.springframework.samples.jpetstore.domain.LineItem;
import org.springframework.samples.jpetstore.domain.Order;
import org.springframework.samples.jpetstore.domain.Product;
//import org.apache.axis.client.ServiceFactory;
public class TestWebServiceClient {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
String nameSpaceUri = "http://localhost:8090/jpetstore/services/OrderService";
// 创建调用对象
Service service = new Service();
Call call = null;
call = (Call) service.createCall();

QName qn1 = new QName("urn:JPetStore", "Order");
QName qn2 = new QName("urn:JPetStore", "LineItem");
QName qn3 = new QName("urn:JPetStore", "Item");
QName qn4 = new QName("urn:JPetStore", "Product");
call.registerTypeMapping(Order.class, qn1, new BeanSerializerFactory(Order.class, qn1),
new BeanDeserializerFactory(Order.class, qn1));
call.registerTypeMapping(LineItem.class, qn2, new BeanSerializerFactory(LineItem.class, qn2),
new BeanDeserializerFactory(LineItem.class, qn2));
call.registerTypeMapping(Item.class, qn3, new BeanSerializerFactory(Item.class, qn3),
new BeanDeserializerFactory(Item.class, qn3));
call.registerTypeMapping(Product.class, qn4, new BeanSerializerFactory(Product.class, qn4),
new BeanDeserializerFactory(Product.class, qn4));

System.out.println(">>>getOrder");
call.setTargetEndpointAddress(new URL(wsdlUrl));
//调用的服务器端方法
call.setOperationName(new QName("Order", "getOrder"));
//设定传入的参数,这里qn即Order.class
//call.addParameter("arg1", qn1, ParameterMode.IN);
call.addParameter("arg1", qn1, ParameterMode.IN);
//设定返回的参数是Order.class
call.setReturnType(qn1, Order.class);
Order ret = (Order) call.invoke(new Integer[]{1000});
System.out.println("return value is " + ret);
} catch (Exception e) {
e.printStackTrace();
}
}
}


如果遇到过could not find deserializer for type 错误,就会明白了错误表明,在对象反序列化过程中需要的类型无法识别,需要我们注册。

小结

通过以上的例子,我们简单描述了如何提供基于WSDL的WebService以及如何使用Java语言访问该服务。 对象序列化/反序列化是 问题 的关键 。如何在异构环境访问WebService?例如如何在Flex的UI层访问WebService,由于时间原因我们以后再讨论。
</beanmapping></beanmapping></beanmapping></parameter> </parameter> </service>
分享到:
评论

相关推荐

    MyEclipse中加载Spring的JPetStore

    JPetStore是Spring官方提供的一个开源示例项目,它是一个基于MVC设计模式的电子商务应用程序,用于展示Spring框架的各种特性,包括依赖注入、AOP(面向切面编程)、数据访问、事务管理等。通过学习和实践JPetStore,...

    spring的jpetstore工程(myeclipse)

    JPetStore作为Spring官方提供的一个示例项目,是学习Spring框架的最佳实践之一。本篇文章将深入探讨如何在MyEclipse环境中搭建和运行这个基于Spring的JPetStore工程,并介绍其中涉及的关键技术点。 首先,JPetStore...

    spring例子: jpetstore

    标题 "spring例子: jpetstore" 提到的是一个基于Spring框架的应用示例——JPetStore。这个项目是Spring官方提供的一个经典示例,用于展示如何使用Spring框架来构建Web应用程序。它是一个小型的在线宠物商店,包含了...

    学习Spring 的例子JpetStore

    JpetStore作为Spring的经典示例项目,是学习Spring的重要实践资源。本文将围绕JpetStore,深入探讨Spring的核心特性及其在实际应用中的运用。 首先,JpetStore是基于MVC(Model-View-Controller)设计模式构建的...

    jpetstore4.0 (spring+struts+ibatis)

    jpetstore4.0是一款经典的电子商务示例应用,它采用Spring、Struts和iBatis这三个核心框架构建,展示了如何在Java环境下实现一个完整的MVC(Model-View-Controller)架构。这个项目是针对JDK7及更高版本,以及Tomcat...

    eclipse_spring_jpetstore.rar

    JPetStore是Spring官方提供的一个示例项目,它是一个基于MVC设计模式的在线宠物商店。该项目旨在展示Spring框架的诸多特性,包括:数据访问、事务管理、服务层、视图层以及Web MVC框架。通过学习和实践JPetStore,...

    Spring+jpetstore+Myeclipse

    最新spring带的JPetStore的MyEclipse项目,包括了数据库,可用hsqldb直接运行,可以直接导入MyEclipse中并部署运行。 在Myeclipse里新建一个web项目,导入shopping项目即可,数据库在db文件夹里

    spring之jpetstore

    而JPetStore作为Spring框架的经典示例项目,是学习和理解Spring核心特性的绝佳起点。本文将深入探讨Spring JPetStore项目,揭示其中蕴含的诸多技术知识点,帮助开发者提升对Spring的理解和应用能力。 1. **Spring...

    spring jpetstore spring附带的例子

    《Spring JPetStore:Spring框架的经典示例》 Spring框架是Java开发中广泛使用的轻量级框架,以其灵活、高效和模块化的特性深受开发者喜爱。其中,JPetStore项目是Spring官方提供的一个经典示例,它展示了Spring的...

    jpetstore spring 的经典完整可直接运行的例子 jpetstore

    jpetstore项目是Spring框架的一个经典示例,它全面展示了如何将Spring、iBatis和Struts这三个核心的Java Web技术进行集成,构建出一个完整的MVC(Model-View-Controller)应用程序。这个项目不仅提供了一个可直接...

    Spring源码学习-JPetStore.part3

    spring自带的JPetStore,我已经配置好(数据库也配置好,用的是hsqldb),可以直接导 入eclipse中运行。共3个压缩包

    spring jpetstore2.5

    而JPetStore作为Spring官方提供的一个示例应用,是学习Spring MVC和Spring框架核心概念的理想起点。本文将详细探讨如何在MyEclipse集成开发环境下搭建和运行Spring JPetStore 2.5项目,以及该项目中所涉及到的关键...

    经典的java例子,jpetstore(spring+struts2+hibernate)

    一个非常好的用于学习java web开发的例子,例子简单,但包含的技术非常全面,里面影射出很规范的编程思想,对原spring示例jpetstore的全面改造。使用spring,struts2,hibernate框架,而非ibatis,spring,spring-mvc,现...

    Spring jpetstore

    **Spring jpetstore** 是一个基于Spring框架的开源示例应用,它展示了如何使用Spring MVC、Spring JDBC以及Spring的其他核心特性来构建一个完整的Web应用。这个项目是Spring官方提供的,旨在帮助开发者学习和理解...

    JPetStore (Struts + Spring + Hibernate)版

    **标题解析:** "JPetStore (Struts + Spring + Hibernate)版" 是一个基于Java技术的开源电子商务示例应用,它集成了Struts、Spring和Hibernate三个关键的开源框架。这个版本相较于之前的JPetStore5.0,进行了重要的...

    springMVC自带的jpetstore源码

    总结,`jpetstore` 示例全面展示了 Spring MVC 框架在实际项目中的应用,包括了 MVC 设计模式、数据访问、服务层设计、事务管理、配置文件等多个方面。通过学习和分析 `jpetstore`,开发者可以更好地理解和掌握 ...

    spring+ibatis的jpetstore实例工程,包含完整源代码和jar包

    3. **JPetStore**:JPetStore是Java EE领域的一个经典示例应用,它是一个在线宠物商店。这个项目用以演示各种技术和设计模式,例如MVC模式、DAO模式等。在Spring+iBatis的版本中,它展示了如何将这两者结合,实现一...

    Struts+Spring+Hibernate实现的jpetstore

    在 jpetstore 中,Spring 作为整个应用的“胶水”,管理各个组件的生命周期和依赖关系。它可能通过XML配置或注解驱动的方式来定义bean,这些bean可以是DAO(数据访问对象)、Service、Controller等。Spring还提供了...

    jpetstore

    **jpetstore** 是一个由Sun Microsystems公司开发的开源Web应用程序示例,它是一个基于Java技术的网上宠物商店。这个项目被设计成一个简单的“Hello, World”式的Web应用,用以展示Java技术和相关的框架在构建电子...

    重现经典的ibatis示例项目jpetstore,采用最新的springMVC+mybatis+mysql.zip

    重现经典的ibatis示例项目jpetstore,采用最新的springMVC+mybatis+mysql

Global site tag (gtag.js) - Google Analytics