Hessian、Burlap是由Caucho Technology(http://www.caucho.com/)所提出,透过HTTP实现的远 程服务。 Hessian是将物件以中性的二进位讯息使用HTTP进行传送,而不若RMI使用Java的序列化格式,由 于该二进位讯息是中性的,因此不受限于某种程式语言所实现的客户端或伺服端,二进位资料在 传输时所需的频宽较小是其优点。
Burlap则是将物件以XML文件格式进行传送,XML文件且有较高的可读性,只要应用程式可以剖 析XML文件就可以解读所接收的讯息,当然也不受限于某种语言所实现的客户端与伺服端。
在Spring中使用Hessian及Burlap的方法是类似的,由于Hessian、Burlap是透过HTTP传送,所以在 使用它们时要搭配 Spring Web框架来使用,也就是使用到DispatcherServlet,举个实际的例子来 示范如何使用Hessian,以 RMI 介绍的RMI例子来说,可以直接使用已撰写好的ISomeService、 SomeServiceImpl,而伺服端要在 web.xml中配置DispatcherServlet:
• web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee → http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <session-config> <session-timeout> 30 </session-timeout> </session-config> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/service-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>*.service</url-pattern> </servlet-mapping> </web-app>
在 Hessian 的伺服端这边,使用 org.springframework.remoting.caucho.HessianServiceExporter 来发 布服务:
• service‐config.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 id="urlMapping" class="org.springframework.web.servlet. → handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/some.service">serviceExporter</prop> </props> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet. → view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <bean id="someService" class="onlyfun.caterpillar.SomeServiceImpl"/> <bean id="serviceExporter" class="org.springframework.remoting. → caucho.HessianServiceExporter"> <property name="service"> <ref bean="someService"/> </property> <property name="serviceInterface"> <value>onlyfun.caterpillar.ISomeService</value> </property> </bean> </beans>
注意到在 SimpleUrlHandlerMapping 的设置上,请求 some.service 的会转发给 serviceExporter,在 这边您不 用注册服务名称,也就是没有"serviceName"属性, Hessian、Burlap 不需要,如果您 使 用 的 是 Burlap , 则 设 定 上 在 serviceExporter 的 "class" 属 性 只 要 改 用 org.springframework.remoting.caucho.BurlapServiceExporter 类别即可。
接下来您只要启动 Servlet 容器,在载入以上设计 Web 应用程式之后,则 Hessian 伺服端就会启 动了,记得要在您的 lib 目录中加入 Hessian 所需的 API 类别之.jar 档案,这可以使用 Spring 下载 档案中 lib 目录下 caucho 目录的 hessian‐2.1.12.jar 档案,如果使用 Burlap 的话,当然要记得必须 加入 Burlap API 所需的.jar 档案。
Hessian 客户端的撰写则可以使用先前撰写的 RMIClientDemo 专案来改写,事实上只要修改一下 Bean 定义档即可,例如:
• hessian‐client.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 id="someServiceProxy" class="org.springframework.remoting. → caucho.HessianProxyFactoryBean"> <property name="serviceUrl"> <value> http://localhost:8080/HessianServerDemo/some.service </value> </property> <property name="serviceInterface"> <value>onlyfun.caterpillar.ISomeService</value> </property> </bean> </beans>
注意到"serviceUrl"属性的设定,它是个标准的 HTTP 请求位址,来撰写个简单的客户端程式以使 用 Hessian 伺服器上的服务:
• HessianClient.java
package onlyfun.caterpillar; import org.springframework.context.ApplicationContext; import org.springframework.context. support.FileSystemXmlApplicationContext; public class HessianClient { public static void main(String[] args) { ApplicationContext context =new FileSystemXmlApplicationContext( "hessian-client.xml"); ISomeService service =(ISomeService) context.getBean("someServiceProxy"); String result1 = service.doSomeService("Some request"); System.out.println(result1); int result2 = service.doOtherService(1); System.out.println(result2); } }
同样的必须记得,您要加入包括Hessian API的.jar档案,执行的结果与 RMI 是相同的,如果您要 使用Burlap,则设定上只要改用org.springframework.remoting.caucho.BurlapProxyFactoryBean即可, 当然要记得必须加入Burlap API所需的.jar档案。