加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

小试Hessian实现Webservice

发布时间:2020-12-16 23:00:11 所属栏目:安全 来源:网络整理
导读:Hessian是一个轻量级的remoting on http工具,采用的是Binary RPC协议,所以它很适合于发送二进制数据,同时又具有防火墙穿透能力。Hessian一般是通过Web应用来提供服务,因此非常类似于平时我们用的WebService。只是它不使用SOAP协议,但相比webservice而言更

Hessian是一个轻量级的remoting on http工具,采用的是Binary RPC协议,所以它很适合于发送二进制数据,同时又具有防火墙穿透能力。Hessian一般是通过Web应用来提供服务,因此非常类似于平时我们用的WebService。只是它不使用SOAP协议,但相比webservice而言更简单、快捷。

Hessian官网:http://hessian.caucho.com/

Hessian可通过Servlet提供远程服务,需要将匹配某个模式的请求映射到Hessian服务。也可Spring框架整合,通过它的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类,用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,建议采用面向接口编程,Hessian服务通过接口暴露。

Hessian处理过程示意图:

客户端——>序列化写到输出流——>远程方法(服务器端)——>序列化写到输出流 ——>客户端读取输入流——>输出结果

下面详细介绍最常用的两种方式实现Hessian提供webservice:

纯Hessian实现

配合Spring框架实现

在开始之前当然需要到官网上下载相关的lib包,放入项目的/WEB-INF/lib/下

【一】、纯Hessian实现步骤:

1.基本代码

首先编写一个服务的接口类:HelloHessian.java

package?michael.hessian;?????
import?java.util.List;?????
import?java.util.Map;?????
????
/**????
?*?@author?michael????
?*?????
?*/????
public?interface?HelloHessian?{?????
????
????String?sayHello();?????
????
????MyCar?getMyCar();?????
????
????List?myLoveFruit();?????
????
????Map?myBabays();?????
????
}

一个java bean文件MyCar.java:

Java代码

package?michael.hessian;?????
????
import?java.io.Serializable;?????
????
/**????
?*?@author?michael????
?*?????
?*/????
public?class?MyCar?implements?Serializable?{?????
????
????/**????
?????*?????
?????*/????
????private?static?final?long?serialVersionUID?=?4736905401908455439L;?????
????
????private?String?carName;?????
????
????private?String?carModel;?????
????
????/**????
?????*?@return?the?carName????
?????*/????
????public?String?getCarName()?{?????
????????return?carName;?????
????}?????
????
????/**????
?????*?@return?the?carModel????
?????*/????
????public?String?getCarModel()?{?????
????????return?carModel;?????
????}?????
????
????/**????
?????*?@param?pCarName?the?carName?to?set????
?????*/????
????public?void?setCarName(String?pCarName)?{?????
????????carName?=?pCarName;?????
????}?????
????
????/**????
?????*?@param?pCarModel?the?carModel?to?set????
?????*/????
????public?void?setCarModel(String?pCarModel)?{?????
????????carModel?=?pCarModel;?????
????}?????
????
????/**????
?????*?@see?java.lang.Object#toString()????
?????*?@return????
?????*/????
????@Override????
????public?String?toString()?{?????
????????return?"my?car?name:["?+?this.carName?+?"]?model:["?+?this.carModel?????
????????????????+?"].";?????
????}?????
????
}

服务端接口的实现类:HelloHessianImpl.java

Java代码

package?michael.hessian.impl;?????
????
import?java.util.ArrayList;?????
import?java.util.HashMap;?????
import?java.util.List;?????
import?java.util.Map;?????
????
import?michael.hessian.HelloHessian;?????
import?michael.hessian.MyCar;?????
????
/**????
?*?@author?michael????
?*?????
?*/????
public?class?HelloHessianImpl?extends?HessianServlet?implements?HelloHessian?{?????
????
????public?MyCar?getMyCar()?{?????
????????MyCar?car?=?new?MyCar();?????
????????car.setCarName("阿斯顿·马丁");?????
????????car.setCarModel("One-77");?????
????????return?car;?????
????}?????
????
????public?Map?myBabays()?{?????
????????Map?map?=?new?HashMap();?????
????????map.put("son",?"孙吴空");?????
????????map.put("daughter",?"孙小美");?????
????????return?map;?????
????}?????
????
????public?List?myLoveFruit()?{?????
????????List?list?=?new?ArrayList();?????
????????list.add("apple");?????
????????list.add("kiwi");?????
????????list.add("orange");?????
????????return?list;?????
????}?????
????
????public?String?sayHello()?{?????
????????return?"welcom?to?Hessian";?????
????}?????
????
}

2.配置文件web.xml修改

在web.xml配置文件里增加如下信息:

Xml代码

<servlet>????
????????<servlet-name>HelloHessianservlet-name>????
????????<servlet-class>????
????????????com.caucho.hessian.server.HessianServlet?????
????????servlet-class>????
????????<init-param>????
????????????<param-name>home-classparam-name>????
????????????<param-value>michael.hessian.impl.HelloHessianImplparam-value>????
????????init-param>????
????????<init-param>????
????????????<param-name>home-apiparam-name>????
????????????<param-value>michael.hessian.HelloHessianparam-value>????
????????init-param>????
????????<load-on-startup>1load-on-startup>????
????servlet>????
????<servlet-mapping>????
????????<servlet-name>HelloHessianservlet-name>????
????????<url-pattern>/HessianServiceurl-pattern>????
????servlet-mapping>????
????<servlet-mapping>

3.java客户端验证

Java代码

package?michael.hessian.client;?????
????
import?java.net.MalformedURLException;?????
import?java.util.Map;?????
????
import?michael.hessian.HelloHessian;?????
import?michael.hessian.MyCar;?????
????
import?com.caucho.hessian.client.HessianProxyFactory;?????
????
/**????
?*?@author?michael????
?*????
?*/????
public?class?HessianClientTest?{?????
????
????/**????
?????*?@param?args????
?????*/????
????public?static?void?main(String[]?args)?{?????
????????String?url?=?"http://localhost:8082/J2EE_sjsky/HessianService";?????
????????HessianProxyFactory?factory?=?new?HessianProxyFactory();?????
????????try?{?????
????????????HelloHessian?hello?=?(HelloHessian)?factory.create(?????
????????????????????HelloHessian.class,?url);?????
????????????System.out.println(hello.sayHello());?????
????
????????????MyCar?car?=?hello.getMyCar();?????
????????????System.out.println(car.toString());?????
????
????????????for?(Map.Entry?entry?:?hello.myBabays().entrySet())?{?????
????????????????System.out.println(entry.getKey()?+?"???"?+?entry.getValue());?????
????????????}?????
????
????????????for?(String?str?:?hello.myLoveFruit())?{?????
????????????????System.out.println(str);?????
????????????}?????
????
????????}?catch?(MalformedURLException?e)?{?????
????????????e.printStackTrace();?????
????????}?????
????
????}?????
????
}

运行结果如下:

Java代码

welcom?to?Hessian?????
my?car?name:[阿斯顿·马丁]?model:[One-77].?????
daughter???孙小美?????
son???孙吴空?????
apple?????
kiwi?????
orange

【二】、spring+hessian 实现服务端:

1.基本代码见上面的demo

2.修改配置文件

在web.xml,增加内容如下:

Xml代码

<servlet>????
????????<servlet-name>springhessianservlet-name>????
????????<servlet-class>????
????????????org.springframework.web.servlet.DispatcherServlet?????
????????servlet-class>????
????????????
????<bean?name="/helloHessianService"????
????????class="org.springframework.remoting.caucho.HessianServiceExporter">????
????????????
????????<property?name="service"?ref="helloHessianImpl"?/>????
????????????
????????<property?name="serviceInterface"????
????????????value="michael.hessian.HelloHessian"?/>????
????bean>????
beans>

和上面的例子相似,只需要把访问的url替换成新的即可如下:

Java代码

String?url=http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService

运行结果和上面例子一样。

4.spring配置客户端

增加一个spring的bean配置文件hessian-client.xml

Xml代码

xml?version="1.0"?encoding="UTF-8"?>????
>????
<beans>????
????<bean?id="helloHessianClient"????
????????class="org.springframework.remoting.caucho.HessianProxyFactoryBean">????
????????<property?name="serviceUrl">????
????????????<value>????
????????????????http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService?????
????????????value>????
????????property>????
????????<property?name="serviceInterface"????
????????????value="michael.hessian.HelloHessian"?/>????
????bean>????
beans>

测试代码HessianSpringClient.java:

Java代码

package?michael.hessian.client;?????
????
import?java.util.Map;?????
????
import?michael.hessian.HelloHessian;?????
import?michael.hessian.MyCar;?????
????
import?org.springframework.context.ApplicationContext;?????
import?org.springframework.context.support.ClassPathXmlApplicationContext;?????
????
/**????
?*?@author?michael????
?*?????
?*/????
public?class?HessianSpringClient?{?????
????
????/**????
?????*?@param?args????
?????*/????
????public?static?void?main(String[]?args)?{?????
????????try?{?????
????????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext(?????
????????????????????"hessian-client.xml");?????
????
????????????HelloHessian?hello?=?(HelloHessian)?context?????
????????????????????.getBean("helloHessianClient");?????
????
????????????System.out.println(hello.sayHello());?????
????
????????????MyCar?car?=?hello.getMyCar();?????
????????????System.out.println(car.toString());?????
????
????????????for?(Map.Entry?entry?:?hello.myBabays().entrySet())?{?????
????????????????System.out.println(entry.getKey()?+?"???"?+?entry.getValue());?????
????????????}?????
????
????????????for?(String?str?:?hello.myLoveFruit())?{?????
????????????????System.out.println(str);?????
????????????}?????
????????}?catch?(Exception?e)?{?????
????????????e.printStackTrace();?????
????????}?????
????
????}?????
????
}

运行结果和上面完全一致。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读