Spring集成Hessian1
Hessian是一个轻量级的远程调用工具,采用的是Binary RPC协议,很适合于发送二进制数据,基于HTTP具有防火墙穿透能力。Hessian一般是通过Web应用来提供服务,因此非常类似于平时我们用的Web Service。只是它不使用SOAP协议,但相比Web Service而言更简单、快捷。
Burlap与Hessian相似,只是Burlap传输的将是XML而不是二进制的数据。
RMI很难穿越防火墙,2端都必须基于Java开发,传输对象时还需要考虑对象版本的问题。而Burlap与Hessian是基于HTTP的,很容易穿越防火墙,而且客户端不仅限于Java。Burlap与Hessian用的是私有的对象序列化机制,比起RMI来效率是较低的,RMI用的是Java的序列化机制。
Spring还提供了一种RPC机制—HTTP invoker,基于HTTP传输,使用的又是Java的对象序列化机制。
1. Hessian框架JAR包下载
从http://hessian.caucho.com/上下载所需的JAR包,这里下载的是hessian-4.0.37.jar。hessian的jar包是非常的小。
特别需要注意的是:hessian-4.0.37.jar不仅要放到工程依赖的jar包中,还要放在web-inf下的lib目录下,否则会报错:
NoClassDefFoundError: com/caucho/hessian/io/HessianDebugInputStream
2.服务器端环境搭建
2.1和RMI一样,需要先定义一个接口:
package com.hessian.isay; public interface Isay {
public String sayHello(String arg1,String arg2);
public String getObjectMessage(Object object);
}
2.2再编写一个具体的实现类:

package com.hessian.isay; public class IsayImpl implements Isay {
public String sayHello(String arg1, String arg2) {
return "Hello:" + arg1 + arg2;
}
@Override
public String getObjectMessage(Object object) {
if(object instanceof HessianTestObject){
return "server react :" + ((HessianTestObject) object).getMessage();
}
return "";
}
}

2.3 创建一个对象,证明可以传输对象

package com.hessian.isay;
import java.io.Serializable;
public class HessianTestObject implements Serializable{
private static final long serialVersionUID = -6273473338054054934L;
private String message;
public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
}
}

2.4配置web.xml,加上下面的代码:

<servlet>
<description>spring mvc servlet</description>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
<init-param>
<description>spring mvc 配置文件</description>
<param-name>contextConfigLocation</param-name>
<param-value> classpath:springMvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

这里需要注意的是,DispatcherServlet的servlet-name是springMvc,所以需要新建一个名为springMvc-servlet.xml的文件。tomcat在启动时将会去加载这个文件。
2.5 创建springMvc-servlet.xml文件

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 接口的具体实现类 -->
<bean id="impl" class="com.hessian.isay.IsayImpl" />
<!-- 使用Spring的HessianService做代理 -->
<bean name="/helloSpring.do"
class="org.springframework.remoting.caucho.HessianServiceExporter">
<!-- service引用具体的实现实体Bean-->
<property name="service" ref="impl" />
<property name="serviceInterface" value="com.hessian.isay.Isay" />
</bean> <!-- 可以配置多个HessianServiceExporter代理Bean -->
</beans>

启动tomcat服务器,如果没报异常,则说明服务器端的环境搭建完成了。
3.客户端环境搭建
客户端需要的是hessian-4.0.37.jar,HessianTestObject,Isay和NormalClient(或者SpringClient)。
3.1 不依赖于Spring的方式调用
编写测试类如下:

import java.net.MalformedURLException;
import com.caucho.hessian.client.HessianProxyFactory;
import com.hessian.isay.Isay; public class NormalClient {
public static void main(String[] args) throws MalformedURLException {
//Spring Hessian代理Servelet
String url = "http://localhost:8080/ssm/helloSpring.do";
HessianProxyFactory factory = new HessianProxyFactory();
Isay api = (Isay) factory.create(Isay.class, url); System.out.println(api.sayHello("hello", " spring")); HessianTestObject object = new HessianTestObject();
object.setMessage("message from object");
System.out.println(api.getObjectMessage(object));
}
}

3.2 依赖于Spring的实现
先编写xml文件hessian_client.xml,完成bean的定义:

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 客户端Hessian代理工厂Bean -->
<bean id="clientSpring" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<!-- 请求代理Servlet路径 -->
<property name="serviceUrl">
<value>http://localhost:8080/ssm/helloSpring.do</value>
</property>
<!-- 接口定义 -->
<property name="serviceInterface">
<value>com.hessian.isay.Isay</value>
</property>
</bean>
</beans>

上面直接写死url的方式不是很好,写成如下方式更为灵活:http://${serverName}:${httpPort}/${serverPath}/${contextPath}。
再编写测试代码,如下:

package com.hessian.test; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.hessian.isay.Isay; public class SpringClient {
public static void main(String[] args) {
ApplicationContext contex = new ClassPathXmlApplicationContext(
"hessian_client.xml"); // 获得客户端的Hessian代理工厂bean
Isay i = (Isay) contex.getBean("clientSpring");
System.out.println(i.sayHello("hello", " spring"));
HessianTestObject object = new HessianTestObject();
object.setMessage("message from object");
System.out.println(i.getObjectMessage(object));
}
}

Burlap的环境搭建与Hessian很类似,需要的也是hessian-4.0.37.jar。
需要有2处需要更改:
一是将步骤2.5中的配置文件配置如下即可:

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 接口的具体实现类 -->
<bean id="impl" class="com.hessian.isay.IsayImpl" />
<!-- 使用Spring的HessianService做代理 ,service引用具体的实现实体Bean-->
<!-- <bean name="/helloSpring.do" class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service" ref="impl" />
<property name="serviceInterface" value="com.hessian.isay.Isay" />
</bean> --> <bean name="/helloSpring.do" class="org.springframework.remoting.caucho.BurlapServiceExporter">
<property name="service" ref="impl" />
<property name="serviceInterface" value="com.hessian.isay.Isay" />
</bean>
<!-- 可以配置多个HessianServiceExporter代理Bean -->
</beans>

二是将3.2中的配置文件改为:

<bean id="clientSpring" class="org.springframework.remoting.caucho.BurlapProxyFactoryBean">
<!-- 请求代理Servlet路径 -->
<property name="serviceUrl">
<value>http://localhost:8080/ssm/helloSpring.do</value>
</property>
<!-- 接口定义 -->
<property name="serviceInterface">
<value>com.hessian.isay.Isay</value>
</property>
</bean>

Spring自带的HttpInvoker基于Http,而且使用Java自带的序列化。配置和Hessian基本的一样,也只需要该2处地方。
使用HttpInvoker的缺点是必须使用Spring和必须基于Java。
一是将步骤2.5中的配置文件配置如下即可:
<bean name="/helloSpring.do" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="impl" />
<property name="serviceInterface" value="com.hessian.isay.Isay" />
</bean>
二是将3.2中的配置文件改为:

<bean id="clientSpring" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl">
<value>http://localhost:8080/ssm/helloSpring.do</value>
</property> <property name="serviceInterface">
<value>com.hessian.isay.Isay</value>
</property>
</bean>

Spring集成Hessian1的更多相关文章
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)
Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...
- 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)
你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ...
- 【转】Dubbo使用例子并且和Spring集成使用
一.编写客户端和服务器端共用接口类1.登录接口类public interface LoginService { public User login(String name, String psw ...
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)
硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...
- axis2+spring集成
转载自:http://www.cnblogs.com/linjiqin/archive/2011/07/05/2098316.html 1.新建一个web project项目,最终工程目录如下: 注意 ...
- rabbitMQ第五篇:Spring集成RabbitMQ
前面几篇讲解了如何使用rabbitMq,这一篇主要讲解spring集成rabbitmq. 首先引入配置文件org.springframework.amqp,如下 <dependency> ...
- 从零开始学 Java - Spring 集成 ActiveMQ 配置(二)
从上一篇开始说起 上一篇从零开始学 Java - Spring 集成 ActiveMQ 配置(一)文章中讲了我关于消息队列的思考过程,现在这一篇会讲到 ActivMQ 与 Spring 框架的整合配置 ...
- spring集成常用技术的配置
使用spring集成其他技术,最基本的配置都是模板化的,比如配置视图模板引擎.数据库连接池.orm框架.缓存服务.邮件服务.rpc调用等,以spring的xml配置为例,我将这些配置过程整理出来,并不 ...
- Activiti工作流学习(三)Activiti工作流与spring集成
一.前言 前面Activiti工作流的学习,说明了Activiti的基本应用,在我们开发中可以根据实际的业务参考Activiti的API去更好的理解以及巩固.我们实际的开发中我们基本上都使用sprin ...
随机推荐
- 通过游戏学python 3.6 第一季 第四章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释 可复制直接使用 娱乐 可封装 函数
#猜数字--核心代码--猜测次数--随机函数和屏蔽错误代码---优化代码及注释 #!usr/bin/env python #-*-coding:utf-8-*- #QQ124111294 import ...
- JS random函数深入理解(转载)
转载自:(本文对读者有帮助的话请移步支持原作者) http://www.cnblogs.com/starof/p/4988516.html 一.预备知识 Math.ceil(); //向上取整. M ...
- 学习写Js的动画
说起前端,要说动画是最有乐子的东西了.玩好动画一定会很轻易的享受到前端的乐趣. 这里我不会讲述什么css3 的 transform animation keyframes,也不会讲述jquery的an ...
- UOJ#422. 【集训队作业2018】小Z的礼物
#422. [集训队作业2018]小Z的礼物 min-max容斥 转化为每个集合最早被染色的期望时间 如果有x个选择可以染色,那么期望时间就是((n-1)*m+(m-1)*n))/x 但是x会变,中途 ...
- IDEA设置谷歌浏览器和火狐浏览器打开
我们在软件的功能栏中选择file,然后使用鼠标点击settings,进入到软件的详细设置界面 进入后,我们可以看到很多设置项,然后我们使用鼠标依次点击左侧的tools和web browsers,进 ...
- JSP向后台传 递 参 数 的四种方式
一.通过Form表单提交传值 客户端通过Form表单提交到服务器端,服务器端通过 Java代码 request.getParameter(String xx); 来取得参数(xx)为参数名称.通过ge ...
- IO流6 --- FileReader中使用read(char[] cbuf)读入数据 --- 技术搬运工(尚硅谷)
FileReader 字符输入流 @Test public void test2(){ File file = new File("hello.txt"); FileReader ...
- BootStrap 栅格化换行问题
bootstrap 3的栅格系统有时会出现错位情况,原因是上一行的元素高度不一,导致元素float错误. 解决方法 使用栅格系统的时候,应该在每一行都使用row单独包裹起来,不要直接在一行中连续加入c ...
- Etag 和 If-None-Match
ETag是HTTP1.1中才加入的一个属性,用来帮助服务器控制Web端的缓存验证. 它的原理是这样的,当浏览器请求服务器的某项资源(A)时, 服务器根据A算出一个哈希值(3f ...
- 互联网安全的必要性:CSDN用户信息泄露案告破
本报讯 昨天,记者从北京警方获悉,历时40多天的侦查,轰动互联网的“CSDN网站用户信息泄露案”告破,涉案嫌疑人已被刑拘.由于保密措施不力,北京警方还向CSDN网站开出我国落实信息安全等级保护制度以来 ...