Hessian 二进制RPC协议整合到SpringMVC

SpringMVC集成Hessian[url]http://blog.csdn.net/isea533/article/details/45038779[/url][color=red]成功整合, 把hessian配置放到servlet.xml就成功了.[/color]

原文: [url]http://zhuchengzzcc.iteye.com/blog/1534311[/url]没成功整合


[color=red]注意评论, 里面提出了几个错误的地方[/color]

        <dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.7</version>
</dependency>
<!-- 客户端使用到 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-remoting</artifactId>
<version>2.0.8</version>
</dependency>



相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议(Binary),因为采用的是二进制协议,所以它很适合于发送二进制数据。Hessian通常通过Web应用来提供服务,因此非常类似于WebService。只是它不使用SOAP协议。
Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,推荐采用面向接口编程,因此,Hessian服务建议通过接口暴露。

Hessian处理过程示意图:
客户端——>序列化写到输出流——>远程方法(服务器端)——>序列化写到输出流 ——>客户端读取输入流——>输出结果
环境搭建
Hessian的下载和安装请按如下步骤进行:
(1)登http://www.caucho.com/hessian/下载Hessian。
(2)把Hessian相应的Jar包放到Web应用下,所有的jar文件都应该放在WEB-INF/lib下,该文件也不例外。


[size=large][color=red]两种方式[/color][/size]
[color=blue][b]1.纯Hessian [/b][/color]
这种方式主要是适用于工程中没有适用像spring框架的情况下,好处是配置方便,但是当内容多的情况下,配置的内容很多。
package test;  

import java.util.List;

/**
* @author zhuc
* @version 2012-5-17 下午9:15:50
*/
public interface IService {
/**
* @param name
* @return
*/
public String sayHello(String name);

/**
* @return
*/
public Car getMyCar();

/**
* @return
*/
public List<String> getList();
}



package test;  

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

import com.caucho.hessian.server.HessianServlet;

/**
* @author zhuc
* @version 2012-5-17 下午9:16:35
*/
public class ServiceImpl extends HessianServlet implements IService {

/**
*
*/
private static final long serialVersionUID = 8385639368192939451L;

@Override
public String sayHello(String name) {
return "hello: " + name;
}

@Override
public Car getMyCar() {
Car c = new Car();
c.setName("哈哈车");
return c;
}

@Override
public List<String> getList() {
List<String> list = new ArrayList<String>();
list.add("haha");
list.add("hehe");
return list;
}

}



package test;  

import java.io.Serializable;

/**
* @author zhuc
* @version 2012-5-17 下午10:29:18
*/
public class Car implements Serializable {

/**
*
*/
private static final long serialVersionUID = -1115598660168001267L;

private String name;

/**
* @return the name
*/
public String getName() {
return name;
}

/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}

/**
* @return the serialversionuid
*/
public static long getSerialversionuid() {
return serialVersionUID;
}


}



web.xml的详细配置
<servlet>  
<servlet-name>Hello</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>home-class</param-name>
<param-value>test.ServiceImpl</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<param-value>test.IService</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>


客户端远程调用服务器端提供的接口,利用的就是Hessian的HessianProxyFactory,来实现远程代理


package test;  

import java.net.MalformedURLException;
import java.util.List;

import com.caucho.hessian.client.HessianProxyFactory;

/**
* @author zhuc
* @version 2012-5-17 下午9:31:14
*/
public class ClientTest {

/**
* @param args
*/
public static void main(String[] args) {
String url = "http://localhost:8080/Hessian/Hello";
HessianProxyFactory factory = new HessianProxyFactory();
try {
IService hello = (IService) factory.create(IService.class, url);
System.out.println(hello.sayHello("zhuc-no"));

Car c = hello.getMyCar();
System.out.println(c.getName());

List<String> list = hello.getList();
for (String string : list) {
System.out.println(string);
}
} catch (MalformedURLException e) {
e.printStackTrace();
}

}

}



输出结果,成功
hello: zhuc-no
哈哈车
haha
hehe


[color=blue][b]2.Hessian与Spring整合 [/b][/color]
相比上一种方式,这个方式就有点麻烦了。Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务,web.xml只是定义了“请求转发器”,该转发器将匹配/remoting/*的请求截获,转发给context的bean处理。而HessianServiceExporter提供bean服务。
所以Hessian与Spring整合主要就是一下两个工作:
1:通过DispatcherServlet来拦截URL请求。
2:HessianServiceExporter提供bean服务,Spring使用HessianServiceExporter,将一个常规bean导出成Hessian服务。

修改web.xml的详细配置
<servlet>  
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/remoting-servlet.xml</param-value>
</init-param>

在/WEB-INF/增加一个叫servlet-name-servlet.xml配置文件。该文件的命名有一定的规则,
红色servlet-name需要和web.xml中的<servlet-name>springhessian</servlet-name>定义的名称相匹配,
比如本例子应叫remoting-servlet.xml,这样简单也不容易出错。

当然该文件也可以自己任意命名。如果是自定义的文件名称不符合上述默认的规则,
需要在<servlet>中增加<init-param>相关属性,人为指定加载配置文件,否则会报错
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>



配置remoting-servlet.xml文件,将其放于/WEB-INF/下
<?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"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<!-- 定义普通bean实例 -->
<bean id="serviceImpl" class="test.ServiceImpl" />

<!-- 使用HessianServiceExporter 将普通bean导出成Hessian服务 -->
<bean name="/hessianCommentService"
class="org.springframework.remoting.caucho.HessianServiceExporter">
<!-- 需要导出的目标bean -->
<property name="service" ref="serviceImpl" />
<!-- Hessian服务的接口 -->
<property name="serviceInterface" value="test.IService" />
</bean>
</beans>


客户端定义一个remoting-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"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<bean id="myServiceClient"
class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceUrl">
<value>http://localhost:8080/Hessian/remoting/hessianCommentService</value>
</property>
<property name="serviceInterface">
<value>test.IService</value>
</property>
</bean>

</beans>



客户端调用
package spring;  

import java.util.List;

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

import test.Car;
import test.IService;

/**
* @author zhuc
* @version 2012-5-17 下午9:59:31
*/
public class ClientTest {

/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"spring/remoting-client.xml");
IService hello = (IService) context.getBean("myServiceClient");
System.out.println(hello.sayHello("zhuc-spring"));

Car c = hello.getMyCar();
System.out.println(c.getName());

List<String> list = hello.getList();
for (String string : list) {
System.out.println(string);
}
}

}



输出结果同上。

[color=red]注:上述spring方式,客户端中的请求UR[/color]L
http://localhost:8080/Hessian/remoting/hessianCommentService 中的hessianCommentService需要和remoting-servlet.xml配置中HessianServiceExporter的bean name相同,否则将会找不到server端
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值