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:


<!-- begin hessian -->
  <servlet>
   <servlet-name>remoting</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
  </servlet>
 
  <servlet-mapping>
   <servlet-name>remoting</servlet-name>
   <url-pattern>/remoting/*</url-pattern>
  </servlet-mapping>
<!-- end hessian -->

<!-- begin 原生hessian -->
 <servlet>
  <servlet-name>origin</servlet-name>
  <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
  <init-param>
  <param-name>home-class</param-name>
  <param-value>server.service.impl.RemoteServiceImpl</param-value>
  </init-param>
  <init-param>
  <param-name>home-api</param-name>
  <param-value>server.service.IRemoteService</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
 
 <servlet-mapping>
  <servlet-name>origin</servlet-name>
  <url-pattern>/origin</url-pattern>
 </servlet-mapping>

<!-- end 原生hessian -->

//remoting-servlet.xml   这个文件必须放在/WEB-INF/下,我想通过查看源码来试试能否指定这个文件的路径或者文件名,但因为发现spring-framework-3.0.5.RELEASE这个版本不包括remote包的源码。我还试着从HessianServiceExporter类开始,查看它的父类以及接口,在eclipse的Outline窗口没发现什么蛛丝马迹,所以暂时得出判断是这个文件的名字以及路径是代码里写死的,是不可配置的。

<bean name="/RemoteService" class="org.springframework.remoting.caucho.HessianServiceExporter">
  <property name="service" ref="remoteService"></property>
  <property name="serviceInterface" value="server.service.IRemoteService"></property>
 </bean>
 

至此,服务端的准备工作做好了。以下是客户端的调用。

----------------------------------

//客户端的spring配置文件

<bean id="remoteService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
  <property name="serviceUrl" value="http://127.0.0.1:8080/hessian/remoting/RemoteService"></property>
  <property name="serviceInterface" value="server.service.IRemoteService"></property>
 </bean>

//客户端发送请求

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

 }

猜你喜欢

转载自blog.csdn.net/yyb_gz/article/details/6199351