前言:本文主要介绍‘独立的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. mac搭建本地svn

    1.终端,创建SVN资源文件库 svnadmin create /Volumes/DATA/SVNTest 2配置权限 上面的语句执行完之后在相应路径下可以找到该文件夹,打开之后 这里主要是修改con ...

  2. 获取局域网中指定IP或是主机名称的所有文件夹及其搜索文件

    最近做个功能在局域网中所有指定文件,于是花了点精力完成了部分功能,先贴上 using System; using System.Collections.Generic; using System.Co ...

  3. RSA_SHA256数字签名

    ------------------ rsa 加密与解密 ----------------------------- 数论知识的实际应用: rsa加密 把问题归结为对数字的加密. 被加密的数字为明文. ...

  4. maya的卡通渲染

    为了统一工作流,给maya也做了个卡通shader:

  5. HTML5新增标签及具体用法

    html5自从推广普及以来,迅速被各大浏览器支持.采用html5设计的网页逐渐成为网页设计的时尚.下面就温习下html5的新增标签. HTML 5 中的新特性包括了嵌入音频.视频和图形的功能,客户端数 ...

  6. Java用户线程和守护线程

    今天看Java一个关于多线程返回值方式的示例,发现一个自己不太能理解的问题,就是在主线程中启动了几个工作线程,主线程中也没有join,工作线程居然也是正常输出了回调的结果.这个跟linux C++下的 ...

  7. C++构造函数与虚表覆盖

    在涉及到虚函数的情况下,C++构造函数的构造顺序为:先调用构造函数,虚表指针初始化,用户代码:如涉及到多重继承情况,初始化顺序为基类.子类(从左至右),假设一个类的继承情况如下图,其初始化顺序为:Po ...

  8. javascript在html中的加载顺序

    参考:[1]http://coolshell.cn/articles/9749.html(酷壳) [2]http://shaozhuqing.com/?p=2756 [3]http://www.cnb ...

  9. li标签的点击范围

    <div class="login_menu_choose"> <ul class="cursor">                & ...

  10. c# chart

    1.随便一个例子 string sql = "select distinct count(*) as c,datepart(day,ull_loginTime) as a from user ...