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>
分享到:
相关推荐
JPetStore是Spring官方提供的一个开源示例项目,它是一个基于MVC设计模式的电子商务应用程序,用于展示Spring框架的各种特性,包括依赖注入、AOP(面向切面编程)、数据访问、事务管理等。通过学习和实践JPetStore,...
JPetStore作为Spring官方提供的一个示例项目,是学习Spring框架的最佳实践之一。本篇文章将深入探讨如何在MyEclipse环境中搭建和运行这个基于Spring的JPetStore工程,并介绍其中涉及的关键技术点。 首先,JPetStore...
标题 "spring例子: jpetstore" 提到的是一个基于Spring框架的应用示例——JPetStore。这个项目是Spring官方提供的一个经典示例,用于展示如何使用Spring框架来构建Web应用程序。它是一个小型的在线宠物商店,包含了...
JpetStore作为Spring的经典示例项目,是学习Spring的重要实践资源。本文将围绕JpetStore,深入探讨Spring的核心特性及其在实际应用中的运用。 首先,JpetStore是基于MVC(Model-View-Controller)设计模式构建的...
jpetstore4.0是一款经典的电子商务示例应用,它采用Spring、Struts和iBatis这三个核心框架构建,展示了如何在Java环境下实现一个完整的MVC(Model-View-Controller)架构。这个项目是针对JDK7及更高版本,以及Tomcat...
JPetStore是Spring官方提供的一个示例项目,它是一个基于MVC设计模式的在线宠物商店。该项目旨在展示Spring框架的诸多特性,包括:数据访问、事务管理、服务层、视图层以及Web MVC框架。通过学习和实践JPetStore,...
最新spring带的JPetStore的MyEclipse项目,包括了数据库,可用hsqldb直接运行,可以直接导入MyEclipse中并部署运行。 在Myeclipse里新建一个web项目,导入shopping项目即可,数据库在db文件夹里
而JPetStore作为Spring框架的经典示例项目,是学习和理解Spring核心特性的绝佳起点。本文将深入探讨Spring JPetStore项目,揭示其中蕴含的诸多技术知识点,帮助开发者提升对Spring的理解和应用能力。 1. **Spring...
《Spring JPetStore:Spring框架的经典示例》 Spring框架是Java开发中广泛使用的轻量级框架,以其灵活、高效和模块化的特性深受开发者喜爱。其中,JPetStore项目是Spring官方提供的一个经典示例,它展示了Spring的...
jpetstore项目是Spring框架的一个经典示例,它全面展示了如何将Spring、iBatis和Struts这三个核心的Java Web技术进行集成,构建出一个完整的MVC(Model-View-Controller)应用程序。这个项目不仅提供了一个可直接...
spring自带的JPetStore,我已经配置好(数据库也配置好,用的是hsqldb),可以直接导 入eclipse中运行。共3个压缩包
而JPetStore作为Spring官方提供的一个示例应用,是学习Spring MVC和Spring框架核心概念的理想起点。本文将详细探讨如何在MyEclipse集成开发环境下搭建和运行Spring JPetStore 2.5项目,以及该项目中所涉及到的关键...
一个非常好的用于学习java web开发的例子,例子简单,但包含的技术非常全面,里面影射出很规范的编程思想,对原spring示例jpetstore的全面改造。使用spring,struts2,hibernate框架,而非ibatis,spring,spring-mvc,现...
**Spring jpetstore** 是一个基于Spring框架的开源示例应用,它展示了如何使用Spring MVC、Spring JDBC以及Spring的其他核心特性来构建一个完整的Web应用。这个项目是Spring官方提供的,旨在帮助开发者学习和理解...
**标题解析:** "JPetStore (Struts + Spring + Hibernate)版" 是一个基于Java技术的开源电子商务示例应用,它集成了Struts、Spring和Hibernate三个关键的开源框架。这个版本相较于之前的JPetStore5.0,进行了重要的...
总结,`jpetstore` 示例全面展示了 Spring MVC 框架在实际项目中的应用,包括了 MVC 设计模式、数据访问、服务层设计、事务管理、配置文件等多个方面。通过学习和分析 `jpetstore`,开发者可以更好地理解和掌握 ...
3. **JPetStore**:JPetStore是Java EE领域的一个经典示例应用,它是一个在线宠物商店。这个项目用以演示各种技术和设计模式,例如MVC模式、DAO模式等。在Spring+iBatis的版本中,它展示了如何将这两者结合,实现一...
在 jpetstore 中,Spring 作为整个应用的“胶水”,管理各个组件的生命周期和依赖关系。它可能通过XML配置或注解驱动的方式来定义bean,这些bean可以是DAO(数据访问对象)、Service、Controller等。Spring还提供了...
该项目是基于经典的iBatis数据访问框架的JPetStore示例,通过现代的SpringMVC、MyBatis和MySQL数据库技术进行了重新实现。这为我们提供了一个深入理解如何在实际开发中整合这些技术的绝佳机会。以下是对这个项目涉及...
**jpetstore** 是一个由Sun Microsystems公司开发的开源Web应用程序示例,它是一个基于Java技术的网上宠物商店。这个项目被设计成一个简单的“Hello, World”式的Web应用,用以展示Java技术和相关的框架在构建电子...