一。簡介
相比WebService,Hessian更簡單、快捷。採用的是二進制RPC協議(Binary),因爲採用的是二進制協議,所以它很適合於發送二進制數據。Hessian通常通過Web應用來提供服務,因此非常類似於WebService。只是它不使用SOAP協議。 Hessian通過Servlet提供遠程服務。需要將匹配某個模式的請求映射到Hessian服務。Spring的DispatcherServlet可以完成該功能,DispatcherServlet可將匹配模式的請求轉發到Hessian服務。Hessian的server端提供一個servlet基類, 用來處理髮送的請求,而Hessian的
這個遠程過程調用,完全使用動態代理來實現的,,推薦採用面向接口編程,因此,Hessian服務建議通過接口暴露。
Hessian處理過程示意圖:
客戶端——>序列化寫到輸出流——>遠程方法(服務器端)——>序列化寫到輸出流 ——>客戶端讀取輸入流——>輸出結果
二。 不使用Spring框架下的hessian相關例子
1. 把Hessian相應jar包放入至工程中。
2. 由於Hessian是採用面向接口編程的,所以編寫一個接口,因爲客戶端僅僅需要接口,而無須真實的實現類。
package demo;
publicinterface ITest {
public String sayHello();
}
3. 編寫一個類實現這個接口。
package demo;
/**
*
* @author alan
* @createtime 2013-4-11
*
*/
publicclass TestImpl implements ITest {
@Override
public String sayHello() {
// TODO Auto-generated method stub
return"HELLO ALAN.";
}
}
4. web.xml的詳細配置
<!-- noSpring -->
<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>demo.TestImpl</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<param-value>demo.ITest</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,來實現遠程代理。
客戶端調用代碼例子:
privatestaticvoid noSpring() {
String url = "http://localhost:8080/SpringHessian/Hello";
HessianProxyFactory factory = new HessianProxyFactory();
try {
ITest hello = (ITest) factory.create(ITest.class, url);
System.out.println(hello.sayHello());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
三。 使用spring框架時候的Hessian例子。
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服務。
具體配置步驟例子如下:
一。客戶端直接調用接口獲取Bean實例例子。
1。和上面的一樣。
2。和上面的一樣。
3。和上面的一樣。
4。web.xml的詳細配置
<!-- SpringHessian -->
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
<!-- 定義普通bean實例-->
<bean id="test"class="demo.TestImpl" />
<!-- 使用HessianServiceExporter 將普通bean導出成Hessian服務-->
<bean name="/test"class="org.springframework.remoting.caucho.HessianServiceExporter">
<!-- 需要導出的目標bean -->
<property name="service" ref="test" />
<!-- Hessian服務的接口 -->
<property name="serviceInterface" value="demo.ITest" />
</bean>
6. 客戶端調用例子
privatestaticvoid springHessian() throws MalformedURLException {
String url = "http://localhost:8080/SpringHessian/remoting/test";
HessianProxyFactory factory = new HessianProxyFactory();
factory.setDebug(true);
ITest hello = (ITest) factory.create(ITest.class, url);
System.out.println(hello.sayHello());
}
二。客戶端通過配置配置文件獲取Bean實例例子。
1. 客戶端引入相關的JAR包。
2. 客戶端定義一個 remote-client.xml文件
<bean id="myServiceClient"class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceUrl">
<value>http://localhost:8080/SpringHessian/remoting/test</value>
</property>
<property name="serviceInterface">
<value>demo.ITest</value>
</property>
</bean>
3. 客戶端調用例子
try
{
ApplicationContext context = new ClassPathXmlApplicationContext("remote-client.xml");
ITest hello =(ITest)context.getBean("myServiceClient");
System.out.println(hello.sayHello());
}
catch (Exception e)
{
e.printStackTrace();