一、 Hessian原理简介:
Hessian 是由 caucho 提供的一个 基于 Binary-RPC 协议实现 的远程通讯 library 。在使用过程中,请求端 通过 Hessian 本身提供的 API 来向服务端发起请求, Hessian 通过其自定义的串行化机制将请求信息进行序列化,产生二进制流,然后 用Http 协议进行传输。 响应端根据 Hessian 提供的 API 来接收请求, 而后,Hessian 根据其私有的串行化机制来将请求信息进行反序列化,传递给使用者时已是相应的请求信息对象了。 处理完毕后直接返回, hessian 将结果对象进行序列化,传输至调用端。
二、 Hessian 调用实例
1. 服务端实体类:
package com.shhx.model;
import java.io.Serializable;
public class PlaneBean implements Serializable {
private String color;
private String length;
private String owner;
private static final long serialVersionUID = 1L;
public PlaneBean() {
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getLength() {
return length;
}
public void setLength(String length) {
this.length = length;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
}
2.服务端接口:
package com.shhx.service;
import com.shhx.model.PlaneBean;
public interface IBasic {
public String getAirLine();
public PlaneBean getPlaneBean();
}
3.服务端接口实现类:
package com.shhx.service;
import com.caucho.hessian.server.HessianServlet;
import com.shhx.model.PlaneBean;
public class IBasicImpl extends HessianServlet implements IBasic {
private String airline= "Shanghai - Shenzhen";
public String getAirLine() {
return airline;
}
public PlaneBean getPlaneBean() {
PlaneBean plane = new PlaneBean();
plane.setColor("silver");
plane.setLength("30");
plane.setOwner("MU");
return plane;
}
}
4. web.xml中的配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/remoting-servlet.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>hessian</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <init-param> <param-name>home-class</param-name> <param-value>com.shhx.service.IBasicImpl</param-value> </init-param> <init-param> <param-name>home-api</param-name> <param-value>com.shhx.service.IBasic</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>hessian</servlet-name> <url-pattern>/hessian</url-pattern> </servlet-mapping> </web-app>
5. WEB-INF下 remoting-servlet.xml 的配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 定义普通bean实例--> <bean id="iBasicImpl" class="com.shhx.service.IBasicImpl" /> <!-- 使用HessianServiceExporter 将普通bean导出成Hessian服务--> <bean name="/HessianRemoting" class="org.springframework.remoting.caucho.HessianServiceExporter"> <!-- 需要导出的目标bean--> <property name="service" ref="iBasicImpl" /> <!-- Hessian服务的接口--> <property name="serviceInterface" value="com.shhx.service.IBasic" /> </bean> </beans>
6. 客户端要有对应的实体类和接口,客户端代码:
package com.shhx.service;
import java.net.MalformedURLException;
import com.caucho.hessian.client.HessianProxyFactory;
import com.shhx.model.PlaneBean;
public class BasicClient {
/**
* @param args
*/
public static void main(String[] args) {
String url = "http://127.0.0.1:8080/hessianDemo/hessian";
HessianProxyFactory factory = new HessianProxyFactory();
try {
IBasic basic = (IBasic) factory.create(IBasic.class, url);
System.out.println(basic);
System.out.println("airline: " + basic.getAirLine());
PlaneBean plane = basic.getPlaneBean();
System.out.println("color: " + plane.getColor());
System.out.println("length: " + plane.getLength());
System.out.println("owner: " + plane.getOwner());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
客户端运行结果如下:
HessianProxy[http://127.0.0.1:8080/hessianDemo/hessian]
airline: Shanghai - Shenzhen
color: silver
length: 30
owner: MU
三、 在进行基于Hessian的项目开发时,应当注意以下几点:
▲JAVA服务器端必须具备以下几点:
-包含Hessian的jar包;
-设计一个接口,用来给客户端调用;
-实现该接口的功能;
-配置web.xml,配好相应的servlet;
-对象必须实现Serializable 接口;
-对于复杂对像可以使用Map的方法传递;
▲客户端必须具备以下几点:
-java客户端包含Hessian.jar的包;
-具有和服务器端结构一样的接口。包括命名空间都最好一样;
-利用HessianProxyFactory调用远程接口。
四、 Hessian特点总结:
-整个jar很小,200多K,3.1版本的,当然,我下载的for java的版本;
-配置很简单,基本上不需要花什么经历就配置出来了;
-功能强大,可以将soap抛开,也可以把EJB抛开,采用二进制来传递对象;
-拥有多种语言支持,python c++ .net 甚至 flex 都可以做为client。
下载地址: https://i-blog.csdnimg.cn/blog_migrate/031dcd3d19810ae66eb41ea748fa051b.png