Hessian最佳实践
前言:本文主要介绍‘独立的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最佳实践的更多相关文章
- ASP.NET跨平台最佳实践
前言 八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营.有过短暂的失落和迷茫,但技术转型真的没有想象中那么难.回头审视,其实单从语言本身来看,C#确实比Java ...
- 《AngularJS深度剖析与最佳实践》简介
由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...
- ASP.NET MVC防范CSRF最佳实践
XSS与CSRF 哈哈,有点标题党,但我保证这篇文章跟别的不太一样. 我认为,网站安全的基础有三块: 防范中间人攻击 防范XSS 防范CSRF 注意,我讲的是基础,如果更高级点的话可以考虑防范机器人刷 ...
- 快速web开发中的前后端框架选型最佳实践
这个最佳实践是我目前人在做的一个站点,主要功能: oauth登录 发布文章(我称为"片段"),片段可以自定义一些和内容有关的指标,如“文中人物:12”.支持自定义排版.插图.建立相 ...
- Spring Batch在大型企业中的最佳实践
在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...
- Atitit.log日志技术的最佳实践attilax总结
Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...
- PHP核心技术与最佳实践——全局浏览
难得买到并喜欢一本好书,‘PHP核心技术与最佳实践’. 几天时间,先看了个大概,总结一下整体是什么样子的,怎么看怎么学. 1.总共14章: 2.第1.2章讲PHP的OOP: 其中第一章侧重于PHP的O ...
- Abp集成Swagger的最佳实践
1.在项目中添加nuget包 Abp.Web.Api.SwaggerTool 2.在项目Abp模块的DependsOn添加AbpWebApiSwaggerToolModule Run It,启动项目, ...
- MySQL · 答疑解惑 · MySQL 锁问题最佳实践
http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会 ...
随机推荐
- ios http请求
1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然 ...
- Shell if 判断之detail
参考: http://blog.chinaunix.net/uid-20788517-id-3135826.html
- bootstrap 之 xs,sm,md,lg && 主要颜色
mobile – xs ( <768px ) tablet – sm ( 768~991px ) desktop – md ( 992~1170px ) large desktop – lg ( ...
- amazon o2 - reverse second half linked list
public ListNode reverseBetween(ListNode head, int m, int n) { if(head==null) return head; ListNode s ...
- background-origin和background-clip的区别
background-origin和background-clip是CSS3内新增加的属性,其实一个是对背景图片的放置,另一个是对背景图片的剪裁. background-origin和backgrou ...
- Linux系统启动错误 contains a file system with errors, check forced解决方法
/dev/sda1 contains a file system with errors, check forced./dev/sda1: Inodes that were part of a cor ...
- 理解MySQL——索引与优化
转自:理解MySQL——索引与优化 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存 ...
- 29 个你必须知道的 Linux 命令
虽然Linux发行版支持各种各样的饿GUI(graphical user interfaces),但在某些情况下,Linux的命令行接口(bash)仍然是简单快速的.Bash和 Linux Shell ...
- eclipse搭建servlet项目
1.创建web项目 2.勾选Generate web.xml 3.创建Class文件并实现Servlet接口 当搜索Servlet接口时,如果未发现接口则Add library→选择tomcat版本至 ...
- cnblogs开篇留念
之前看过很多大牛程序员们介绍的一些经验之类的文章,几乎每个人都提到了一点就是平时要写博客,记录一些自己平时学习和工作过程中学习到的一些技术点和心得.之前也用过一些其他的网站博客,上周有同事推荐了一篇文 ...