Hessian与Spring的整合
编程技术  /  houtizong 发布于 3年前   62
一、概述
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据, Hessian主要用作面向对象的消息通信,Hessian的初衷是支持动态类型,格式紧凑,跨语言。
二、几种Remoting实现的比较
Spring支持的Remoting实现技术是非常多的,虽然Spring屏蔽了这些技术使用上的差异,但是选择一个合适的Remoting技术仍然对系统有非常积极的作用,下面就来讲述这些实现技术的优缺点。
(1) RMI:RMI使用Java的序列化机制实现调用及返回值的编组(marshal)与反编组(unmarshal),可以使用任何可序列化的对象作为参数和返回值。其缺点是RMI只能通过RMI协议来进行访问,无法通过HTTP协议访问,无法穿透防火墙。
(2) Hessian:Hessian也是将网络传输的对象转换为二进制流通过Http进行传递,不过它是使用自己的序列化机制实现的编组与反编组,其支持的数据类型是有限制的,不支持复杂的对象。Hessian的优点是可以透过防火墙。
(3) Burlap:Burlap是将网络传输的对象转换为XML文本格式通过Http进行传递,支持的对象与Hessian相比更少。XML一般比二进制流占用空间大,在网络上传递所需要的时间比二进制流长,XML的解析过程也会耗用更多的内存。Burlap可以穿透防火墙,而且由于传输的格式是XML文本,可以与其他系统(比如.NET)集成,从某种程度来讲,Burlap是一种不标准的WebService。
(4) HttpInvoker:HttpInvoker将参数和返回值通过Java的序列化机制进行编组和反编组,它具有RMI的支持所有可序列化对象的优点。 Http Invoker是使用Http协议传输二进制流的,而同时又具有Hessian、Burlap的优点。
三、Hessian与Burlap比较
Hessian和Burlap是两个由Caucho技术提供的解决方案。它们允许轻量级的HTTP远程服务,Hessian和Burlap都是基于HTTP的,所以它们不会存在防火墙的问题,尽可能地保持API和通讯协议的简化从而达到简化web service的目的。
虽然Hessian和Burlap都旨在解决同一问题,但它们还是有一些不同。Hessian和RMI一样都是用二进制消息进行C/S通讯,但是和RMI不同的是它所使用的二进制消息可以移植到包括PHP,Python,C++和C#在内的语言平台上。当然,Java不行。另一方面,Burlap是基于XML的远程技术,它可以自动地移植到能够解析XML的任何语言上,而且它比Hessian更加易读。但和其他基于XML的远程技术(SOAP或XML-RPC)不同,Burlap的消息结构非常简单而且不需要一个外部的定义语言(WSDL或IDL)。
Hessian和Burlap都是轻量级的,每一个都是84k的jar文件,而且不需要除JRE外的任何库依赖。非常适于在有内存限制的环境中使用,例如Applet或手提设备上。
在绝大多数情况下,Hessian和Burlap是一样的,唯一的不同在于Hessian消息是二进制的,Burlap消息是XML格式的。Hessian的优势在于可以获得更多的带宽。如果你更在于可读性(便于调试),Burlap的XML就更适合你。
四、Hessian需要注意的几个问题
1、JAVA服务器端必须具备以下几点:
·包含Hessian的jar包
·设计一个接口,用来给客户端调用
·实现该接口的功能
·配置web.xml,配好相应的servlet
·对象必须实现Serializable 接口
·对于复杂对象可以使用Map的方法传递
.对象最好有自己的序列表ID。
2、客户端必须具备以下几点:
·java客户端包含Hessian.jar的包
·具有和服务器端结构一样的接口和实体类。
包括命名空间都最好一样 ·利用HessianProxyFactory调用远程接口。
五、服务器的配置
1、在web.xml中定义Spring的调试分配器:
<!-- 自动装配ApplicationContext的配置信息 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
</param-value>
</context-param>
<servlet>
<servlet-name>hessian</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/hessian/hessian-servlet.xml
</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hessian</servlet-name>
<url-pattern>/hessian/*</url-pattern>
</servlet-mapping>
2、applicationContext.xml里的配置
<bean id="userDaoImpl" class="demo.dao.impl.UserDaoImpl"></bean>
<bean id="userServiceImpl" class="demo.service.impl.UserServiceImpl">
<property name="userDao" ref="userDaoImpl"></property>
</bean>
3、hessian-servlet.xml里的配置
<bean name="/userService" class="org.springframework.remoting.caucho.HessianServiceExporter">
<!-- 定义业务接口 -->
<property name="service" ref="userServiceImpl" />
<!-- 定义服务接口 -->
<property name="serviceInterface" value="demo.service.IUserService" />
</bean>
4、配置完成后,运行工程,访问http://localhost:8888/HessianWeb/hessian/userService,如果页面提示405,则表示配置成功。
六、Java的客户端的调用:
1、客户端要求具有和服务器端结构一样的接口和实体类,一般的做法是将服务器端的接口和实体类打成jar包,客户端直接引用jar包。
2、客户端调用类的写法:
String url = "http://localhost:8888/HessianWeb/hessian/userService";
HessianProxyFactory factory = new HessianProxyFactory();
IUserService userService = null;
try {
userService = (IUserService) factory.create(IUserService.class, url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
System.out.println("无参数: "+userService.getUserName());
System.out.println("有参数: "+userService.getUser(1,"niuwanxiang").getUserName());
转自:http://hi.baidu.com/niuwan_xiang/blog/item/d7d157951376ec90a877a40d.html
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接