转载请出自出处:http://eksliang.iteye.com/blog/2267513
一、概述
Hessian和Burlap是CauchoTechnology提供的两种基于HTTP的轻量级远程服务解决方案。他们都致力于借助尽可能简单的API和通信协议来简化Web服务。
你可能会问,为什么Caucho对同一个问题会有两种解决方案。Hessian和Burlap就如同一个事物的两面,但是每一个解决方案都服务于略微不同的目的。Hessianx像RMI一样,使用二进制消息进行客户端和服务器之间的交互。但是与其他二进制远程调用技术(例如RMI)不同是,他的二进制消息可以移植到其他非Java语言中,包括PHT、C++和C#
Burlap是一种基于XML的远程过程调用技术,这使得他可以自然而然的移植到任何能够解析XML的语言上。正是因为他是基于XML的,所以相比起Hessian的二进制格式而言,Burlap可读性更强。但是与其他基于XML的远程技术(例如SOAP或者XML-RPC)不同,Burlap的消息结构尽可能的简单,不需要额外的外部定义语言(例如WSDL、IDL)。
Hessian和Burlap的在很大程度上是一样的的。唯一的区别在于Hessian的消息是二进制的,而Burlap的消息是XML。由于Hessian的消息是二进制的,所以他在宽带上更加具有优势。但是如果我们更加关注可读性,那么Burlap的XML消息会是更好的选择。
二、在Spring导出(发布)一个Hessian/Burlap服务
2.1、定义服务接口UserService
import java.util.List; import com.gosun.jws.daomain.Users; /** * 服务的接口 * @author Ickes * */ public interface UserService { /** * 测试返回list * @return */ public ListgeAlltUsers(); /** * 测试返回实体,以及传人普通参数 * @param id * @return */ public Users getUser(String id); /*** * 测试传入对象 * @param user */ public void save(Users user); /** * 测试传人集合 * @param users */ public void saves(List users); }
2.2、服务接口实现类
import java.util.List; import com.gosun.jws.daomain.Users; import com.gosun.jws.daomain.UsersFactory; public class UserServiceImpl implements UserService { @Override public ListgeAlltUsers() { return UsersFactory.getUsers(); } @Override public Users getUser(String id) { System.out.println(id); return UsersFactory.getUser(); } @Override public void save(Users user) { System.out.println(user.toJson()); } @Override public void saves(List users) { for (Users u : users) { System.out.println(u.toJson()); } } }
测试用到的:UsersFactory工具类和Users实体类在:http://eksliang.iteye.com/blog/2265021篇文章的3.1和3.2代码中
2.3、配置Spring的HessianProxyFactoryBean
hessianUserService burlapUserService
2.4、配置Hessian控制器
因为Hessian是基于Http的,所以 HessianServiceExporter和BurlapServiceExporter需要实现一个Spring MVC控制器,这意味着为了使用导出的Hessian服务,我们需要执行两个额外的配置 步骤:
- 在web.xml中配置Spring的DispatcherServlet,并把我们的应用部署为Web应用;
- 在Spring的配置文件中配置一个URL出来器,将Hessian服务的URL分发给对应的Hessian服务Bean;
web.xml中配置DispatcherServlet:
配置Spring的URL处理器,将Hessian服务的URL分发给对应的Hessian服务bean,这段代码已经一起写在了2.3的代码中,就是org.springframework.web.servlet.handler.SimpleUrlHandlerMapping这个类。hessian org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:applicationContext-hessian.xml classpath:applicationContext-httpinvoker.xml hessian *.service
这个时候启动服务器,就可以完成对Hessian服务的启动。
三、访问Hessian/Burlap服务
3.1、在spring中配置HessianProxyFactoryBean和BurlapProxyFactoryBean
3.2、使用Spring的API进行调用
import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.gosun.jws.daomain.Users; /** * 在spring中调用 * @author Lenovo * */ public class ClientDemo { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("client-application/applicationContext-hessian.xml"); UserService us = (UserService) ac.getBean("burlapUserService"); Users user = us.getUser("a001"); System.out.println(user.toJson()); System.out.println("----------------------------------------"); Listusers = us.geAlltUsers(); for (Users u : users) { System.out.println(u.toJson()); } System.out.println("----------------------------------------"); us.save(user); System.out.println("----------------------------------------"); us.saves(users); } }
3.3、Hessian原始方式调用
import java.net.MalformedURLException; import java.util.List; import com.caucho.hessian.client.HessianProxyFactory; import com.gosun.jws.daomain.Users; /** * 直接使用hessian的API进行调用 * @author Lenovo * */ public class HessianClientDemo { public static void main(String[] args) throws MalformedURLException { String url = "http://localhost:8080/jws/hessianUserService.service"; HessianProxyFactory factory = new HessianProxyFactory(); //如果UserService类有重载方法需要设置,不然会抛出异常 factory.setOverloadEnabled(true); UserService us = (UserService) factory.create(UserService.class,url); Users user = us.getUser("a001"); System.out.println(user.toJson()); System.out.println("----------------------------------------"); Listusers = us.geAlltUsers(); for (Users u : users) { System.out.println(u.toJson()); } System.out.println("----------------------------------------"); us.save(user); System.out.println("----------------------------------------"); us.saves(users); } }