`
eksliang
  • 浏览: 592382 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Heasian与Spring集成

阅读更多

转载请出自出处: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 List<Users> geAlltUsers();
	/**
	 * 测试返回实体,以及传人普通参数
	 * @param id
	 * @return
	 */
	public Users getUser(String id);
	
	/***
	 * 测试传入对象
	 * @param user
	 */
	public void save(Users user);
	
	/**
	 * 测试传人集合
	 * @param users
	 */
	public void saves(List<Users> 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 List<Users> geAlltUsers() {
		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> 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

<!-- 在Spring中装配hessian服务 -->
	<bean id="hessianUserService"
		class="org.springframework.remoting.caucho.HessianServiceExporter">
		<!--需要发布的实现类 -->
		<property name="service" ref="userServiceHessian" />
		<property name="serviceInterface" value="com.gosun.jws.hessian.UserService" />
	</bean>
	<!-- 在spring中装配burlap服务 -->
	<bean id="burlapUserService"
		class="org.springframework.remoting.caucho.BurlapServiceExporter">
		<!--需要发布的实现类 -->
		<property name="service" ref="userServiceHessian" />
		<property name="serviceInterface" value="com.gosun.jws.hessian.UserService" />
	</bean>

	<!-- 将特定的请求映射到具体的hessianservice -->
	<bean id="urlMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="/hessianUserService.service">hessianUserService</prop>
				<prop key="/burlapUserService.service">burlapUserService</prop>
			</props>
		</property>
	</bean>

	<bean id="userServiceHessian" class="com.gosun.jws.hessian.UserServiceImpl" />

 

 2.4、配置Hessian控制器

因为Hessian是基于Http的,所以 HessianServiceExporter和BurlapServiceExporter需要实现一个Spring MVC控制器,这意味着为了使用导出的Hessian服务,我们需要执行两个额外的配置 步骤:

  1. 在web.xml中配置Spring的DispatcherServlet,并把我们的应用部署为Web应用;
  2. 在Spring的配置文件中配置一个URL出来器,将Hessian服务的URL分发给对应的Hessian服务Bean;

web.xml中配置DispatcherServlet:

 

<!-- Hessian控制器配置 Servlet -->
	<servlet>
		<servlet-name>hessian</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- dispatcherServlet详解地址:http://jinnianshilongnian.iteye.com/blog/1602617 -->
		<!-- <init-param> <param-name>namespace</param-name> <param-value>applicationContext-hessian</param-value> 
			</init-param> -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>
         	classpath:applicationContext-hessian.xml
         	classpath:applicationContext-httpinvoker.xml
         </param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>hessian</servlet-name>
		<url-pattern>*.service</url-pattern>
	</servlet-mapping>
 配置Spring的URL处理器,将Hessian服务的URL分发给对应的Hessian服务bean,这段代码已经一起写在了2.3的代码中,就是org.springframework.web.servlet.handler.SimpleUrlHandlerMapping这个类。

 

 

这个时候启动服务器,就可以完成对Hessian服务的启动。

 

三、访问Hessian/Burlap服务

3.1、在spring中配置HessianProxyFactoryBean和BurlapProxyFactoryBean

 

	<!-- 使用spring调用Hession的服务 -->
	<bean id="hessianUserService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
		<property name="serviceUrl" value="http://localhost:8080/jws/hessianUserService.service"/>
		<property name="serviceInterface" value="com.gosun.jws.hessian.UserService" />
	</bean>
	
	 
	<!-- 使用spring调用Hession的服务 -->
	<bean id="burlapUserService" class="org.springframework.remoting.caucho.BurlapProxyFactoryBean">
		<property name="serviceUrl" value="http://localhost:8080/jws/burlapUserService.service"/>
		<property name="serviceInterface" value="com.gosun.jws.hessian.UserService" />
	</bean>
 

 

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("----------------------------------------");
		List<Users> users = 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("----------------------------------------");
		List<Users> users = us.geAlltUsers();
		for (Users u : users) {
			System.out.println(u.toJson());
		}
		System.out.println("----------------------------------------");
		us.save(user);
		System.out.println("----------------------------------------");
		us.saves(users);
	}
}
 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics