前言:本文主要介绍‘独立的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. JS总结 本地对象1

    Data对象 用于获取当前时间的对象 例如,要用该对象输出:  2016年9月7日 10:57 星期三   这样格式的时间 var time=new Date(), month=time.getMon ...

  2. varnish 内置函数详细说明

    Subroutine列表 •vcl_recv 在请求开始时候被调用,在请求已经被接收到并且解析后调用.目的就是决定是否处理这个请求,怎么处理,使用哪个后端.vcl_recv以return结束,参数可以 ...

  3. 设置vim默认参数 例如设置默认背景颜色

    因个人喜好问题,本人使用vim的时候喜欢将背景颜色设为dark. 但是每次打开一个vim的时候都要重新设置一次,感觉非常麻烦. 总要输入[Esc] :set bg=dark很不方便 粗暴的办法是直接进 ...

  4. Spring之实现任务调度

    现实生活中,我们经常会制定一些"任务"在什么时间完成什么事情.同样在各种的企业中也会遇到这种任务调度的需求,比如商家或者网站的月报表 之类的要在每个月的最后一天统计各种数据,备份每 ...

  5. Stars_树状数组

    Problem Description Astronomers often examine star maps where stars are represented by points on a p ...

  6. Javascript、CSS和IMG之网页执行探索

    测试环境:windows/chrome 实例1:页面中仅有图片 <html xmlns="http://www.w3.org/1999/xhtml"> <head ...

  7. Less 语法特性

                                     ——(原创翻译:译者添加部分解释和代码运行结果) ♥在线Less编译器:LESS2CSS <一>综述 Less作为CSS的 ...

  8. Shell脚本检测文件夹是否已被挂载的方法

    方法1: if grep -qs '/mnt/foo' /proc/mounts; then echo "It's mounted." else echo "It's n ...

  9. git学习:关于origin和master

    [转载请注明出处]http://www.cnblogs.com/mashiqi 2016/10/27 本文主要是对这篇博客文章的理解. git的服务器端(remote)端包含多个repository, ...

  10. 学android:直接用jdk来helloworld

    本文稍稍了解下java的编译机制, 以及试试纯粹的jdk来helloworld 在jdk安装位置的bin 目录下看看jdk的工具 有许多的jdk的工具吧,当然,和bin同级的目录下还有jre, lib ...