一、首先先說Hessian是什么?
Hessian:hessian是一個輕量級的remotingonhttp工具,使用簡單的方法提供了RMI的功能,相比WebService,Hessian更簡單、快捷。采用的是二進(jìn)制RPC協(xié)議,因為采用了二進(jìn)制協(xié)議,所以它很適合于發(fā)送二進(jìn)制數(shù)據(jù),Hessian主要作面向?qū)ο蟮南⑼ㄐ?。Hessian的初衷就是支持動態(tài)類型,格式緊湊,跨語言Hessian是使用自己的序列化機(jī)制實現(xiàn)的編組和反編組,其支持的數(shù)據(jù)類型是有限制的,不支持復(fù)雜的對象,可以穿透防火墻,在這里不得不說一下RMI:RMI是一組用戶開發(fā)分布式應(yīng)用程序的API。他使用的是java序列化機(jī)制實現(xiàn)調(diào)用及返回值的編組于反編組。它使用Java語言接口定義了遠(yuǎn)程對象,它集合了Java序列化和Java遠(yuǎn)程方法協(xié)議(JavaRemote MethodProtocol)。他可以被看做是RPC的Java版本,因為傳統(tǒng)的RPC并不能很好的應(yīng)用于分布式對象系統(tǒng)。而JavaRMI則支持存儲于不同地址空間的程序級對象之間彼此進(jìn)行通信,實現(xiàn)遠(yuǎn)程對象之間的無縫遠(yuǎn)程調(diào)用。他也有它的缺點,他只能通過RMI協(xié)議來進(jìn)行訪問無法通過HTTP協(xié)議訪問,無法穿透防火墻。
還有一種遠(yuǎn)程調(diào)用方法就是HttpInvoker:他也是將參數(shù)和返回值通過Java的序列化機(jī)制進(jìn)行編組和反編組,它具有RMI的支持所有可序列化對象的優(yōu)點。試使用Http協(xié)議傳輸二進(jìn)制流的,同時又具有Hessian、Burlap(傳輸xml文本)的優(yōu)點。
二、寫一個簡單的hessian通信所需要知道寫哪些內(nèi)容?
Hessian:寫一個Hessian需要注意的問題:
1、JAVA服務(wù)器端必須具備以下幾點:
包含Hessian的jar包
設(shè)計一個接口,用來給客戶端調(diào)用
實現(xiàn)該接口的動能
配置web.xml,配置相應(yīng)的servlet
對象必須實現(xiàn)Serializable接口
對于復(fù)雜對象可以使用Map的方法傳遞
2、客戶端必須具備以下幾點:
java客戶端包含Hessian.jar包
具有和服務(wù)器端結(jié)構(gòu)一樣的接口和實體類。包括命名空間都最好一樣。利用HessianProxyFactory調(diào)用遠(yuǎn)程接口
三、簡單hessian實例:
1、在服務(wù)端的接口:
public interface IHello {
StringsayHello();
}
2、在服務(wù)端的實現(xiàn)類:
public class IHelloImpl extends HessianServlet implements IHello{
@Override
publicString sayHello() {
// TODOAuto-generated method stub
return"Hello,I from HessianService";
}
}
3、在客戶端的類:
public class ClientTest {
publicstatic String url ="http://127.0.0.1:8080/HessianService/Hello";
publicstatic void main(String[] args){
HessianProxyFactory factory = new HessianProxyFactory();
try {
IHelloiHello = (IHello) factory.create(IHello.class, url);
System.out.println(iHello.sayHello());
} catch(MalformedURLException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
}
}
3、先將服務(wù)器端的類link到客戶端,或者是將服務(wù)器端打包放到客戶端,
4、在web.xml中進(jìn)行配置:
服務(wù)器端: <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>com.kcpt.hessian.service.IHelloImpl</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<param-value>com.kcpt.hessian.service.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>
執(zhí)行成功:輸出Hello,I from HessianService,這是簡單的hessian實現(xiàn)方式,看起來比較簡單
四、hessian與spring結(jié)合.
在實際應(yīng)用中,我們不只是簡單的只使用hessian來進(jìn)行通信的,如果方法多得話,還不如直接寫在客戶端來調(diào)用,然而:當(dāng)hessian與spring結(jié)合后,大大減少了這些操作,將dao層的操作全部放在hessian服務(wù)端,將業(yè)務(wù)邏輯全部放在hessian客戶端,這樣的話我們的hessian客戶端和服務(wù)端完全分離,因此我們的業(yè)務(wù)邏輯和dao層就真正的達(dá)到了分離,就可以放在不同的服務(wù)器上,當(dāng)然hessian的通信的作用不僅僅只有這些。
接口和實現(xiàn)和上邊的一樣:只是在web.xml中配置比較麻煩:
例子:
1、服務(wù)器端:增加remoting-servlet.xml配置文件:用來配置bean,并將bean導(dǎo)出為hessian服務(wù):
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns ="http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xmlns:tx = "http://www.springframework.org/schema/tx"
xsi:schemaLocation = "http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd