转自:

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. Jquery一个slideToggle搞定div的隐藏与显示

    Jquery一个slideToggle搞定div的隐藏与显示 <!DOCTYPE html> <html> <head> <script src=" ...

  2. 新版703n刷openwrt

    自带的官方固件: 3.17.1 Build 140120 Rel.56593n WR703N v1 00000000 在不能web页面刷固件,因为带了校验功能. 老外给出了不上TTL刷路由的方法: h ...

  3. nginx 日志格式

    log_format main '$http_host $server_addr $remote_addr [$time_local] "$request" ' '$request ...

  4. linux 用户空间获得纳秒级时间ns

    一.引言 我们在测试程序的性能的时候往往需要获得ns级的精确时间去衡量一个程序的性能,下面介绍下linux中用户空间获得ns级时间的方法 二.用户空间获得ns级时间 使用clock_gettime函数 ...

  5. Segment FRAM_DATA must be defined in a segment definition option (-Z, -b or -P)

    1. 网上说这个回答是 协议栈和IAR版本号不一样,这算什么神马问题 2. 网上的解决的方法是改动 options-> link -> config -> 改动里面的连接文件,可是怎 ...

  6. Eclipse中更改默认java代码格式【转】

    在写代码时常常有2种代码样式习惯,如下图.由于一直习惯了第一种代码格式,而看第二种代码格式时感觉代码很乱,总找不到“{ }”对称的感觉.Eclipse自动格式化代码的快捷方式是Ctrl+Shift+F ...

  7. Hortonworks HDP Sandbox定制(配置)开机启动服务(组件)

    定制Hortonworks HDP开机启动服务能够这样做:本文原文出处: http://blog.csdn.net/bluishglc/article/details/42109253 严禁不论什么形 ...

  8. Android 查看通讯录Contacts是否发生变化

    目的:确定通讯录是否发生变化 根据:參见ContactsContract.RawContacts类中的VERSION常量,该值是仅仅读的,当通讯录发生变化时,都会使该值变化 方法:version值是相 ...

  9. 关于 HTML5 的 11 个让人难以接受的事实

    HTML5为Web开发者提供了很多强大的新特性,但是它的一些特定的限制会让它无法和本地应用匹敌. HTML5整合进了很多新的特性,并且有可能提升Web编程模式.和每一个阅读技术资讯的人所知道的一样,没 ...

  10. 基本文件的I/O

    System.IO命名空间包含允许在数据流和文件上进行同步,异步及写入的类型.文件是一些永久存储及具有特定顺序的字节组成的一个有序的,具有名称的集合.与文件有关的概念是目录路径和磁盘存储等.流提供了一 ...