zl程序教程

您现在的位置是:首页 >  后端

当前栏目

hessian与Spring MVC的整合

SpringMVC 整合
2023-09-27 14:19:46 时间

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

目录介绍

1. hessian的介绍
2. hessian与Spring  MVC的整合
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>
 - 服务端的整合
   **web.xml**
  <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>

由于,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>

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

实体类 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 +
                '}';
    }
}

注意,此处实体类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();
    }
}

好了,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;
    }
}

在此处,我们指定了接口类以及他的实现类。至此,服务端就配置好了。我们可以在浏览器上直接输入 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>

接着,我们先写个简单的测试类。
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();
        }
    }
}

在此处我们首先创建了一个反向代理的工厂类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. 小结
    hessian 将网络传输的对象转换为二进制流通过Http 进行传递,不过它是使用自己的序列化机制实现的编组与反编组,其支持的数据类型有限,不支持复杂的对象,Hessian的有点是可以透过防火墙。同时其缺乏安全机制,传输没有加密处理。