`
tiankong6622
  • 浏览: 55235 次
社区版块
存档分类
最新评论

Hessian实现Webservice简单实例

阅读更多

Hessian实现Webservice简单实例

Hessian是一个轻量级的remoting on http工具,采用的是Binary RPC协议,所以它很适合于发送二进制数据,同时又具有防火墙穿透能力。Hessian一般是通过Web应用来提供服务,因此非常类似于平时我们用的WebService。只是它不使用SOAP协议,但相比webservice而言更简单、快捷。

Hessian官网:http://hessian.caucho.com/

Hessian可通过Servlet提供远程服务,需要将匹配某个模式的请求映射到Hessian服务。也可Spring框架整合,通过它的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,建议采用面向接口编程,Hessian服务通过接口暴露。

Hessian处理过程示意图:

客户端——>序列化写到输出流——>远程方法(服务器端)——>序列化写到输出流 ——>客户端读取输入流——>输出结果

下面详细介绍最常用的两种方式实现Hessian提供webservice:

纯Hessian实现

配合Spring框架实现

在开始之前当然需要到官网上下载相关的lib包,放入项目的/WEB-INF/lib/下

【一】、纯Hessian实现步骤:

1.基本代码

首先编写一个服务的接口类:HelloHessian.java

Java代码

 

 

  1. package michael.hessian;     
  2. import java.util.List;     
  3. import java.util.Map;     
  4.     
  5. /**    
  6.  * @author michael    
  7.  *     
  8.  */    
  9. public interface HelloHessian {     
  10.     
  11.     String sayHello();     
  12.     
  13.     MyCar getMyCar();     
  14.     
  15.     List myLoveFruit();     
  16.     
  17.     Map<string, string> myBabays();     
  18.     
  19. }   

 

一个java bean文件MyCar.java:

Java代码

 

 

  1. package michael.hessian;     
  2.     
  3. import java.io.Serializable;     
  4.     
  5. /**    
  6.  * @author michael    
  7.  *     
  8.  */    
  9. public class MyCar implements Serializable {     
  10.     
  11.     /**    
  12.      *     
  13.      */    
  14.     private static final long serialVersionUID = 4736905401908455439L;     
  15.     
  16.     private String carName;     
  17.     
  18.     private String carModel;     
  19.     
  20.     /**    
  21.      * @return the carName    
  22.      */    
  23.     public String getCarName() {     
  24.         return carName;     
  25.     }     
  26.     
  27.     /**    
  28.      * @return the carModel    
  29.      */    
  30.     public String getCarModel() {     
  31.         return carModel;     
  32.     }     
  33.     
  34.     /**    
  35.      * @param pCarName the carName to set    
  36.      */    
  37.     public void setCarName(String pCarName) {     
  38.         carName = pCarName;     
  39.     }     
  40.     
  41.     /**    
  42.      * @param pCarModel the carModel to set    
  43.      */    
  44.     public void setCarModel(String pCarModel) {     
  45.         carModel = pCarModel;     
  46.     }     
  47.     
  48.     /**    
  49.      * @see java.lang.Object#toString()    
  50.      * @return    
  51.      */    
  52.     @Override    
  53.     public String toString() {     
  54.         return "my car name:[" + this.carName + "] model:[" + this.carModel     
  55.                 + "].";     
  56.     }     
  57.     
  58. }   

 

服务端接口的实现类:HelloHessianImpl.java

Java代码

 

 

  1. package michael.hessian.impl;     
  2.     
  3. import java.util.ArrayList;     
  4. import java.util.HashMap;     
  5. import java.util.List;     
  6. import java.util.Map;     
  7.     
  8. import michael.hessian.HelloHessian;     
  9. import michael.hessian.MyCar;     
  10.     
  11. /**    
  12.  * @author michael    
  13.  *     
  14.  */    
  15. public class HelloHessianImpl extends HessianServlet implements HelloHessian {     
  16.     
  17.     public MyCar getMyCar() {     
  18.         MyCar car = new MyCar();     
  19.         car.setCarName("阿斯顿·马丁");     
  20.         car.setCarModel("One-77");     
  21.         return car;     
  22.     }     
  23.     
  24.     public Map<string, string> myBabays() {     
  25.         Map<string, string> map = new HashMap<string, string>();     
  26.         map.put("son""孙吴空");     
  27.         map.put("daughter""孙小美");     
  28.         return map;     
  29.     }     
  30.     
  31.     public List myLoveFruit() {     
  32.         List list = new ArrayList();     
  33.         list.add("apple");     
  34.         list.add("kiwi");     
  35.         list.add("orange");     
  36.         return list;     
  37.     }     
  38.     
  39.     public String sayHello() {     
  40.         return "welcom to Hessian";     
  41.     }     
  42.     
  43. }   

2.配置文件web.xml修改

在web.xml配置文件里增加如下信息:

Xml代码

 

 

  1. <servlet>    
  2.         <servlet-name>HelloHessianservlet-name>    
  3.         <servlet-class>    
  4.             com.caucho.hessian.server.HessianServlet     
  5.         servlet-class>    
  6.         <init-param>    
  7.             <param-name>home-classparam-name>    
  8.             <param-value>michael.hessian.impl.HelloHessianImplparam-value>    
  9.         init-param>    
  10.         <init-param>    
  11.             <param-name>home-apiparam-name>    
  12.             <param-value>michael.hessian.HelloHessianparam-value>    
  13.         init-param>    
  14.         <load-on-startup>1load-on-startup>    
  15.     servlet>    
  16.     <servlet-mapping>    
  17.         <servlet-name>HelloHessianservlet-name>    
  18.         <url-pattern>/HessianServiceurl-pattern>    
  19.     servlet-mapping>    
  20.     <servlet-mapping>    

 

 

 

3.java客户端验证

Java代码

 

 

  1. package michael.hessian.client;     
  2.     
  3. import java.net.MalformedURLException;     
  4. import java.util.Map;     
  5.     
  6. import michael.hessian.HelloHessian;     
  7. import michael.hessian.MyCar;     
  8.     
  9. import com.caucho.hessian.client.HessianProxyFactory;     
  10.     
  11. /**    
  12.  * @author michael    
  13.  *    
  14.  */    
  15. public class HessianClientTest {     
  16.     
  17.     /**    
  18.      * @param args    
  19.      */    
  20.     public static void main(String[] args) {     
  21.         String url = "http://localhost:8082/J2EE_sjsky/HessianService";     
  22.         HessianProxyFactory factory = new HessianProxyFactory();     
  23.         try {     
  24.             HelloHessian hello = (HelloHessian) factory.create(     
  25.                     HelloHessian.class, url);     
  26.             System.out.println(hello.sayHello());     
  27.     
  28.             MyCar car = hello.getMyCar();     
  29.             System.out.println(car.toString());     
  30.     
  31.             for (Map.Entry<string, string> entry : hello.myBabays().entrySet()) {     
  32.                 System.out.println(entry.getKey() + "   " + entry.getValue());     
  33.             }     
  34.     
  35.             for (String str : hello.myLoveFruit()) {     
  36.                 System.out.println(str);     
  37.             }     
  38.     
  39.         } catch (MalformedURLException e) {     
  40.             e.printStackTrace();     
  41.         }     
  42.     
  43.     }     
  44.     
  45. }    

 

运行结果如下:

Java代码

 

 

  1. welcom to Hessian     
  2. my car name:[阿斯顿·马丁] model:[One-77].     
  3. daughter   孙小美     
  4. son   孙吴空     
  5. apple     
  6. kiwi     
  7. orange   

 

【二】、spring+hessian 实现服务端:

1.基本代码见上面的demo

2.修改配置文件

在web.xml,增加内容如下:

Xml代码

 

 

  1. <servlet>    
  2.         <servlet-name>springhessianservlet-name>    
  3.         <servlet-class>    
  4.             org.springframework.web.servlet.DispatcherServlet     
  5.         servlet-class>    
  6.             
  7.     <bean name="/helloHessianService"    
  8.         class="org.springframework.remoting.caucho.HessianServiceExporter">    
  9.             
  10.         <property name="service" ref="helloHessianImpl" />    
  11.             
  12.         <property name="serviceInterface"    
  13.             value="michael.hessian.HelloHessian" />    
  14.     bean>    
  15. beans>  

3.java客户端验证

和上面的例子相似,只需要把访问的url替换成新的即可如下:

Java代码

 

 

  1. String url=http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService   

 

运行结果和上面例子一样。

4.spring配置客户端

增加一个spring的bean配置文件hessian-client.xml

Xml代码

  1. xml version="1.0" encoding="UTF-8"?>    
  2. >    
  3. <beans>    
  4.     <bean id="helloHessianClient"    
  5.         class="org.springframework.remoting.caucho.HessianProxyFactoryBean">    
  6.         <property name="serviceUrl">    
  7.             <value>    
  8.                 http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService     
  9.             value>    
  10.         property>    
  11.         <property name="serviceInterface"    
  12.             value="michael.hessian.HelloHessian" />    
  13.     bean>    
  14. beans>    

测试代码HessianSpringClient.java:

Java代码

 

 

  1. package michael.hessian.client;     
  2.     
  3. import java.util.Map;     
  4.     
  5. import michael.hessian.HelloHessian;     
  6. import michael.hessian.MyCar;     
  7.     
  8. import org.springframework.context.ApplicationContext;     
  9. import org.springframework.context.support.ClassPathXmlApplicationContext;     
  10.     
  11. /**    
  12.  * @author michael    
  13.  *     
  14.  */    
  15. public class HessianSpringClient {     
  16.     
  17.     /**    
  18.      * @param args    
  19.      */    
  20.     public static void main(String[] args) {     
  21.         try {     
  22.             ApplicationContext context = new ClassPathXmlApplicationContext(     
  23.                     "hessian-client.xml");     
  24.     
  25.             HelloHessian hello = (HelloHessian) context     
  26.                     .getBean("helloHessianClient");     
  27.     
  28.             System.out.println(hello.sayHello());     
  29.     
  30.             MyCar car = hello.getMyCar();     
  31.             System.out.println(car.toString());     
  32.     
  33.             for (Map.Entry<string, string> entry : hello.myBabays().entrySet()) {     
  34.                 System.out.println(entry.getKey() + "   " + entry.getValue());     
  35.             }     
  36.     
  37.             for (String str : hello.myLoveFruit()) {     
  38.                 System.out.println(str);     
  39.             }     
  40.         } catch (Exception e) {     
  41.             e.printStackTrace();     
  42.         }     
  43.     
  44.     }     
  45.     
  46. }   

 

运行结果和上面完全一致。

5.com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d异常处理

我在spring+hessian整合测试过程中,客户端调用时,发生了异常,而服务端错误内容如下:

Java代码

  1. 2011-4-25 16:14:44 org.apache.catalina.core.StandardWrapperValve invoke     
  2. 严重: Servlet.service() for servlet remoting threw exception     
  3. com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d    
  4.     at com.caucho.hessian.io.Hessian2Input.error(Hessian2Input.java:2882)     
  5.     at com.caucho.hessian.io.Hessian2Input.expect(Hessian2Input.java:2830)     
  6.     at com.caucho.hessian.io.Hessian2Input.readString(Hessian2Input.java:1362)     
  7.     at com.caucho.hessian.io.Hessian2Input.readMethod(Hessian2Input.java:272)     
  8.     at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:249)     
  9.     at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:221)     
  10.     at org.springframework.remoting.caucho.Hessian2SkeletonInvoker.invoke(Hessian2SkeletonInvoker.java:67)     
  11.     at org.springframework.remoting.caucho.HessianServiceExporter.handleRequest(HessianServiceExporter.java:147)     
  12.     at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:49)     
  13.     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:819)     
  14.     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:754)     
  15.     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:399)     
  16.     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:364)     
  17.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)     
  18.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)     
  19.     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)     
  20.     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)     
  21.     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)     
  22.     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)     
  23.     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)     
  24.     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)     
  25.     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)     
  26.     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)     
  27.     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)     
  28.     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)     
  29.     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)     
  30.     at java.lang.Thread.run(Thread.java:619)   

经查资料发现原始是hessian和spring的版本不兼容引起的,重新下载hessian-3.1.6.jar导入项目,一起运行正常,测试完全通过。

原文出处:http://developer.51cto.com/art/201104/257498.htm

分享到:
评论

相关推荐

    基于spring+hessian框架的webservice实例

    在"基于spring+hessian框架的webservice实例"中,我们将看到如何结合Spring和Hessian来创建和消费Web服务。首先,我们需要创建一个服务接口和服务实现。这个接口定义了可供远程调用的方法,而实现则提供了具体的功能...

    基于WebService的Hessian例子教程

    【描述】提供的教程包含了服务器端和客户端的实例代码,这两个例子旨在帮助开发者快速理解和应用Hessian。它们非常直观,可以直接运行,无需复杂配置,从而让你对Hessian的工作原理有深刻的理解。 首先,我们来了解...

    spring 集成 hessian例子

    相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。参考文档地址为:http://blog.csdn.net/likunwen_001/article/details/78119765

    flex-hessian-java实例.rar

    ActionScript中,我们可以使用Flash Player的HTTPService或WebService类来实现Hessian调用,通过配置URL和方法名来连接到Hessian服务。 接着,我们来看看Java端。在Java服务器上,我们需要一个Hessian服务提供者,...

    Hessian的小例子

    这个小例子将带你了解如何在Java环境中实现Hessian服务的客户端和服务器端。让我们深入探讨Hessian的核心概念以及如何在实际项目中应用。 首先,Hessian的目标是提供一种简单、快速、跨语言的序列化和远程调用机制...

    多种webService的完整实例

    本教程将深入探讨三种常见的Web服务技术:REST、CXF以及Hessian,并结合Maven构建工具提供完整的实例。 首先,REST(Representational State Transfer)是一种基于HTTP协议的轻量级Web服务架构风格。它强调资源的...

    hessian入门实例,导入就可以直接运行

    Hessian是一种轻量级的RPC(远程过程调用)协议,它主要用于实现分布式服务之间的通信。这个"**hessian入门实例**"旨在帮助初学者快速理解并应用Hessian技术,通过导入到MyEclipse这样的集成开发环境中,可以直接...

    hessian实例 helloworld

    Hessian是一种高效的二进制RPC(Remote Procedure Call)协议,它比WebService更为简洁和快速。Hessian基于二进制格式,特别适合传输二进制数据,减少了网络传输的数据量,从而提高了通信效率。它通常被应用于Web...

    hessin+spring实例

    Hessian是一种轻量级的远程过程调用(RPC)协议,相比传统的WebService技术,Hessian提供了更简单且高效的方式来实现分布式应用间的通信。Hessian的核心优势在于其采用了二进制RPC协议(Binary RPC),这种协议相比于...

    spring基础功能分享ppt课件.ppt

    Spring Portlet MVC、Spring Web模块、远程调用、JAVA消息服务等模块也提供了广泛的功能,包括RMI、Hessian、Webservice等远程调用方式,和apache activeMQ、MuleESB、JbossMQ等JAVA消息服务。 在Spring的DI中,...

    hessian 在PHP中的使用介绍

    相比WebService,Hessian更加简洁快速,因为它采用的是二进制格式,对于传输二进制数据特别有利。Hessian是语言无关的,这意味着它可以被多种编程环境如Java、PHP等支持。 在PHP中使用Hessian,需要注意以下几点: ...

    hession实例

    Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单、快捷。 本例是个完整的小项目,有服务器端、有客户端,下载解压即可运行看效果。

    Dubbo学习文档

    同时也支持传统的RMI、Hessian、WebService等技术栈。 **服务动态发现**:在分布式环境中,服务实例可能会频繁上下线,因此需要一种机制来动态地管理和跟踪这些服务实例的状态。Dubbo支持通过Zookeeper或Redis等...

    京东SAF介绍

    - **多协议支持**:除了内置的RPC协议外,还支持Hessian、WebService、REST等多种协议。 - **容错机制**:具备Failover功能,在遇到服务调用失败时自动切换到其他Provider尝试重新调用。 - **负载均衡策略**:支持...

    dubbo源码解析

    4. Java RPC机制:Dubbo作为一个RPC框架,其底层实现涉及到Java的远程过程调用机制,包括但不限于RMI、Hessian、Thrift、WebService等。这些技术都涉及到网络通信和对象序列化等原理。 5. Java其他内容:文章指出,...

    Dubbo-RPC分布式服务框架.pptx

    Simple Registry:实现 AbstractRegistry 接口,参考例子只是简单实现,不支持集群,可作为自定义注册中心的参考,但不适合直接用于生产环境。 Dubbo 的通信协议 1. Dubbo – 基于 TCP 的 NIO 异步传输、单连接...

    Dubbo分布式服务框架入门1

    4. **协议(Protocol)**:Dubbo支持多种通信协议,如RMI、Hessian、HTTP、Webservice等,其中默认使用的是Dubbo协议,它是一种基于TCP的二进制协议,具有高效率和低延迟的特点。 5. **监控中心(Monitor)**:收集...

    史上最全40道Dubbo面试题!.zip

    主要有dubbo、http、hessian、rmi、webservice等,其中dubbo是Dubbo自定义的高性能协议。 9. **什么是服务版本化?** 通过服务版本号来区分不同版本的服务,便于服务升级和回滚。 10. **如何处理服务调用超时和...

    Flex整合spring

    开发者可以在配置文件中定义Bean的实例化、初始化、依赖关系等,Spring会根据配置自动创建和管理这些Bean。 2. **Flex客户端**:Flex是Adobe开发的用于构建富互联网应用(RIA)的开发工具,它的强项在于提供交互性...

    2023年1月最新dubbo面试题

    此外,Dubbo 支持多种协议,如 RMI、Http、Hessian、Dubbo、Webservice、Thrift 和 Memcached,这些协议在不同场景下各有优势。对于服务监控和统计,Dubbo 内置了监控中心,可以收集服务调用的性能数据,提供 QPS、...

Global site tag (gtag.js) - Google Analytics