hessian与Spring MVC的整合

举报
码农飞哥 发表于 2021/05/29 11:57:33 2021/05/29
【摘要】 今天2月10号,再过两天就可以回家了。开心 前几天因为项目的需要研究了下如何把hessian整合到项目中。现在做下简单的总结回顾。 目录介绍 1. hessian的介绍 2. hessian与Spring MVC的整合 3. 小结 123 hessian的介绍 Hessian 是一个基于 binary-RPC 实现的远程通讯 library。使用二进制传...

今天2月10号,再过两天就可以回家了。开心
前几天因为项目的需要研究了下如何把hessian整合到项目中。现在做下简单的总结回顾。

目录介绍

1. hessian的介绍
2. hessian与Spring  MVC的整合
3. 小结

  
 
  • 1
  • 2
  • 3

  1. hessian的介绍
    Hessian 是一个基于 binary-RPC 实现的远程通讯 library。使用二进制传输数据。Hessian通常通过Web应用来提供服务,通过接口暴露。Servlet和Spring的DispatcherServlet都可以把请求转发给Hessian服务。由以下两种方式提供,分别为:com.caucho.hessian.server.HessianServlet、org.springframework.web.servlet.DispatcherServlet。
  2. hessian与Spring MVC的整合
    首先,需要一个搭建好的Spring MVC框架,Spring MVC框架的搭建再次不赘述。
    • 环境
      Spring MVC 4.3.6.RELEASE
      hessian 4.0.7
      使用maven管理的话可以直接在pom文件添加相关的依赖。
 <dependency> <groupId>com.caucho</groupId> <artifactId>hessian</artifactId> <version>4.0.7</version> </dependency>
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
 - 服务端的整合 **web.xml**

  
 
  • 1
  • 2
  <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

由于,DispatcherServlet已经有了HttpRequestHandle,所以在此我们不必再重复配置HessianServlet
mvc-dispatcher-servlet.xml
此处,由于我们的采用的是注解的方式来配置的,所以需要在mvc-dispatcher-servlet.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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--自动注入--> <mvc:annotation-driven/> <context:component-scan base-package="com.jay"/> <!--解决配置servlet-mapping的时候,如果url-pattern设置为“/”,静态资源访问不了的问题--> <mvc:default-servlet-handler/>

</beans>
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

<mvc:default-servlet-handler/> 这个配置是用来解决 当我们把DispatcherServlet 的servlet-mapping的时候,如果url-pattern设置为“/”,静态资源访问不了的问题,使静态资源走Tomcat默认的servlet。具体可以参考(http://www.mamicode.com/info-detail-1138370.html)
配置弄好之后,我们接着来看看demo代码,首先,
接口类UserService.java

package com.jay.hessian;

/**
 * Created by xiang.wei on 2018/2/10
 *
 * @author xiang.wei
 */
public interface UserService { /** * 返回用户传入的名称 * @param user * @return */ String sayMyName(User user);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

实体类 user.java

package com.jay.hessian;

import java.io.Serializable;

/**
 * Created by xiang.wei on 2018/2/10
 *
 * @author xiang.wei
 */
public class User implements Serializable{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

注意,此处实体类User 必须要序列化,不然传输报错。原因后面再说
接口实现类

package com.jay;

import com.jay.hessian.User;
import com.jay.hessian.UserService;
import org.springframework.stereotype.Service;

/**
 * Created by xiang.wei on 2018/2/10
 *
 * @author xiang.wei
 */
@Service("userService")
public class UserServiceImpl implements UserService { public String sayMyName(User user) { System.out.println("接收到的参数是=" + user.toString()); return user.getName(); }
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

好了,demo服务端需要用的测试类我们都已经弄好了,接着,我们还需要配置HessianServiceExporter 用于代理接口类。
服务器类 HessianServer.java

package com.jay;

import com.jay.hessian.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.remoting.caucho.HessianServiceExporter;
import org.springframework.stereotype.Controller;

/**
 * Created by xiang.wei on 2018/2/10
 *
 * @author xiang.wei
 */
@Controller
public class HessianServer { @Autowired private UserService userService; /** * * @return */ @Bean(name = "/userService.hs") public HessianServiceExporter getUserService() { HessianServiceExporter exporter = new HessianServiceExporter(); //Hessian服务的接口 exporter.setServiceInterface(UserService.class); //Hessian服务的接口Impl exporter.setService(userService); return exporter; }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

在此处,我们指定了接口类以及他的实现类。至此,服务端就配置好了。我们可以在浏览器上直接输入 http://localhost:8080/hessian-server-demo/userService.hs 验证下。如果返回 405 则表示服务端配置正确
这里写图片描述
- 客户端的整合
客户端的相对简单些。我们同样需要把hessian4.0.7 的依赖引入。然后,我们还需要将服务端的接口类以及其设计的实体类打个jar,此处,我打了一个hessian-server-rpc.jar 放在客户端的lib 目录下。所以
pom.xml 添加的依赖是

  <dependencies> <dependency> <groupId>com.caucho</groupId> <artifactId>hessian</artifactId> <version>4.0.7</version> </dependency> <dependency> <groupId>com.jay</groupId> <artifactId>hessian-server-rpc</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/java/lib/hessian-server-rpc.jar</systemPath> </dependency>
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

接着,我们先写个简单的测试类。
HessianClient.java

package com.jay;

import com.caucho.hessian.client.HessianProxyFactory;
import com.jay.hessian.User;
import com.jay.hessian.UserService;

import java.net.MalformedURLException;


/**
 * Created by xiang.wei on 2018/2/10
 *
 * @author xiang.wei
 */
public class HessianClient { public static void main(String[] args) { String url = "http://localhost:8080/hessian-server-demo/userService.hs"; HessianProxyFactory factory = new HessianProxyFactory(); factory.setConnectTimeout(6000);  //连接超时时间 factory.setReadTimeout(6000);  //读取超时时间 try { UserService userService = (UserService) factory.create( UserService.class, url); User user = new User(); user.setName("张三"); user.setAge(11); System.out.println(userService.sayMyName(user));; } catch (MalformedURLException e) { e.printStackTrace(); } }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

在此处我们首先创建了一个反向代理的工厂类HessianProxyFactory,然后通过其create 创建接口实例。
至此,我们hessian与Spring MVC的整合就完成了。我们来看看运行效果

Connected to the target VM, address: '127.0.0.1:52274', transport: 'socket'
张三
Disconnected from the target VM, address: '127.0.0.1:52274', transport: 'socket'
  
 
  • 1
  • 2
  • 3
  1. 小结
    hessian 将网络传输的对象转换为二进制流通过Http 进行传递,不过它是使用自己的序列化机制实现的编组与反编组,其支持的数据类型有限,不支持复杂的对象,Hessian的有点是可以透过防火墙。同时其缺乏安全机制,传输没有加密处理。

文章来源: feige.blog.csdn.net,作者:码农飞哥,版权归原作者所有,如需转载,请联系作者。

原文链接:feige.blog.csdn.net/article/details/79304864

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。