前言:本文主要介绍‘独立的Hessian技术’与‘结合Spring技术’的两种Hessian接口开发模式及代码示例。

一.独立的Hessian技术开发步骤

Hessian-Java服务器端必须具备以下几点:
* 1.包含Hessian的jar包(hessian-4.0.37.jar)
* 2.设计一个接口,用来给客户端调用(IHessian.java)
* 3.实现该接口的功能(IHessianImpl.java)
* 4.配置web.xml,配好相应的Servlet(web.xml)
* 5.对象必须实现Serializable接口(Foo.java)

Hessian-JAVA服务端代码预览图:

1.包含Hessian的jar包(hessian-4.0.37.jar)
re:可到Hessian官网http://hessian.caucho.com/,下载最新的Hessian包或见本文附件。

2.设计一个接口,用来给客户端调用(IHessian.java) 

package my.hessian.service;

import my.hessian.model.Foo;

/**
* 定义对外提供服务的接口(Hessian简单入门)[纯Hessian]
*
* Hessian是一个简单的连接Web服务的二进制协议
*
* Hessian-JAVA服务器端必须具备以下几点:
* 1.包含Hessian的jar包
* 2.设计一个接口,用来给客户端调用
* 3.实现该接口的功能
* 4.配置web.xml,配好相应的Servlet
* 5.对象必须实现Serializable接口
*
* @author WChao
* @version [My-1.0, 2016-2-21]
*/
public interface IHessian
{
public Foo getFoo();
}

IHessian

3.实现该接口的功能(IHessianImpl.java) 

package my.hessian.service.impl;

import my.hessian.model.Foo;
import my.hessian.service.IHessian; /**
* 接口的具体实现类[纯Hessian]
*
* @author WChao
* @version [My-1.0, 2016-2-21]
*/
public class IHessianImpl implements IHessian
{
public Foo getFoo()
{
System.out.println("call getFoo method ~");
Foo foo = new Foo();
foo.setParam("Hi, This is my first Hessian demo.");
return foo;
}
}

IHessianImpl

4.配置web.xml,配好相应的Servlet(web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <servlet>
<!-- 配置HessianServlet, 此处ServiceServlet名字可以自定义-->
<servlet-name>ServiceServlet</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <!-- 配置接口的具体实现类 -->
<init-param>
<param-name>service-class</param-name>
<param-value>my.hessian.service.impl.IHessianImpl</param-value>
</init-param>
</servlet>
<!-- 映射HessianServlet的访问URL地址-->
<servlet-mapping>
<servlet-name>ServiceServlet</servlet-name>
<url-pattern>/HessianFoo</url-pattern>
</servlet-mapping> <!--
Tips: Hessian与Spring集成的重要文件为什么叫remote-servlet.xml ?
因为在web.xml中有配置:<servlet-name>remote</servlet-name>
所以remote-servlet.xml的文件名必须以<servlet-name>中配置的servlet-name作为文件名的开头,
且文件名的格式必须是[servlet-name]-servlet.xml格式,否则检测不到。 即:
<param-value>remote-servlet</param-value>所以文件名为remote-servlet.xml
-->
<servlet>
<servlet-name>remote</servlet-name>
<!-- 使用Spring的代理Servlet -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- init-param的配置可选,remote-servlet.xml文件默认放置WEB-INF/下面 -->
<!-- 如果想自定义remote-servlet.xml名字,修改namespace对应param-value即可 -->
<!--
<init-param>
<param-name>namespace</param-name>
<param-value>remote-servlet</param-value>
</init-param>
-->
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>remote</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping> </web-app>

web.xml

5.对象必须实现Serializable接口(Foo.java)

package my.hessian.model;

import java.io.Serializable;

/**
* 创建一个Foo类,同时实现序列化接口,
* Description: Foo实现了序列化接口后就可以进行序列化,然后就可以通过网络将序列化后的Foo传输到另一台计算机上
*
* @author WChao
* @version [My-1.0, 2016-2-21]
*/
public class Foo implements Serializable
{
private static final long serialVersionUID = 1L; private String param = ""; public String getParam()
{
return param;
} public void setParam(String param)
{
this.param = param;
} public String toString()
{
return this.param;
}
}

Foo

Hessian-Java客户端必须具备以下几点:
* 1.java客户端包含hessian.jar的包(hessian-4.0.37.jar) 
* 2.具有和服务器端结构一样的接口及涉及Bean对象(MyHessianServer.jar-Foo.class)
* 3.利用HessianProxyFactory调用远程接口(HessianClient.java)

Hessian-JAVA客户端端代码预览图:

1.java客户端包含hessian.jar的包(hessian-4.0.37.jar) 
re: 可到Hessian官网:http://hessian.caucho.com/,下载最新的Hessian包或见本人附件。

2.具有和服务器端结构一样的接口及涉及Bean对象(MyHessianServer.jar-Foo.class)
re: 见本文附件中的MyHessianServer.jar。

3.利用HessianProxyFactory调用远程接口(HessianClient.java)

package my.hessianclient;

import java.net.MalformedURLException;

import my.hessian.model.Foo;
import my.hessian.service.IHessian;
import my.hessian.service.IHessianOfSpring; import com.caucho.hessian.client.HessianProxyFactory; /**
* 调用纯Hessian的客户端
*
* 客户端必须具备以下几点:
* 1.java客户端包含hessian.jar的包
* 2.具有和服务器端结构一样的接口及涉及Bean对象
* 3.利用HessianProxyFactory调用远程接口
*
* @author WChao
* @version [My-1.0, 2016-2-21]
*/
public class HessianClient
{ public static void main(String[] args) throws MalformedURLException
{
/*
<servlet>
<!-- 配置HessianServlet, 此处ServiceServlet名字可以自定义-->
<servlet-name>ServiceServlet</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <!-- 配置接口的具体实现类 -->
<init-param>
<param-name>service-class</param-name>
<param-value>my.hessian.service.impl.IHessianImpl</param-value>
</init-param>
</servlet>
<!-- 映射HessianServlet的访问URL地址-->
<servlet-mapping>
<servlet-name>ServiceServlet</servlet-name>
<url-pattern>/HessianFoo</url-pattern>
</servlet-mapping>
*/ // 使用HessianProxyFactory Hessian代理工厂直接调用
HessianProxyFactory factory = new HessianProxyFactory(); // 在服务器端的web.xml文件中配置的HessianServlet映射的访问URL地址
// 纯Hessian接口
String url = "http://localhost:8080/HessianServer/HessianFoo";
// 创建IHessian接口的实例对象
IHessian iHessian = (IHessian) factory.create(IHessian.class, url); Foo myFoo = iHessian.getFoo();
System.out.println(myFoo); System.out.println("------------------------------------------------------"); // HessianServiceExporter only supports POST requests
// Hessian与Spring集成接口
url = "http://localhost:8080/HessianServer/remoting/IHessianOfSpring";
IHessianOfSpring iHessianOfSpring = (IHessianOfSpring) factory.create(IHessianOfSpring.class, url); myFoo = iHessianOfSpring.getFoo();
System.out.println(myFoo); // 打印结果:
// Hi, This is my first Hessian demo.
// ------------------------------------------------------
// Hi, This is my first Hessian + Spring demo.
}
}

HessianClient

二.Hessian+Spring 接口开发步骤

Hessian+Spring服务端开发步骤与独立的Hessian接口的区别:

a、web.xml配置不同

<servlet>
<servlet-name>remote</servlet-name>
<!-- 使用Spring的代理Servlet -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- init-param的配置可选,remote-servlet.xml文件默认放置WEB-INF/下面 -->
<!-- 如果想自定义remote-servlet.xml名字,修改namespace对应param-value即可 -->
<!--
<init-param>
<param-name>namespace</param-name>
<param-value>remote-servlet</param-value>
</init-param>
-->
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>remote</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>

web.xml

b、多了remote-servlet.xml文件及配置

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 接口的具体实现类 -->
<bean id="iHessianOfSpringImpl" class="my.hessian.service.impl.IHessianOfSpringImpl" /> <!-- 使用Spring的HessianServie做代理 -->
<bean name="/IHessianOfSpring"
class="org.springframework.remoting.caucho.HessianServiceExporter">
<!-- service引用具体的实现实体Bean-->
<property name="service" ref="iHessianOfSpringImpl" />
<property name="serviceInterface" value="my.hessian.service.IHessianOfSpring" />
</bean> <!-- 可以配置多个HessianServiceExporter代理Bean -->
</beans>

remote-servlet.xml

Hessian+Spring客户端开发步骤与独立的Hessian接口的区别:

1、除了可以使用HessianProxyFactory Hessian代理工厂直接调用,还可以使用HessianProxyFactoryBean Hessian代理工厂Bean来完成接口调用

package my.hessianclient;

import my.hessian.model.Foo;
import my.hessian.service.IHessianOfSpring; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* 调用Hessian与Spring集成接口的客户端
* Description: 使用HessianProxyFactoryBean Hessian代理工厂Bean来完成接口调用
*
* @author WChao
* @version [My-1.0, 2016-2-21]
*/
public class HessianAndSpringClient
{
public static void main(String[] args)
{
ApplicationContext contex = new ClassPathXmlApplicationContext("remote-client.xml"); // 获得客户端的Hessian代理工厂bean
IHessianOfSpring i = (IHessianOfSpring) contex.getBean("myClient");
Foo myFoo = i.getFoo();
System.out.println(myFoo); // 打印结果:
// Hi, This is my first Hessian + Spring demo.
}
}

HessianAndSpringClient

2、多了remote-client.xml的Spring文件配置

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 客户端Hessian代理工厂Bean -->
<bean id="myClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<!-- 请求代理Servlet路径 -->
<property name="serviceUrl">
<value>http://localhost:8080/HessianServer/remoting/IHessianOfSpring</value>
</property>
<!-- 接口定义 -->
<property name="serviceInterface">
<value>my.hessian.service.IHessianOfSpring</value>
</property>
</bean>
</beans>

remote-client.xml

代码下载:

Hessian服务端:HessianServer, Hessian客户端:HessianClient

POI:

转:https://community.oracle.com/docs/DOC-887397

转:http://blog.csdn.net/spp_1987/article/details/13770637

Hessian最佳实践的更多相关文章

  1. ASP.NET跨平台最佳实践

    前言 八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营.有过短暂的失落和迷茫,但技术转型真的没有想象中那么难.回头审视,其实单从语言本身来看,C#确实比Java ...

  2. 《AngularJS深度剖析与最佳实践》简介

    由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...

  3. ASP.NET MVC防范CSRF最佳实践

    XSS与CSRF 哈哈,有点标题党,但我保证这篇文章跟别的不太一样. 我认为,网站安全的基础有三块: 防范中间人攻击 防范XSS 防范CSRF 注意,我讲的是基础,如果更高级点的话可以考虑防范机器人刷 ...

  4. 快速web开发中的前后端框架选型最佳实践

    这个最佳实践是我目前人在做的一个站点,主要功能: oauth登录 发布文章(我称为"片段"),片段可以自定义一些和内容有关的指标,如“文中人物:12”.支持自定义排版.插图.建立相 ...

  5. Spring Batch在大型企业中的最佳实践

    在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...

  6. Atitit.log日志技术的最佳实践attilax总结

    Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...

  7. PHP核心技术与最佳实践——全局浏览

    难得买到并喜欢一本好书,‘PHP核心技术与最佳实践’. 几天时间,先看了个大概,总结一下整体是什么样子的,怎么看怎么学. 1.总共14章: 2.第1.2章讲PHP的OOP: 其中第一章侧重于PHP的O ...

  8. Abp集成Swagger的最佳实践

    1.在项目中添加nuget包 Abp.Web.Api.SwaggerTool 2.在项目Abp模块的DependsOn添加AbpWebApiSwaggerToolModule Run It,启动项目, ...

  9. MySQL · 答疑解惑 · MySQL 锁问题最佳实践

    http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会 ...

随机推荐

  1. 深入浅出REST

    不知你是否意识到,围绕着什么才是实现异构的应用到应用通信的“正确”方式,一场争论正进行的如火如荼:虽然当前主流的方式明显地集中在基于SOAP.WSDL和WS-*规范的Web Services领域,但也 ...

  2. java java.lang.NoClassDefFoundError 的解决办法

    以简单而经典的 "HelloWorld.java" 为例 不含包层次的HelloWorld.Java public class HelloWorld { public static ...

  3. Shiro安全登录框架

    环境准备 本文使用Maven构建,因此需要一点Maven知识.首先准备环境依赖: <dependencies> <dependency> <groupId>juni ...

  4. js继承相关

    这几天看到一篇文章详解Javascript的继承实现,发现js还是很深奥的,比如call.apply.prototype这些,问起来我也能说的头头是道的,但是看到一些复杂的代码有的时候还是会迷糊,所以 ...

  5. mysql登录不了及修改密码

    安装mariadb,默认是无密码的,但一般是指要设置密码的.在设置密码时出现各种问题,可能还是不太明白其原理. 一下我尝试了两种方法,但都失败了.下面这两个是我尝试的方法: 一.网上最多的方法是 1. ...

  6. 如何用js定义数组,用js来拼接json字段

    定义js数组的方式有: var arr = (); var arr = []; var arr = new Array(); 如何拼接成一个json字段. <!DOCTYPE HTML PUBL ...

  7. win7系统下的FTP配置

    2016-07-12 工作中需要在win7操作系统下配置FTP,遇到许多问题,所以记录下来方便以后解决问题. FTP是文件传输协议的简称.用于Internet上的控制文件的双向传输.同时,它也是一个应 ...

  8. isKindOfClass,isMemberOfClass

    - (BOOL)isKindOfClass:(Class)aClass; - (BOOL)isMemberOfClass:(Class)aClass; 特点: 1.isKindOfClass   判断 ...

  9. linux磁盘存储命令 磁盘存储命令

    硬盘空间是一个有限的资源, 硬盘空间是一个有限的资源,用户用下面的命令 可 以随时了解当前硬盘空间的使用情况. 以随时了解当前硬盘空间的使用情况.   ? du,df命令 查看磁盘空间状况的操作 , ...

  10. linux进程命令

    1. ps命令 命令 命令名称: 命令名称: ps 功能: 功能: 查询正在执行的进程 语法: 可选参数] 语法: ps [可选参数] 描述: 命令提供 命令提供Linux系统中正在发生的事情的   ...