一。简介
相比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;
public interface ITest {
public String sayHello();
}
3. 编写一个类实现这个接口。
package demo;
/**
*
* @author alan
* @createtime 2013-4-11
*
*/
public class 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,来实现远程代理。
客户端调用代码例子:
private static void 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. 客户端调用例子
private static void 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();
}