利用Hessian如何实现Webservice

[] [] [] 发布人:圣才学习网  发布日期:2012-08-18 14:02  共966人浏览
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. 1.           package michael.hessian;     
  1. 2.           import java.util.List;     
  1. 3.           import java.util.Map;     
  1. 4.               
  1. 5.           /**    
  1. 6.            * @author michael    
  1. 7.            *     
  1. 8.            */    
  1. 9.           public interface HelloHessian {     
  1. 10.           
  1. 11.           String sayHello();     
  1. 12.           
  1. 13.           MyCar getMyCar();     
  1. 14.           
  1. 15.           List myLoveFruit();     
  1. 16.           
  1. 17.           Map<STRING,&NBSP;STRING> myBabays();     
  1. 18.           
  1. 19.       }   
一个java bean文件MyCar.java:
Java代码
  1. 1.           package michael.hessian;     
  1. 2.               
  1. 3.           import java.io.Serializable;     
  1. 4.               
  1. 5.           /**    
  1. 6.            * @author michael    
  1. 7.            *     
  1. 8.            */    
  1. 9.           public class MyCar implements Serializable {     
  1. 10.           
  1. 11.           /**    
  1. 12.            *     
  1. 13.            */    
  1. 14.           private static final long serialVersionUID = 4736905401908455439L;     
  1. 15.           
  1. 16.           private String carName;     
  1. 17.           
  1. 18.           private String carModel;     
  1. 19.           
  1. 20.           /**    
  1. 21.            * @return the carName    
  1. 22.            */    
  1. 23.           public String getCarName() {     
  1. 24.               return carName;     
  1. 25.           }     
  1. 26.           
  1. 27.           /**    
  1. 28.            * @return the carModel    
  1. 29.            */    
  1. 30.           public String getCarModel() {     
  1. 31.               return carModel;     
  1. 32.           }     
  1. 33.           
  1. 34.           /**    
  1. 35.            * @param pCarName the carName to set    
  1. 36.            */    
  1. 37.           public void setCarName(String pCarName) {     
  1. 38.               carName = pCarName;     
  1. 39.           }     
  1. 40.           
  1. 41.           /**    
  1. 42.            * @param pCarModel the carModel to set    
  1. 43.            */    
  1. 44.           public void setCarModel(String pCarModel) {     
  1. 45.               carModel = pCarModel;     
  1. 46.           }     
  1. 47.           
  1. 48.           /**    
  1. 49.            * @see java.lang.Object#toString()    
  1. 50.            * @return    
  1. 51.            */    
  1. 52.           @Override    
  1. 53.           public String toString() {     
  1. 54.               return "my car name:[" + this.carName + "] model:[" + this.carModel     
  1. 55.                       + "].";     
  1. 56.           }     
  1. 57.           
  1. 58.       }   
服务端接口的实现类:HelloHessianImpl.java
Java代码
  1. 1.           package michael.hessian.impl;     
  1. 2.               
  1. 3.           import java.util.ArrayList;     
  1. 4.           import java.util.HashMap;     
  1. 5.           import java.util.List;     
  1. 6.           import java.util.Map;     
  1. 7.               
  1. 8.           import michael.hessian.HelloHessian;     
  1. 9.           import michael.hessian.MyCar;     
  1. 10.           
  1. 11.       /**    
  1. 12.        * @author michael    
  1. 13.        *     
  1. 14.        */    
  1. 15.       public class HelloHessianImpl extends HessianServlet implements HelloHessian {     
  1. 16.           
  1. 17.           public MyCar getMyCar() {     
  1. 18.               MyCar car = new MyCar();     
  1. 19.               car.setCarName("阿斯顿·马丁");     
  1. 20.               car.setCarModel("One-77");     
  1. 21.               return car;     
  1. 22.           }     
  1. 23.           
  1. 24.           public Map<STRING,&NBSP;STRING> myBabays() {     
  1. 25.               Map<STRING,&NBSP;STRING> map = new HashMap<STRING,&NBSP;STRING>();     
  1. 26.               map.put("son", "孙吴空");     
  1. 27.               map.put("daughter", "孙小美");     
  1. 28.               return map;     
  1. 29.           }     
  1. 30.           
  1. 31.           public List myLoveFruit() {     
  1. 32.               List list = new ArrayList();     
  1. 33.               list.add("apple");     
  1. 34.               list.add("kiwi");     
  1. 35.               list.add("orange");     
  1. 36.               return list;     
  1. 37.           }     
  1. 38.           
  1. 39.           public String sayHello() {     
  1. 40.               return "welcom to Hessian";     
  1. 41.           }     
  1. 42.           
  1. 43.       }   
2.配置文件web.xml修改
在web.xml配置文件里增加如下信息:
Xml代码
  1. 1.           <servlet>    
  1. 2.                   <servlet-name>HelloHessian</< span>servlet-name>    
  1. 3.                   <servlet-class>    
  1. 4.                       com.caucho.hessian.server.HessianServlet     
  1. 5.                   </< span>servlet-class>    
  1. 6.                   <init-param>    
  1. 7.                       <param-name>home-class</< span>param-name>    
  1. 8.                       <param-value>michael.hessian.impl.HelloHessianImpl</< span>param-value>    
  1. 9.                   </< span>init-param>    
  1. 10.               <init-param>    
  1. 11.                   <param-name>home-api</< span>param-name>    
  1. 12.                   <param-value>michael.hessian.HelloHessian</< span>param-value>    
  1. 13.               </< span>init-param>    
  1. 14.               <load-on-startup>1</< span>load-on-startup>    
  1. 15.           </< span>servlet>    
  1. 16.           <servlet-mapping>    
  1. 17.               <servlet-name>HelloHessian</< span>servlet-name>    
  1. 18.               <url-pattern>/HessianService</< span>url-pattern>    
  1. 19.           </< span>servlet-mapping>    
  1. 20.           <servlet-mapping>    
3.java客户端验证
Java代码
  1. 1.           package michael.hessian.client;     
  1. 2.               
  1. 3.           import java.net.MalformedURLException;     
  1. 4.           import java.util.Map;     
  1. 5.               
  1. 6.           import michael.hessian.HelloHessian;     
  1. 7.           import michael.hessian.MyCar;     
  1. 8.               
  1. 9.           import com.caucho.hessian.client.HessianProxyFactory;     
  1. 10.           
  1. 11.       /**    
  1. 12.        * @author michael    
  1. 13.        *    
  1. 14.        */    
  1. 15.       public class HessianClientTest {     
  1. 16.           
  1. 17.           /**    
  1. 18.            * @param args    
  1. 19.            */    
  1. 20.           public static void main(String[] args) {     
  1. 21.               String url = "http://localhost:8082/J2EE_sjsky/HessianService";     
  1. 22.               HessianProxyFactory factory = new HessianProxyFactory();     
  1. 23.               try {     
  1. 24.                   HelloHessian hello = (HelloHessian) factory.create(     
  1. 25.                           HelloHessian.class, url);     
  1. 26.                   System.out.println(hello.sayHello());     
  1. 27.           
  1. 28.                   MyCar car = hello.getMyCar();     
  1. 29.                   System.out.println(car.toString());     
  1. 30.           
  1. 31.                   for (Map.Entry<STRING,&NBSP;STRING> entry : hello.myBabays().entrySet()) {     
  1. 32.                       System.out.println(entry.getKey() + "   " + entry.getValue());     
  1. 33.                   }     
  1. 34.           
  1. 35.                   for (String str : hello.myLoveFruit()) {     
  1. 36.                       System.out.println(str);     
  1. 37.                   }     
  1. 38.           
  1. 39.               } catch (MalformedURLException e) {     
  1. 40.                   e.printStackTrace();     
  1. 41.               }     
  1. 42.           
  1. 43.           }     
  1. 44.           
  1. 45.       }    
运行结果如下:
Java代码
  1. 1.           welcom to Hessian     
  1. 2.           my car name:[阿斯顿·马丁] model:[One-77].     
  1. 3.           daughter   孙小美     
  1. 4.           son   孙吴空     
  1. 5.           apple     
  1. 6.           kiwi     
  1. 7.           orange   
【二】、spring+hessian 实现服务端:
1.基本代码见上面的demo
2.修改配置文件
在web.xml,增加内容如下:
Xml代码
  1. 1.           <servlet>    
  1. 2.                   <servlet-name>springhessian</< span>servlet-name>    
  1. 3.                   <servlet-class>    
  1. 4.                       org.springframework.web.servlet.DispatcherServlet     
  1. 5.                   </< span>servlet-class>    
  1. 6.                       
  1. 7.               <bean name="/helloHessianService"    
  1. 8.                   class="org.springframework.remoting.caucho.HessianServiceExporter">    
  1. 9.                       
  1. 10.               <property name="service" ref="helloHessianImpl" />    
  1. 11.                   
  1. 12.               <property name="serviceInterface"    
  1. 13.                   value="michael.hessian.HelloHessian" />    
  1. 14.           </< span>bean>    
  1. 15.       </< span>beans>  
3.java客户端验证
和上面的例子相似,只需要把访问的url替换成新的即可如下:
Java代码
  1. 1.           String url=http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService   
运行结果和上面例子一样。
4.spring配置客户端
增加一个spring的bean配置文件hessian-client.xml
Xml代码
  1. 1.           <?xml version="1.0" encoding="UTF-8"?>    
  1. 2.           >    
  1. 3.           <beans>    
  1. 4.               <bean id="helloHessianClient"    
  1. 5.                   class="org.springframework.remoting.caucho.HessianProxyFactoryBean">    
  1. 6.                   <property name="serviceUrl">    
  1. 7.                       <value>    
  1. 8.                           http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService     
  1. 9.                       </< span>value>    
  1. 10.               </< span>property>    
  1. 11.               <property name="serviceInterface"    
  1. 12.                   value="michael.hessian.HelloHessian" />    
  1. 13.           </< span>bean>    
  1. 14.       </< span>beans>    
测试代码HessianSpringClient.java:
Java代码
  1. 1.           package michael.hessian.client;     
  1. 2.               
  1. 3.           import java.util.Map;     
  1. 4.               
  1. 5.           import michael.hessian.HelloHessian;     
  1. 6.           import michael.hessian.MyCar;     
  1. 7.               
  1. 8.           import org.springframework.context.ApplicationContext;     
  1. 9.           import org.springframework.context.support.ClassPathXmlApplicationContext;     
  1. 10.           
  1. 11.       /**    
  1. 12.        * @author michael    
  1. 13.        *     
  1. 14.        */    
  1. 15.       public class HessianSpringClient {     
  1. 16.           
  1. 17.           /**    
  1. 18.            * @param args    
  1. 19.            */    
  1. 20.           public static void main(String[] args) {     
  1. 21.               try {     
  1. 22.                   ApplicationContext context = new ClassPathXmlApplicationContext(     
  1. 23.                           "hessian-client.xml");     
  1. 24.           
  1. 25.                   HelloHessian hello = (HelloHessian) context     
  1. 26.                           .getBean("helloHessianClient");     
  1. 27.           
  1. 28.                   System.out.println(hello.sayHello());     
  1. 29.           
  1. 30.                   MyCar car = hello.getMyCar();     
  1. 31.                   System.out.println(car.toString());     
  1. 32.           
  1. 33.                   for (Map.Entry<STRING,&NBSP;STRING> entry : hello.myBabays().entrySet()) {     
  1. 34.                       System.out.println(entry.getKey() + "   " + entry.getValue());     
  1. 35.                   }     
  1. 36.           
  1. 37.                   for (String str : hello.myLoveFruit()) {     
  1. 38.                       System.out.println(str);     
  1. 39.                   }     
  1. 40.               } catch (Exception e) {     
  1. 41.                   e.printStackTrace();     
  1. 42.               }     
  1. 43.           
  1. 44.           }     
  1. 45.           
  1. 46.       }   
运行结果和上面完全一致。
5.com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d异常处理
我在spring+hessian整合测试过程中,客户端调用时,发生了异常,而服务端错误内容如下:
Java代码
  1. 1.           -- :: org.apache.catalina.core.StandardWrapperValve invoke     
  1. 2.           严重: Servlet.service() for servlet remoting threw exception     
  1. 3.           com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d    
  1. 4.               at com.caucho.hessian.io.Hessian2Input.error(Hessian2Input.java:)     
  1. 5.               at com.caucho.hessian.io.Hessian2Input.expect(Hessian2Input.java:)     
  1. 6.               at com.caucho.hessian.io.Hessian2Input.readString(Hessian2Input.java:)     
  1. 7.               at com.caucho.hessian.io.Hessian2Input.readMethod(Hessian2Input.java:)     
  1. 8.               at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:)     
  1. 9.               at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:)     
  1. 10.           at org.springframework.remoting.caucho.Hessian2SkeletonInvoker.invoke(Hessian2SkeletonInvoker.java:)     
  1. 11.           at org.springframework.remoting.caucho.HessianServiceExporter.handleRequest(HessianServiceExporter.java:)     
  1. 12.           at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:)     
  1. 13.           at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:)     
  1. 14.           at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:)     
  1. 15.           at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:)     
  1. 16.           at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:)     
  1. 17.           at javax.servlet.http.HttpServlet.service(HttpServlet.java:)     
  1. 18.           at javax.servlet.http.HttpServlet.service(HttpServlet.java:)     
  1. 19.           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:)     
  1. 20.           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:)     
  1. 21.           at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:)     
  1. 22.           at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:)     
  1. 23.           at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:)     
  1. 24.           at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:)     
  1. 25.           at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:)     
  1. 26.           at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:)     
  1. 27.           at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:)     
  1. 28.           at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:)     
  1. 29.           at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:)     
  1. 30.           at java.lang.Thread.run(Thread.java:)   
 

利用Hessian如何实现Webservice的更多相关文章

  1. 解析利用wsdl.exe生成webservice代理类的详解

    利用wsdl.exe生成webservice代理类:根据提供的wsdl生成webservice代理类1.开始->程序->Visual Studio 2005 命令提示2.输入如下红色标记部 ...

  2. 第二篇:利用shell脚本执行webservice请求——基于soap

    1. 项目背景 以往我们在开发基于webservice的项目中,我们总习惯于直接使用webservice的一些框架,如Axis,axis2和Xfire等.框架的好处是将webservice所涉及到的s ...

  3. 利用JavaScriptSOAPClient直接调用webService --完整的前后台配置与调用示例

    JavaScriptSoapClient下载地址:https://archive.codeplex.com/?p=javascriptsoapclient JavaScriptSoapClient的D ...

  4. 利用CXF框架开发webservice

    开发服务端代码 1. web.xml文件中添加cxf的servlet 2. 定义接口 @WebService(targetNamespace="http://UserInfo.ws.com& ...

  5. svc6 控制台程序利用SoapToolkit3.0调用WebService

    1. 首先要安装SoapToolkit3.0安装包并安装(我的安装目录为:C:\Program Files\Common Files) 2. 新建vc控制台程序(空项目),项目名称:WinConsol ...

  6. 在PHP中利用wsdl创建标准webservice

    参照整理: http://bbs.php100.com/read-htm-tid-95228.html http://www.ieliwb.com/wsdl-create-soapdiscovery/ ...

  7. 利用wsdl2java工具生成webservice的客户端代码

    1.JDK环境  2.下载apache-cxf发布包:http://cxf.apache.org/download.html 目前最新版本为3.2.6, 解压后如下: 解压发布包,设置CXF_HOME ...

  8. 利用MyEclipse开发一个webservice接口

    一直以来对于接口这个东西都很好奇,各种客户也一直在说那个什么什么数据我们提供给你们一个接口就好了,结果还是不是很明白.于是乎就有了下面的小故事,接下来我们就进入正文吧 ---大概可以分为这样的步骤 1 ...

  9. cxf利用接口规范写法发布webservice

    package cn.itcast.cxf; import javax.jws.WebService; @WebService public interface IHelloService { pub ...

随机推荐

  1. 团队开发(NABC)

    特点:这是一个手机软件,能通过通讯录录入生日信息 N(Need需求):现在在交际圈中需要记住越来越多朋友的生日信息 A(Approach做法):由一个简单的闹钟为基础,添加与生日相关的功能,最终实现 ...

  2. 团队作业(NABC的分析)

    我们的团队课题是游戏:躲避小球. 我认为它其中的一个优点是:丰富用户的短暂闲暇时间,使用户得到身心的放松 下面我将从N,A,B,C四个方面简述理由 N(需求):现代社会逐渐步入快节奏时代,大众生活压力 ...

  3. 【转载】openldap 备份与导入 及相关问题--扩展

    http://www.cnblogs.com/ccdc/p/3356518.html 摘要: 对openldap进行备份时,直接使用slapcat命令进行备份,使用ldapadd还原出现问题及解决. ...

  4. Java令牌生成器

    package Token; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; im ...

  5. android开发 两张bitmap图片合成一张图片

    场景:对android4.4解码gif(解码文章见前面一篇)后的图片进行每帧处理,android4.3 解码出来的每帧都很完整,但是到android4.4版本就不完整了,每帧都是在第一帧的基础上把被改 ...

  6. UIKit 框架之UISearchController

    // // tableViewController.m // searchController // // Created by City--Online on 15/6/1. // Copyrigh ...

  7. hadoop学习日志

    Hadoop思想之源:Google 面对的数据和计算难题 ——大量的网页怎么存储 ——搜索算法 带给我们的关键技术和思想 ——GFS ——Map-Reduce ——Bigtable Hadoop创始人 ...

  8. 【BZOJ】【1293】【SCOI2009】生日礼物

    二分/堆 求一个最小的区间使得包含所有的颜色(并不一定只出现一次)$n\leq 10^6$ 我想的做法是:二分这个最小的长度(满足单调性……好久才想到QAQ),然后O(n)判断是否有可行的区间,这一步 ...

  9. 【BZOJ】【2049】【SDOI2008】洞穴勘测 Cave

    LCT 哦……LCT的一道更水的裸题,适合学习access,link,cut等基本操作(其实这三个不是在一个层面上的?不要在意这些细节……) /**************************** ...

  10. iis7/7.5设置上传文件最大大小

    本编今天接到一个客户的修改,说一个68M的pdf文件上传不上去,但是我本地开启断点调试了好几遍,都没有问题,能正常上传文件,由此确定不是代码问题.然后我试着上传5M左右的pdf却能正常的上传,然后上传 ...