简介
相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议(Binary),因为采用的是二进制协议,所以它很适合于发送二进制数据。Hessian通常通过Web应用来提供服务,因此非常类似于WebService。只是它不使用SOAP协议。
Hessian通过Servlet提供远程服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的。
Hessian处理过程示意图:
客户端——>序列化写到输出流——>远程方法(服务器端)——>序列化写到输出流 ——>客户端读取输入流——>输出结果
//服务端与客户端共用的接口
package server.service;
import server.entity.Student;
public interface IRemoteService{
public Student fullfillStudent(Student student);
public Student createStudent(String name,int age);
public String sayHello(String name);
}
//服务端接口实现类
package server.service.impl;
import server.entity.Student;
import server.service.IRemoteService;
public class RemoteServiceImpl implements IRemoteService {
private static final long serialVersionUID = -5321327076322429303L;
@Override
public Student createStudent(String name,int age) {
return new Student(name,age);
}
@Override
public String sayHello(String name) {
return "hi~, "+name;
}
@Override
public Student fullfillStudent(Student student) {
student.setName("default");
student.setAge(111);
return student;
}
}
//web.xml内加入以下servlet:
//remoting-servlet.xml 这个文件必须放在/WEB-INF/下,我想通过查看源码来试试能否指定这个文件的路径或者文件名,但因为发现spring-framework-3.0.5.RELEASE这个版本不包括remote包的源码。我还试着从HessianServiceExporter类开始,查看它的父类以及接口,在eclipse的Outline窗口没发现什么蛛丝马迹,所以暂时得出判断是这个文件的名字以及路径是代码里写死的,是不可配置的。
至此,服务端的准备工作做好了。以下是客户端的调用。
----------------------------------
//客户端的spring配置文件
//客户端发送请求
public static void main(String[] args) {
//原生方式
String url = "http://127.0.0.1:8080/hessian/origin";
HessianProxyFactory factory = new HessianProxyFactory();
try {
IRemoteService server =(IRemoteService)factory.create(IRemoteService.class,url);
Student stu1 = server.fullfillStudent(new Student());
Student stu2 = server.createStudent("b",2);
System.out.println("fullfillStudent----"+stu1);
System.out.println("createStudent----"+stu2);
System.out.println(server.sayHello("everybody"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
//spring 方式
ApplicationContext ac = new FileSystemXmlApplicationContext("src/client/applicationContext_client.xml");
IRemoteService server = (IRemoteService) ac.getBean("remoteService");
Student stu1 = server.fullfillStudent(new Student());
Student stu2 = server.createStudent("b",2);
System.out.println("fullfillStudent----"+stu1);
System.out.println("createStudent----"+stu2);
System.out.println(server.sayHello("everybody"));
}