java原生的hessian和spring的hessian

简介


相比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
   org.springframework.web.servlet.DispatcherServlet
   1
 

 
 
   remoting
   /remoting/*
 

 


 
  origin
  com.caucho.hessian.server.HessianServlet
  
  home-class
  server.service.impl.RemoteServiceImpl
  

  
  home-api
  server.service.IRemoteService
  

  1
 

 
 
  origin
  /origin
 

 

//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"));
   
  

 }

你可能感兴趣的:(Java阵营)