Hessian和Spring整合

    上篇文章简单的介绍了Hessian以及它的一些执行原理,现在我们来看看它与强大框架spring的集成吧!

一、服务端使用spring,我们得下载Hessian支持包和Spring的相应的jar包,可以在我的资源库中进行免费下载:

http://download.csdn.net/detail/harderxin/7129231

1、新建web工程,我取名为HessianSpringServer,在web/WEB-INFO/BIN中导入我们相应的jar包,跟上篇文章一样,编写我们的实体类和接口类、以及接口实现类:

实体用户类:

package com.server.bean;

import java.io.Serializable;

public class User implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 7175134832651443717L;
	//用户编号
	private int id;
	//用户名
	private String userName;
	//密码
	private String password;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	public User(int id, String userName, String password) {
		super();
		this.id = id;
		this.userName = userName;
		this.password = password;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		result = prime * result
				+ ((password == null) ? 0 : password.hashCode());
		result = prime * result
				+ ((userName == null) ? 0 : userName.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (id != other.id)
			return false;
		if (password == null) {
			if (other.password != null)
				return false;
		} else if (!password.equals(other.password))
			return false;
		if (userName == null) {
			if (other.userName != null)
				return false;
		} else if (!userName.equals(other.userName))
			return false;
		return true;
	}
}


定义我们的接口类:

package com.server.service;

import java.util.List;

import com.server.bean.User;

public interface UserService {
	
	public List<User> getUser();
	
}

定义我们的接口实现类:

package com.server.service.impl;

import java.util.ArrayList;
import java.util.List;

import com.server.bean.User;
import com.server.service.UserService;

public class UserServiceImpl implements UserService{

	public List<User> getUser() {
		//我们可以在这个方法中与数据库打交道
		List<User> list=new ArrayList<User>();
		list.add(new User(1,"Mary","123456"));
		list.add(new User(2,"Jack","236547"));
		list.add(new User(3,"Joy","362541"));
		return list;
	}
}


2、新建spring配置文件springremoting-servlet.xml,让接口及实现类由spring容器去管理:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
        
        <!-- Hessian服务接口Impl注入 -->
        <bean id="userService" class="com.server.service.impl.UserServiceImpl"/>
        
        <!-- 使用HessianServiceExporter为服务接口Impl在网络地址中映射一个Hessian服务-->
	<!-- 完整的远程调用请求Url:http://localhost:8080/HessianSpringServer/sr/userService,前部分在web.xml中已经进行了配置 -->
        <bean name="/userService" class="org.springframework.remoting.caucho.HessianServiceExporter">
         	<!-- Hessian服务的接口 -->
        	<property name="serviceInterface" value="com.server.service.UserService"/>
        	<!-- Hessian服务的接口Impl -->
        	<property name="service" ref="userService"></property>
        </bean>
</beans>


3、配置我们的web.xml文件,让服务器启动后能够加载到我们的springremoting-servlet.xml,以及配置访问路径

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	
	<servlet>
	    <!-- 完整的远程调用请求Url:http://localhost:8080/HessianSpringServer/sr/* -->
	    <servlet-name>springremoting</servlet-name>
	    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	    <init-param>
	        <param-name>contextConfigLocation</param-name>
	        <!-- 服务启动加载 springremoting-servlet.xml-->
	        <param-value>classpath:springremoting-servlet.xml</param-value>
	    </init-param>
	    <load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
	    <servlet-name>springremoting</servlet-name>
	    <url-pattern>/sr/*</url-pattern>
	</servlet-mapping>
  	<welcome-file-list>
    	<welcome-file>index.jsp</welcome-file>
  	</welcome-file-list>
</web-app>

好了,我们的简单的服务端搭建完成了,记得把我们的接口类(UserService)和实体类(User)打成相应的jar包(也可以在客户端复制服务端接口类的代码,这样太繁琐了),因为我们的客户端需要访问到,这是Hessian里面定义的,No Why!

将我们的项目部署到Tomcat服务器上,启动Tomcat,如果报错了,说明你的配置没有配好哦,得自己仔细检查检查,如果不报错,说明我们的服务端搭建完成,下面来编写我们的客户端吧!

二、客户端不使用Spring,新建java项目,导入我们的Hessian支持包和在服务端打包的借口类jar包

编写我们的测试类,因为我把没有spring和有spring的客户端测试类写在了一起,好做个对比:

package com.client.test;


import java.util.List;

import com.caucho.hessian.client.HessianProxyFactory;
import com.server.bean.User;
import com.server.service.UserService;

public class UserServiceTest {
	public static void main(String[] args) {
		//不使用Spring服务器访问地址
		//String url="http://localhost:8080/HessianServer/us";
		//使用spring服务器访问的地址
		String url="http://localhost:8080/HessianSpringServer/sr/userService";
		//获得HessianProxyFactory实例
		HessianProxyFactory factory=new HessianProxyFactory();
		try {
			//不使用Spring创建我们的接口对象
			//UserService userService=(UserService)factory.create(url);
			//使用Spring创建我们的接口对象
			UserService userService=(UserService)factory.create(UserService.class,url);
			//执行服务端方法
			List<User> users=userService.getUser();
			//遍历输出
			for(User user:users){
				System.out.println("id="+user.getId()+",name="+user.getUserName()+",pwd="+user.getPassword());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

其实我在做测试的时候还是有一个疑问的,就是我发现在服务端Hessian和spring整合后,客户端需要这样去调用:factory.create(UserService.class,url);需要指定相应接口的class,不能直接使用url地址传入:factory.create(url);这样会抛出一个异常:UndeclaredThrowableException,其实服务端在spring配置文件里面已经给接口类以及实现类进行了注入:

    <!-- Hessian服务接口Impl注入 -->
        <bean id="userService" class="com.server.service.impl.UserServiceImpl"/>
        
        <!-- 使用HessianServiceExporter为服务接口Impl在网络地址中映射一个Hessian服务-->
		<!-- 完整的远程调用请求Url:http://localhost:8080/HessianSpringServer/sr/userService -->
        <bean name="/userService" class="org.springframework.remoting.caucho.HessianServiceExporter">
         	<!-- Hessian服务的接口 -->
        	<property name="serviceInterface" value="com.server.service.UserService"/>
        	<!-- Hessian服务的接口Impl -->
        	<property name="service" ref="userService"></property>
        </bean>


并且,没生成一个Service,都会要重新写一个bean,所以这里我觉得直接使用地址factory.create(url);是可以访问的,跟没有使用spring时候在web.xml中配置一样,可是它不行,应该是spring里面给它做处理了吧,我们必须要factory.create(UserService.class,url);不然,里面会找不到相应的实体类吧!大家在写代码的时候注意下就是了!

运行main函数,得到的结果为:

id=1,name=Mary,pwd=123456
id=2,name=Jack,pwd=236547
id=3,name=Joy,pwd=362541

测试成功,哈哈...!

三、客户端使用Spring,我们的客户端也可以使用Spring,让factory.create(UserService.class,url);交给spring容器去处理,同样,需要导入我们的Hessian支持包和在服务端打包的借口类jar包,还需要我们的spring支持包,上面已经给出了相应的下载地址,如果你客户端需要使用JUnit进行测试,也需要junit的测试类包,我的那个包文件里面都已经包含了

1、既然我们在客户端使用了spring,当然得编写我们的配置文件,例如springremoting-client.xml,然后将我们的访问地址和接口类在里面进行注入:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
        
        <bean id="userService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
            <!-- 注入我们的接口类 -->
        	<property name="serviceInterface" value="com.server.service.UserService"/>
        	<!-- 服务器访问地址 -->
        	<property name="serviceUrl" value="http://localhost:8080/HessianSpringServer/sr/userService"/>
        </bean>
</beans>

2、编写我们的测试函数:

package com.client.test;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.server.bean.User;
import com.server.service.UserService;

public class UserServiceSpringTest {
	public static void main(String[] args) {
		//加载我们的Spring配置文件
		ApplicationContext context=new ClassPathXmlApplicationContext("springremoting-client.xml");
		//获取我们的接口类
		UserService userService=(UserService)context.getBean("userService");
		List<User> users=userService.getUser();
		//遍历输出
		for(User user:users){
			System.out.println("id="+user.getId()+",name="+user.getUserName()+",pwd="+user.getPassword());
		}
	}
}

测试输出:

id=1,name=Mary,pwd=123456
id=2,name=Jack,pwd=236547
id=3,name=Joy,pwd=362541
两种情况的不同之处在于客户端里面的Hessian工厂对象交给spring容器去管理了,各有各的好处,大家可以根据实际情况进行选择!

使用junit测试我们的客户端:

/**
 *
 * Copyright: Copyright (c) 2012 Asiainfo-Linkage
 *
 * client@date:2014-3-28
 * @ClassName: UserServiceTest.java
 * @Description: 该类的功能描述
 *
 * @version: v1.0.0上午9:01:27eleven
 * @author: elevenHessianSpringClient
 *
 * Modification History:
 * Date  Author  Version Description
 * ---------------------------------------------------------*
 * 2014-3-28 eleven v1.0.0 新建
 */
package client;


import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import service.UserServiceI;

/**
 * @Title: UserServiceTest.java
 * @Description: TODO(这里用一句话描述这个类的作用)
 * @author eleven
 * @date 2014-3-28 上午9:01:27
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:springremoting-client.xml"})
public class UserServiceTest {
	
	private UserServiceI userService;
	
	@Resource
	public void setUserService(UserServiceI userService) {
		this.userService = userService;
	}

	@Test
	public void test() {
		System.out.println(userService.queryUserList());
	}

}


好了,Hessian与Spring整合完成,希望大家一起交流学习,共同进步!Hessian与sping、struts、hibernate三大框架整合,大家可以去尝试一下哦!

Hessian和Spring整合,布布扣,bubuko.com

Hessian和Spring整合

上一篇:jsp页面 java 文件下载设置禁止IE直接打开配置问题


下一篇:Java函数式编程(十)字符串及方法引用