前言:本文主要介绍‘独立的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. MySQL与Oracle的主要区别

    Mysql与Oracle区别 1. Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高. 2. ...

  2. Quartz Core框架之CALayer

    1.继承链:NSObject 2.创建一个layer (1)+ (instancetype)layer :创建和返回一个layer实例对象 (2)- (instancetype)init :返回一个初 ...

  3. time元素和datetime、pubtime属性

    time:对一个时间进行标识 <time datetime="2012-12-24">2012-12-24</time> datetime:时间的值 pub ...

  4. 设置时间&时区

    设置时间之前要先了解一件事,时间分为系统时间与硬件时间 如果硬件时间与系统时间不相同的话,经常会发现自己写的程序时间可能对不上 首先修改硬件时间 1)修改时区 输入命令: tzselect 按照指示选 ...

  5. NOIP 考前DP 复习

    POJ 2533 最长不降子序列 #include <cstdio> ; int a[Maxn],Pos[Maxn],F[Maxn],n,Ans; inline int Max(int x ...

  6. google vr开源 cardboard

    https://developers.google.com/cardboard/android/ 待续

  7. C#中MessageBox用法大全

    我们在程序中经常会用到MessageBox. MessageBox.Show()共有21中重载方法.现将其常见用法总结如下: 1.MessageBox.Show("Hello~~~~&quo ...

  8. Photoshop制作的海报修改~

    经过几天的征求意见,感觉还是要重新制作,于是把颜色删减了不少 . 这次运用了蒙版和渐变,但感觉效果不太好.再改.. 后来觉得给人的单身感有点少.. 不知道感觉如何,但自己觉得比以前好看..

  9. 关于几种编程过程中的注释(TODO、FIXME、XXX等)

    最近看别人写的代码,注意到很多规范的代码的注释写的都特别好.只是不太明白TODO.FIXME这些事什么意思.查阅资料,看到一篇博客,遂转载而来,以供今后查阅. (转载地址http://www.cnbl ...

  10. XenServer安全重启xapi的方法

    XenServer安全重启xapi的方法 2012-11-29 12:58:07|  分类: 虚拟化-XenServer|字号 订阅 平常我们很常用到重启xapi命令,在这介绍下xapi: XAPI( ...