转自:

http://lancui.iteye.com/blog/935578

简介

相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议(Binary),因为采用的是二进制协议,所以它很适合于发送二进制数据。Hessian通常通过Web应用来提供服务,因此非常类似于WebService。只是它不使用SOAP协议。 
Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,推荐采用面向接口编程,因此,Hessian服务建议通过接口暴露。 
Hessian处理过程示意图: 
客户端——>序列化写到输出流——>远程方法(服务器端)——>序列化写到输出流 ——>客户端读取输入流——>输出结果

环境搭建 
Hessian的下载和安装请按如下步骤进行: 
(1)登http://www.caucho.com/hessian/下载Hessian。 
(2)把Hessian相应的Jar包放到Web应用下,所有的jar文件都应该放在WEB-INF/lib下,该文件也不例外。 
两种方式 
纯Hessian 
这种方式主要是适用于工程中没有适用像spring框架的情况下,好处是配置方便,但是当内容多的情况下,配置的内容很多。 
下面我就把我在做实例的一些相关步骤描述如下: 
1:把Hessian相应jar包放入至工程中。 
2:由于Hessian是采用面向接口编程的,所以编写一个接口,因为客户端仅仅需要接口,而无须真实的实现类。 
package jzh.demo; 
public interface IHello { 
String sayHello(); 

3:编写一个类实现这个接口。 
package jzh.demo.impl; 
import jzh.demo.IHello; 
import com.caucho.hessian.server.HessianServlet; 
public class Hello extends HessianServlet implements IHello { 
public String sayHello() { 
return "Hello world"; 


4:web.xml的详细配置 
<servlet> 
<servlet-name>Hello</servlet-name> 
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> 
<init-param> 
<param-name>home-class</param-name> 
<param-value>jzh.demo.imple.Hello</param-value> 
</init-param> 
<init-param> 
<param-name>home-api</param-name> 
<param-value>jzh.demo.IHello</param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 
</servlet>

<servlet-mapping> 
<servlet-name>Hello</servlet-name> 
<url-pattern>/Hello</url-pattern> 
</servlet-mapping>

5:客户端远程调用服务器端提供的接口,利用的就是Hessian的HessianProxyFactory,来实现远程代理。 
1) 把服务器端的生成的jar包,放入工程中。 
2) 相应的片段程序如下: 
String url = "http://220.114.108.185:8080/Hessian/Hello"; 
HessianProxyFactory factory = new HessianProxyFactory(); 
try { 
IHello hello =(IHello)factory.create(IHello.class,url); 
System.out.println(hello.sayHello()); 
} catch (MalformedURLException e) { 
e.printStackTrace(); 

6:功能完成。

Hessian与Spring整合

相比上一种方式,这个方式就有点麻烦了。Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务,web.xml只是定义了“请求转发器”,该转发器将匹配/remoting/*的请求截获,转发给context的bean处理。而HessianServiceExporter提供bean服务。 
所以Hessian与Spring整合主要就是一下两个工作: 
1:通过DispatcherServlet来拦截URL请求。 
2:HessianServiceExporter提供bean服务,Spring使用HessianServiceExporter,将一个常规bean导出成Hessian服务。 
下面我就把我在做实例的一些相关步骤描述如下: 
1:和上面的一样。 
2:和上面的一样。 
3:和上面的一样。 
4:web.xml的详细配置 
<servlet> 
           <servlet-name>remoting</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
          <!-- 默认是加载WEB-INF/servlet-name+"-servlet.xml"文件,在这里可以配置为加载WEB-INF/classes/remoting-servlet.xml这个文件  -->

<init-param>
              <param-name>namespace</param-name>
              <param-value>classes/remoting-servlet</param-value>
          </init-param>
           <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
           <servlet-name>remoting</servlet-name> 
           <url-pattern>/remoting/*</url-pattern> 
</servlet-mapping> 
5:配置remoting-servlet.xml文件 
<!--  定义普通bean实例--> 
    <bean id="hello" class="jzh.demospring.impl.Hello"/> 
    <!--  使用HessianServiceExporter 将普通bean导出成Hessian服务--> 
    <bean name="/HessianRemoting" class="org.springframework.remoting.caucho.HessianServiceExporter"> 
           <!--  需要导出的目标bean--> 
           <property name="service" ref="hello"/> 
           <!--  Hessian服务的接口--> 
           <property name="serviceInterface" value="jzh.demospring.IHello"/> 
</bean> 
6:客户端定义一个remoting-client.xml文件 
<bean id="myServiceClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"> 
<property name="serviceUrl"> 
<value>http://220.114.99.62:8080/HessianSpring/remoteing/HessianRemoting</value> 
</property> 
<property name="serviceInterface"> 
<value>jzh.demospring.IHello</value> 
</property> 
</bean> 
7:客户端调用。 
try 
{                                                               
ApplicationContext context = new ClassPathXmlApplicationContext("remote-client.xml");

IHello hello =(IHello)context.getBean("myServiceClient");

System.out.println(hello.sayHello()); 

catch (Exception e) 

e.printStackTrace(); 

注意事项 
1:启动tomcat的时候,出现如下问题:java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet。,而在工程中是可以找到相应的jar文件,这究竟是什么问题。 
解决方法:可能是在工程的WEB-INF/lib下面没有加载相应的jar文件 
2:org.springframework.remoting.RemoteAccessException: Cannot access Hessian service at [http://61.152.162.173/remote/remoteService]; 
解决方法:出现这个异常一般是因为服务端操作出现异常引起的

发表时间:2008-08-13   谢谢,正在学习怎么搭建hessian服务,看了以后帮助很大!

发表时间:2008-08-19   我觉得RPC有两种方式,调用远程的方法: 
1、方法在远程执行,将操作结果传回给客户端。优点:服务器负荷小,传输数据量小,客户端无需知道服务器端定义的服务接口。缺点:需要对数据进行拼装解析等复杂操作。 
2、方法加载到客户端运行。优点:可以和缓存配合,每次运行只传输一次,可靠性高,有些方法没有返回值,只是进行例如print的打印语句能在客户端运行。缺点:传输数据大,客户端需要知道服务接口。

我猜想 
IHello hello =(IHello)factory.create(IHello.class,url); 
System.out.println(hello.sayHello()); 
它是第二种方式

发表时间:2008-08-29   其实,它采用的是第一种方式,是在远程执行,而非是你说的第二种

5:客户端远程调用服务器端提供的接口,利用的就是Hessian的HessianProxyFactory,来实现远程代理。
1) 把服务器端的生成的jar包,放入工程中。

Hessian Servlet和Hessian Spring的简单应用的更多相关文章

  1. 惊呆了,Servlet Filter和Spring MVC Interceptor的实现居然这么简单

    前言 创建型:单例模式,工厂模式,建造者模式,原型模式 结构型:桥接模式,代理模式,装饰器模式,适配器模式,门面模式,组合模式,享元模式 行为型:观察者模式,模板模式,策略模式,责任链模式,状态模式, ...

  2. Spring mvc 简单异常配置jsp页面

    原文出处:http://howtodoinjava.com/spring/spring-mvc/spring-mvc-simplemappingexceptionresolver-example/ 这 ...

  3. Spring mvc系列一之 Spring mvc简单配置

    Spring mvc系列一之 Spring mvc简单配置-引用 Spring MVC做为SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块 ...

  4. 玩转spring boot——简单登录认证

    前言 在一个web项目中,某些页面是可以匿名访问的,但有些页面则不能.spring mvc提供了HandlerInterceptor接口来应对,只需要重写preHandle方法便可以实现此功能.那么使 ...

  5. Spring MVC简单原理

    Spring MVC原理 针对有Java Web基础.Spring基础和Spring MVC使用经验者. 前言 目前基于Java的web后端,Spring生态应该是比较常见了.虽然现在流行前后端分离, ...

  6. Spring管理Filter和Servlet(在servlet中注入spring容器中的bean)

    在使用spring容器的web应用中,业务对象间的依赖关系都可以用context.xml文件来配置,并且由spring容器来负责依赖对象 的创建.如果要在servlet中使用spring容器管理业务对 ...

  7. spring security 简单入门

    spring security 简单入门示例 一.概述 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架 . 其中最主要的安全操作有两 ...

  8. Spring Boot简单操作

    目录 一.自定义异常页面 二.单元测试 ​三.多环境选择 四.读取主配置文件中的属性 五.读取List属性 一.自定义异常页面 对于404.405.500等异常状态,服务器会给出默认的异常页面,而这些 ...

  9. Spring cache简单使用guava cache

    Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...

随机推荐

  1. Python之路第六天,基础(7)-正则表达式(re)

    Python RE模块(正则表达式) 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成 ...

  2. Python即时网络爬虫项目: 内容提取器的定义

    1. 项目背景 在python 即时网络爬虫项目启动说明中我们讨论一个数字:程序员浪费在调测内容提取规则上的时间,从而我们发起了这个项目,把程序员从繁琐的调测规则中解放出来,投入到更高端的数据处理工作 ...

  3. 实现一个Memcpy函数:将源指针所指的区域从起始地址开始的n个字节复制到目的指针所指区域

    首先肯定要先看看这两部分是不是有内存重叠?为什么? 1.因为如果有内存重叠(目的地址起始位置处于源指针所指区域之中),你再从起始位置复制的话,这样目的地址改变的时候将源地址内存里面存的东西给改变了,所 ...

  4. docker 使用Data Volume 共享文件

    Adding a data volume You can add a data volume to a container using the -v flag with the docker run  ...

  5. Masstransit开发基于消息传递的分布式应用

    使用Masstransit开发基于消息传递的分布式应用 Masstransit作为.Net平台下的一款优秀的开源产品却没有得到应有的关注,这段时间有机会阅读了Masstransit的源码,我觉得我有必 ...

  6. MFC 遍历FTP服务器目录相关

    CInternetSession* pSession; pSession = new CInternetSession;  //构造新的连接 CFtpConnection* pFtpCon; pFtp ...

  7. 一个AVRUSB作品HID类

    最近为了HID类设备弄了半个把月.终于完成这个无线(红外)多媒体键盘,带鼠标功能.难就难在描述符上,不过在近4天的资料翻阅及多次的测试下,电脑不知道重启了多少次啊,的情况下 搞定了这个东西,大家可以看 ...

  8. ActiveX异步回调JavaScript

    ActiveX异步回调JavaScript 开发环境:VC6.0. 背景知识:COM/ActiveX/JavaScript/MFC/Thread 想必用过Ajax的童鞋们都知道xmlhttp这个东西吧 ...

  9. 【LeetCode练习题】Next Permutation

    Next Permutation Implement next permutation, which rearranges numbers into the lexicographically nex ...

  10. AspectJ教学

    这几天看JAVA基础看的有点头疼,决定时不时的换换口味,准备開始调研一些如今流行的技术,于是,開始埋头思考自己知识的盲区(当时,自己的知识盲区茫茫多...),想了几天后,决定要開始研究一下几种技术及实 ...