[转载] hessian学习

转载自http://www.cnblogs.com/yjmyzz/p/hessian-helloworld.html

hessian是一个采用二进制格式传输的服务框架,相对传统soap web service,更轻量,更快速。官网地址:http://hessian.caucho.com/

目前已经支持N多语言,包括:java/c#/flex/php/ruby...

maven的依赖项如下:

1 <dependency>
2     <groupId>com.caucho</groupId>
3     <artifactId>hessian</artifactId>
4     <version>4.0.37</version>
5 </dependency>

入门示例:

一、服务端开发

1.1 先建服务接口

1 package yjmyzz.cnblogs.com.service;
2
3 public interface HelloService {
4
5     public String helloWorld(String message);
6 }

1.2 提供服务实现

 1 package yjmyzz.cnblogs.com.service.impl;
 2
 3 import yjmyzz.cnblogs.com.service.HelloService;
 4
 5 public class HelloServiceImpl implements HelloService {
 6
 7     @Override
 8     public String helloWorld(String message) {
 9         return "hello," + message;
10     }
11
12 }

1.3 修改web.xml

 1 <!DOCTYPE web-app PUBLIC
 2  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 3  "http://java.sun.com/dtd/web-app_2_3.dtd" >
 4
 5 <web-app>
 6     <display-name>hessian-showcase</display-name>
 7
 8     <welcome-file-list>
 9         <welcome-file>index.jsp</welcome-file>
10     </welcome-file-list>
11
12     <servlet>
13         <servlet-name>hessian-service</servlet-name>
14
15         <servlet-class>
16             com.caucho.hessian.server.HessianServlet
17         </servlet-class>
18
19         <init-param>
20             <param-name>home-class</param-name>
21             <param-value>
22                 <!-- 服务实现类 -->
23                 yjmyzz.cnblogs.com.service.impl.HelloServiceImpl
24             </param-value>
25         </init-param>
26
27         <init-param>
28             <param-name>home-api</param-name>
29             <!-- 服务接口 -->
30             <param-value>yjmyzz.cnblogs.com.service.HelloService</param-value>
31         </init-param>
32
33     </servlet>
34
35     <servlet-mapping>
36         <servlet-name>hessian-service</servlet-name>
37         <url-pattern>/hessian</url-pattern>
38     </servlet-mapping>
39
40 </web-app>

部署到tomcat或其它web容器中即可。
1.4 导出服务接口jar包

最终服务是提供给客户端调用的,客户端必须知道服务的接口信息(包括接口方法中的传输dto定义),所以得将这些java文件导出成jar,提供给调用方。

方法很简单:eclipse中在接口package(包括dto对应的package)上右击,选择Export

再选择Jar File

二、客户端调用

同样先添加maven的hessian依赖项,同时引入上一步导出的服务接口jar包,然后参考下面的示例代码:

 1 import java.net.MalformedURLException;
 2 import org.junit.Test;
 3 import yjmyzz.cnblogs.com.service.HelloService;
 4 import com.caucho.hessian.client.HessianProxyFactory;
 5
 6
 7 public class ServiceTest {
 8     @Test
 9     public void testService() throws MalformedURLException {
10
11         String url = "http://localhost:8080/hessian-showcase/hessian";
12         System.out.println(url);
13
14         HessianProxyFactory factory = new HessianProxyFactory();
15         HelloService helloService = (HelloService) factory.create(HelloService.class, url);
16         System.out.println(helloService.helloWorld("jimmy"));
17
18     }
19 }

三、与Spring的整合

spring-web包里提供的org.springframework.remoting.caucho.HessianServiceExporter类,可以将普通方法导出成hessian服务。关键是解决org.springframework.web.servlet.DispatcherServlet的url访问路径问题,一般情况下,我们是这样配置的

 1     <!-- spring mvc -->
 2     <servlet>
 3         <servlet-name>appServlet</servlet-name>
 4         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 5         <init-param>
 6             <param-name>contextConfigLocation</param-name>
 7             <param-value>classpath:servlet-context.xml</param-value>
 8         </init-param>
 9         <load-on-startup>1</load-on-startup>
10         <async-supported>true</async-supported>
11     </servlet>
12
13     <servlet-mapping>
14         <servlet-name>appServlet</servlet-name>
15         <url-pattern>/</url-pattern>
16     </servlet-mapping>

这是spring mvc的入口,拦截所有访问路径,可以把这一节再复制一份,追加在后面,只不过url-pattern指定成特定的规则

 1 <!-- spring mvc -->
 2     <servlet>
 3         <servlet-name>appServlet</servlet-name>
 4         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 5         <init-param>
 6             <param-name>contextConfigLocation</param-name>
 7             <param-value>classpath:servlet-context.xml</param-value>
 8         </init-param>
 9         <load-on-startup>1</load-on-startup>
10         <async-supported>true</async-supported>
11     </servlet>
12
13     <servlet-mapping>
14         <servlet-name>appServlet</servlet-name>
15         <url-pattern>/</url-pattern>
16     </servlet-mapping>
17
18
19     <!-- hessian -->
20     <servlet>
21         <servlet-name>hessianServlet</servlet-name>
22         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
23         <init-param>
24             <param-name>contextConfigLocation</param-name>
25             <param-value>classpath:hessian-context.xml</param-value>
26         </init-param>
27         <load-on-startup>1</load-on-startup>
28     </servlet>
29
30     <servlet-mapping>
31         <servlet-name>hessianServlet</servlet-name>
32         <url-pattern>/hessian/*</url-pattern>
33     </servlet-mapping>

这样,所有以/hessian/开头的访问路径,约定成hessian服务地址,详细配置在hessian-context.xml中,内容如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
 6         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 7         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 8
 9
10     <bean id="helloServiceImpl" class="com.cnblogs.yjmyzz.service.hessian.support.HelloServiceImpl" />
11
12     <!-- 使用HessianServiceExporter 将普通bean导出成Hessian服务 -->
13     <bean name="/service"
14         class="org.springframework.remoting.caucho.HessianServiceExporter">
15         <property name="service" ref="helloServiceImpl" />
16         <!-- Hessian服务的接口 -->
17         <property name="serviceInterface" value="com.cnblogs.yjmyzz.service.hessian.HelloService" />
18     </bean>
19
20 </beans>

这样,就能直接以http://localhost:8080/spring-mvc4-rest/hessian/service 发布hessian服务了

再来看看客户端如何整合,类似的,我们需要一个配置文件,比如:hessian-client.xml,内容如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans.xsd
 6         http://www.springframework.org/schema/context
 7         http://www.springframework.org/schema/context/spring-context.xsd">
 8
 9     <bean id="hessianClient"
10         class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
11         <property name="serviceUrl">
12             <value>http://localhost:8080/spring-mvc4-rest/hessian/service</value>
13         </property>
14         <property name="serviceInterface">
15             <value>com.cnblogs.yjmyzz.service.hessian.HelloService</value>
16         </property>
17     </bean>
18
19 </beans>

调用示例:

 1 package com.cnblogs.yjmyzz.test;
 2 import java.net.MalformedURLException;
 3
 4 import org.junit.Test;
 5 import org.springframework.context.ApplicationContext;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7
 8 import com.cnblogs.yjmyzz.service.hessian.HelloService;
 9
10 public class HessianServiceTest {
11     @SuppressWarnings("resource")
12     @Test
13     public void testService() throws MalformedURLException {
14         ApplicationContext context = new ClassPathXmlApplicationContext(
15                 "hessian-client.xml");
16         HelloService hello = (HelloService) context.getBean("hessianClient");
17         System.out.println(hello.helloWorld("jimmy.yang"));
18     }
19 }

示例源码地址:http://code.taobao.org/p/spring-mvc4-rest/src/

时间: 2025-01-07 07:02:33

[转载] hessian学习的相关文章

Hessian学习总结(一)——Hessian入门 (来源于网络分享)

Hessian学习总结(一)——Hessian入门 一.远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http . tcp . udp 等等, http . tcp . udp 都是在基于 Socket 概念上为某类应用场景而扩展出的传输协议,网络 IO ,主要有 bio . nio . aio 三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应

转载 TCPIP学习笔记之概述

1.分层 网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能.一个协议族,比如 T C P / I P,是一组不同层次上的多个协议的组合. T C P / I P通常被认为是一个四层协议系统,其示意图如下: (图1)TCP/IP协议族的四个层次 每一层负责不同的功能: 1) 链路层: 有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节. 2)网络层: 有时也称作互联网层,处理分组在网络中的

转载FPGA学习之内嵌乘法器调用

补充一点,除法的时候如果直接a/b那么就会调用lpm模块,不管输入是否是常数,乘法的时候输入都是reg型变量会调用硬件乘法器,有一个是常数就会调用lpm模块. 上课的时候一直听老师说真正实践的时候你别想着要自己写一个乘法器,那样子做的孩子是笨蛋. 不管老师说得对不对,总之,既然FPGA内部有硬件乘法器那么为啥不直接使用呢,而且在写verilog使用是非常简单的,只是用个*号就轻易搞定. 只要所使用的FPGA内嵌有乘法器,则综合软件在综合的时候就会自动帮你调用乘法器实现. 下面是一段简单代码: m

[转载] Java学习之Hessian通信基础

转载自http://blog.sina.com.cn/s/blog_7f73e06d0100xn9j.html 一.首先先说Hessian是什么?    Hessian:hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能,相比WebService,Hessian更简单.快捷.采用的是二进制RPC协议,因为采用了二进制协议,所以它很适合于发送二进制数据,Hessian主要作面向对象的消息通信.Hessian的初衷就是支持动态类型,格式紧凑,跨语言Hes

转载-Python学习笔记之文件读写

Python 文件读写 Python内置了读写文件的函数,用法和C是兼容的.本节介绍内容大致有:文件的打开/关闭.文件对象.文件的读写等. 本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件读写,也需要注意编码问题:其他文件的读写及编码相关详见专题的博文. open()   close()     with open(...) as ... 看以下示例就能了解 Python 的 open() 及 close() 函数.这边调用 read()方法可以一次读取文件的全部内容,Python把

【转载】学习资料存档:jQuery的deferred对象详解

我在以前的文章里提到promise和deferred,这两个东西其实是对回调函数的一种写法,javascript的难点之一是回调函数,但是我们要写出优秀的javascript代码又不得不灵活运用回调函数,大型javascript代码里都会大量运用回调函数,大量的标准回调函数写法的坏处就是使得代码的阅读性和可维护性降低,因此出现了promise模式和大量deferred库,jQuery很优秀,但是jQuery早期的版本对优雅回调写法的支持远远不够,直到jQuery1.5引入了deferred后,这

Java学习之路-Hessian学习

Hessian是基于HTTP的轻量级远程服务解决方案,Hessian像Rmi一样,使用二进制消息进行客户端和服务器端交互.但与其他二进制远程调用技术(例如Rmi)不同的是,它的二进制消息可以移植其他非Java的语言中.  一.创建Hessian程序的4个步骤  1.定义一个远程接口的接口.  2.定义一个实现该接口的类.  3.在web.xml中定义导出Hessian服务需要的信息.  4.编写客户端访问代码.  二.程序的具体实现  一.首先我们先创建Web项目,并新建一个实体类,这个类需要实

hessian学习

hessian是一个采用二进制格式传输的服务框架,相对传统soap web service,更轻量,更快速.官网地址:http://hessian.caucho.com/ 目前已经支持N多语言,包括:java/c#/flex/php/ruby... maven的依赖项如下: 1 <dependency> 2     <groupId>com.caucho</groupId> 3     <artifactId>hessian</artifactId&g

[转载]JNI学习积累之一 ---- 常用函数大全

本文转载于:http://blog.csdn.net/qinjuning 最近一段时间,在工作方面比较闲,分配的Bug不是很多,于是好好利用这段时间就着源代码看了些许模块, 主要方式 还是贼看贼看代码, 同时利用烧机的便利,加Log观看,基本上都能弄个脸熟 .心里想着该写点什么了?可是水平不够,再加上 包括很多真正实现地方--中间层,基本上没看.于是乎,也就不好卖弄了. 花了几天时间研究了下JNI,基本上知道如何使用了.照我的观点JNI还是不难的,难得只是我们一份尝试的心. 学习过程中, 发现关