如何在Spring中集成hessian矩阵框架

您现在的位置: &
Spring整合Hessian
Spring整合Hessian
  Spring让Hessian变得不但强大,而且易用,但是易用背后,却有不少陷阱!
  这个例子很简单,但实际上的确花费了我超过一小时的时间,排除了种种问题,最后问题终于水落石出。
  整合以上篇Hello Hessian为基础,加入Spring框架,进行改进。
  一、环境
  jdk1.5
  -mirror/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.zip
  -framework-2.5.6.SEC01-with-dependencies.zip
  顺便说下,如果不说环境版本,很难保证你的程序在别的版本下能运行。
  二、整合
  1、写Spring的发布Hessian服务的配置文件
  hessian-servlet.xml
&!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "-beans.dtd"& &beans& &&&&&&&&&bean id="defaultHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/& &&&&&&&&&bean id="helloService" class="lavasoft.suths.service.HelloService"/& &&&&&&&&&bean name="/hello" class="org.springframework.remoting.caucho.HessianServiceExporter"& &&&&&&&&&&&&&&&&&property name="service" ref="helloService"/& &&&&&&&&&&&&&&&&&property name="serviceInterface" value="lavasoft.suths.service.Hello"/& &&&&&&&&&/bean& &/beans&
  2、配置web.xml
&?xml version="1.0" encoding="UTF-8"?& &web-app xmlns="" &&&&&&&&&&&&&&&& xmlns:xsi="-instance" &&&&&&&&&&&&&&&& xsi:schemaLocation=" &&&&&&&&-app_2_5.xsd" &&&&&&&&&&&&&&&& version="2.5"& &&&&&&&&&context-param& &&&&&&&&&&&&&&&&&param-name&contextConfigLocation&/param-name& &&&&&&&&&&&&&&&&&param-value& &&&&&&&&&&&&&&&&&&&&&&&&/WEB-INF/hessian-servlet.xml &&&&&&&&&&&&&&&&&/param-value& &&&&&&&&&/context-param& &&&&&&&&&servlet& &&&&&&&&&&&&&&&&&servlet-name&hessian&/servlet-name& &&&&&&&&&&&&&&&&&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class& &&&&&&&&&&&&&&&&&load-on-startup&4&/load-on-startup& &&&&&&&&&/servlet& &&&&&&&&&servlet-mapping& &&&&&&&&&&&&&&&&&servlet-name&hessian&/servlet-name& &&&&&&&&&&&&&&&&&url-pattern&/hessian/*&/url-pattern& &&&&&&&&&/servlet-mapping& &/web-app&
  陷阱:
  a)hessian-servlet.xml的文件名必须以&servlet-name&hessian&/servlet-name&名字开头,并且加上-servlet.xml一段,组成完整的文件名。
  b)hessian-servlet.xml的文件名格式必须是[servlet-name]-servlet.xml格式,否则出错。
  三、部署应用
  因为涉及到类加载顺序问题,好用IDEA启动Tomcat测试老失败,不知道为啥!这次不用IDEA嵌入式启动Tomcat了,直接自己部署测试。
  部署后,启动界面如下:
  三、写测试
  这次测试,可以在上个例子的基础上进行修改来测试,根据上面的配置,那么请求HelloService的URL应该是//localhost:8080/hessianapp/hessian/hello
package lavasoft.suths.service. import com.caucho.hessian.client.HessianProxyF import lavasoft.suths.service.H import .MalformedURLE /** * 客户端调用(会依赖服务接口) * * @author leizhimin
12:29:33 */ public class Client { &&&&&&&&public static void main(String[] args) throws MalformedURLException { &&&&&&&&&&&&&&&&String url = //localhost:8080/hessianapp/hessian/hello"; &&&&&&&&&&&&&&&&HessianProxyFactory factory = new HessianProxyFactory(); &&&&&&&&&&&&&&&&Hello hello = (Hello) factory.create(Hello.class, url); &&&&&&&&&&&&&&&&System.out.println(hello.sayHello("Hessian")); &&&&&&&&} }
  运行结果:
Hello Hessian! Process finished with exit code 0
  还有一种测试方法,就是在客户端也使用Spring,需要做个配置remoting-client.xml:
&!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "-beans.dtd"& &beans& &&&&&&&&&bean id="helloServiceClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"& &&&&&&&&&&&&&&&&&property name="serviceUrl" value=//localhost:8080/hessianapp/hessian/hello"/& &&&&&&&&&&&&&&&&&property name="serviceInterface" value="lavasoft.suths.service.Hello"/& &&&&&&&&&/bean& &/beans&
  然后写个测试类:
package lavasoft.suths.service. import lavasoft.suths.service.H import orgntext.ApplicationC import orgntext.support.ClassPathXmlApplicationC /** * Spring整合Hessian,客户端测试 * * @author leizhimin
15:32:46 */ public class TestClient { &&&&&&&&public static void main(String[] args) { &&&&&&&&&&&&&&&&try { &&&&&&&&&&&&&&&&&&&&&&&&ApplicationContext context = new ClassPathXmlApplicationContext("/remoting-client.xml"); &&&&&&&&&&&&&&&&&&&&&&&&Hello hello = (Hello) context.getBean("helloServiceClient"); &&&&&&&&&&&&&&&&&&&&&&&&System.out.println(hello.sayHello("Spring Hession")); &&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&catch (Exception e) { &&&&&&&&&&&&&&&&&&&&&&&&e.printStackTrace(); &&&&&&&&&&&&&&&&} &&&&&&&&} }
  运行结果:
Hello Spring Hession! Process finished with exit code 0
  陷阱:实际上,看着代码好好,程序有时候还是不能跑,原因是Hessian的版本问题,这里推荐使用Spring自带的版本,就不会有问题了。
  整个工程所以依赖的包:
log4j-1.2.15.jar spring-aop.jar spring-beans.jar spring-context.jar spring-context-support.jar spring-core.jar spring-jdbc.jar spring-jms.jar spring-orm.jar spring-test.jar spring-tx.jar spring-web.jar spring-webmvc.jar spring-webmvc-portlet.jar spring-webmvc-struts.jar hessian-3.1.3.jar aopalliance.jar commons-logging.jar
&&&主编推荐
&&&热门试卷
&&&最新视频
&&&热门阅读
&&&最新问答
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-Hessian Servlet和Hessian Spring的简单应用 - lancui - ITeye技术网站
博客分类:
相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议(Binary),因为采用的是二进制协议,所以它很适合于发送二进制数据。Hessian通常通过Web应用来提供服务,因此非常类似于WebService。只是它不使用SOAP协议。
Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,推荐采用面向接口编程,因此,Hessian服务建议通过接口暴露。
Hessian处理过程示意图:
客户端——&序列化写到输出流——&远程方法(服务器端)——&序列化写到输出流 ——&客户端读取输入流——&输出结果
Hessian的下载和安装请按如下步骤进行:
(1)登/hessian/下载Hessian。
(2)把Hessian相应的Jar包放到Web应用下,所有的jar文件都应该放在WEB-INF/lib下,该文件也不例外。
这种方式主要是适用于工程中没有适用像spring框架的情况下,好处是配置方便,但是当内容多的情况下,配置的内容很多。
下面我就把我在做实例的一些相关步骤描述如下:
1:把Hessian相应jar包放入至工程中。
2:由于Hessian是采用面向接口编程的,所以编写一个接口,因为客户端仅仅需要接口,而无须真实的实现类。
package jzh.
public interface IHello {
String sayHello();
3:编写一个类实现这个接口。
package jzh.demo.
import jzh.demo.IH
import com.caucho.hessian.server.HessianS
public class Hello extends HessianServlet implements IHello {
public String sayHello() {
return "Hello world";
4:web.xml的详细配置
&servlet-name&Hello&/servlet-name&
&servlet-class&com.caucho.hessian.server.HessianServlet&/servlet-class&
&init-param&
&param-name&home-class&/param-name&
&param-value&jzh.demo.imple.Hello&/param-value&
&/init-param&
&init-param&
&param-name&home-api&/param-name&
&param-value&jzh.demo.IHello&/param-value&
&/init-param&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&Hello&/servlet-name&
&url-pattern&/Hello&/url-pattern&
&/servlet-mapping&
5:客户端远程调用服务器端提供的接口,利用的就是Hessian的HessianProxyFactory,来实现远程代理。
1) 把服务器端的生成的jar包,放入工程中。
2) 相应的片段程序如下:
String url = "http://220.114.108.185:8080/Hessian/Hello";
HessianProxyFactory factory = new HessianProxyFactory();
IHello hello =(IHello)factory.create(IHello.class,url);
System.out.println(hello.sayHello());
} catch (MalformedURLException e) {
e.printStackTrace();
6:功能完成。 Hessian与Spring整合
相比上一种方式,这个方式就有点麻烦了。Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务,web.xml只是定义了“请求转发器”,该转发器将匹配/remoting/*的请求截获,转发给context的bean处理。而HessianServiceExporter提供bean服务。
所以Hessian与Spring整合主要就是一下两个工作:
1:通过DispatcherServlet来拦截URL请求。
2:HessianServiceExporter提供bean服务,Spring使用HessianServiceExporter,将一个常规bean导出成Hessian服务。
下面我就把我在做实例的一些相关步骤描述如下:
1:和上面的一样。
2:和上面的一样。
3:和上面的一样。
4:web.xml的详细配置
&servlet-name&remoting&/servlet-name&
&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class&
&!-- 默认是加载WEB-INF/servlet-name+"-servlet.xml"文件,在这里可以配置为加载WEB-INF/classes/remoting-servlet.xml这个文件
&init-param&
&param-name&namespace&/param-name&
&param-value&classes/remoting-servlet&/param-value&
&/init-param&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&remoting&/servlet-name&
&url-pattern&/remoting/*&/url-pattern&
&/servlet-mapping&
5:配置remoting-servlet.xml文件
定义普通bean实例--&
&bean id="hello" class="jzh.demospring.impl.Hello"/&
使用HessianServiceExporter 将普通bean导出成Hessian服务--&
&bean name="/HessianRemoting" class="org.springframework.remoting.caucho.HessianServiceExporter"&
需要导出的目标bean--&
&property name="service" ref="hello"/&
Hessian服务的接口--&
&property name="serviceInterface" value="jzh.demospring.IHello"/&
6:客户端定义一个remoting-client.xml文件
&bean id="myServiceClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"&
&property name="serviceUrl"&
&value&http://220.114.99.62:8080/HessianSpring/remoteing/HessianRemoting&/value&
&/property&
&property name="serviceInterface"&
&value&jzh.demospring.IHello&/value&
&/property&
7:客户端调用。
ApplicationContext context = new ClassPathXmlApplicationContext("remote-client.xml");
IHello hello =(IHello)context.getBean("myServiceClient");
System.out.println(hello.sayHello());
catch (Exception e)
e.printStackTrace();
1:启动tomcat的时候,出现如下问题:java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet。,而在工程中是可以找到相应的jar文件,这究竟是什么问题。
解决方法:可能是在工程的WEB-INF/lib下面没有加载相应的jar文件
2:org.springframework.remoting.RemoteAccessException: Cannot access Hessian service at [http://61.152.162.173/remote/remoteService];
解决方法:出现这个异常一般是因为服务端操作出现异常引起的
发表时间:
谢谢,正在学习怎么搭建hessian服务,看了以后帮助很大!
发表时间:
我觉得RPC有两种方式,调用远程的方法:
1、方法在远程执行,将操作结果传回给客户端。优点:服务器负荷小,传输数据量小,客户端无需知道服务器端定义的服务接口。缺点:需要对数据进行拼装解析等复杂操作。
2、方法加载到客户端运行。优点:可以和缓存配合,每次运行只传输一次,可靠性高,有些方法没有返回值,只是进行例如print的打印语句能在客户端运行。缺点:传输数据大,客户端需要知道服务接口。
IHello hello =(IHello)factory.create(IHello.class,url);
System.out.println(hello.sayHello());
它是第二种方式
发表时间:
其实,它采用的是第一种方式,是在远程执行,而非是你说的第二种
5:客户端远程调用服务器端提供的接口,利用的就是Hessian的HessianProxyFactory,来实现远程代理。
1) 把服务器端的生成的jar包,放入工程中。
浏览: 44392 次
来自: 上海
woweipingzui 写道和2楼一样的错...该怎么解决不 ...
和2楼一样的错...该怎么解决
求帮忙啊,我现在遇到这个问题,试了许多种方法,还是不能解决啊~ ...
&把他拷贝到eclipse或者通过后台输出,就能看到 ...基于spring-hessian的gwt系统前后台模块的分布式部署介绍 - tomgod - ITeye技术网站
博客分类:
本文主要介绍如何实现将
spring-hessian
系统中,完成系统的前后台模块的分离部署。集成了
后,可以实现将业务逻辑代码从原有系统中剥离,并部署到另外一个容器中,同时将这些业务逻辑代码发布成远程接口,原有系统的前台模块则通过调用这些远程接口实现原有的业务服务。这样实现可以很好的分担原服务器的压力,同时降低了前后台模块的耦合度,使向外提供高效的业务服务接口成为现实(区别于
webservice
首先介绍简单介绍一下hessian,Hessian
是一个轻量级的
remoting on http
工具,使用简单的方法提供了
Remote Method Invocation
,远程方法调用)的功能。采用的是二进制
Remote Procedure Call Protocol
,远程过程调用协议)协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。它提供
服务就像创建
使用服务就像使用
代理接口一样简单。
Webservice
,但是它不使用
协议,它把协议报文封装到
封包中,通过
信道传输。是一种高效简洁的远程调用框架,它采用的是二进制
),具有轻量、传输量小、平台无关的特点,特别适合于目前网络带宽比较小的手机网络应用项目。
提供远程服务,完全使用动态代理来实现的
推荐采用面向接口编程,因此,
服务建议通过接口暴露。
Flash/Flex
Objective C
。它不需要我们与
,直接操作对象,省去了很多麻烦。
系统提供了一套默认的基于
它能够让我们直接在前后台传递对象
,而无需考虑中间的传递过
程。为开发提供了很大的便利。
事实上,当我们在前台模块定义一个
对象并作为参数传递给某个
时,就是发送了一个
请求,同时将该对象序列化为二进制流,发送到
接口中。之后再
接口中反序列化该对象并通过请求的
名反射后台业务服务进行业务处理,并将最终结果序列化传送回前台并显示。流程图如下:
服务方便了我们的开发,但是他不支持将前后台模块分离部署,观看源码可知,
服务不支持传递的请求来自不同的
* The servlet base class for your RPC service implementations that
* automatically deserializes incoming requests from the client and serializes
* outgoing responses for client/server RPCs.
public class RemoteServiceServlet extends AbstractRemoteServiceServlet
implements SerializationPolicyProvider {
static SerializationPolicy loadSerializationPolicy(HttpServlet servlet,
HttpServletRequest request, String moduleBaseURL, String strongName) {
// The request can tell you the path of the web app relative to the
// container root.
String contextPath = request.getContextPath();
String modulePath =
if (moduleBaseURL != null) {
modulePath = new URL(moduleBaseURL).getPath();
} catch (MalformedURLException ex) {
// log the information, we will default
servlet.log("Malformed moduleBaseURL: " + moduleBaseURL, ex);
SerializationPolicy serializationPolicy =
* Check that the module path must be in the same web app as the servlet
* itself. If you need to implement a scheme different than this, override
* this method.
所以,本文确认使用集成
的方式来实现远程调用业务实现来完成前后台模块的分离。通过
方式,可以在
中将反射调用服务接口的路径改成调用远程
提供的远程服务接口,通过该接口在反射调用对应的服务来进行相应的逻辑处理并返回序列化后的结果对象,在前台进行展现。流程图如下:
,新建一个
工程,本例中以我测试的gwt工程为基础,创建名为
TMHessianServer
1.2 将gwt工程的业务层代码都复制到该工程中
1.3在上步中检查各种实体
,使其继承了序列化接口,这一步很重要,由于
需要将对象进行序列化,所以如果不这么做会产生异常
将每个服务都发不成一个
前台模块可以通过该
调用远程服务
&servlet-name&Hessian&/servlet-name&
&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class&
&init-param&
&param-name&contextConfigLocation&/param-name&
&param-value&
classpath:Hessian-servlet.xml
&/param-value&
&/init-param&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&Hessian&/servlet-name&
&url-pattern&/hessian/*&/url-pattern&
&/servlet-mapping&
1.5根据创建的
名创建对应的配置文件。该配置文件命名是以
hessian servlet
”为规则。该例中使用
hessian-servlet.xml
配置文件。将该配置文件放在
中。本例放在如下位置
hessian-servlet.xml,
将远程医疗中的业务
定义全部复制到其中。并根据每个
service bean
定义远程服务。如下举例
&!-- 业务类 --&
&bean id="patientService" class="net.carefx.tm.manager.service.impl.PatientServiceImpl"&
&property name="patientMapper" ref="patientMapper"&&/property&
&!-- 远程服务 --&
&bean name="/patientService"
class="org.springframework.remoting.caucho.HessianServiceExporter"&
&property name="service" ref="patientService" /&
&property name="serviceInterface"&
net.carefx.tm.manager.service.PatientService
&/property&
将gwt工程中中业务层的
的配置文件拷贝到新建的业务工程中
在新工程的
文件中添加
配置以及业务文件的引用
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&
classpath:framework-common.spring.xml,
classpath:framework-cache.spring.xml,
classpath:pms/pms-db.spring.xml,
classpath:pms/pms-manager.spring.xml,
classpath:pms/pms-service-local.spring.xml,
classpath:tm/tm-db.spring.xml,
classpath:Hessian-servlet.xml
&/param-value&
&/context-param&
&!-- spring 读取 log4jConfigLocation --&
&listener&
&listener-class&org.springframework.web.util.Log4jConfigListener&/listener-class&
&/listener&
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
&listener&
&listener-class&
org.springframework.web.context.request.RequestContextListener&/listener-class&
&/listener&
&servlet-name&Hessian&/servlet-name&
&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class&
&init-param&
&param-name&contextConfigLocation&/param-name&
&param-value&
classpath:Hessian-servlet.xml
&/param-value&
&/init-param&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&Hessian&/servlet-name&
&url-pattern&/hessian/*&/url-pattern&
&/servlet-mapping&
1.9将所有相关的
web-inf/lib
目录下。至此
工程配置完成。启动该工程。新发布的远程服务远程地址应该为
heep://ip:port/ProjectName/serviceName.
如上例中的
patientservice
的地址即为:
http://localhost:8080/TMHessianServer/patientService
2.1打开源工程系统,将所有业务相关的类删除。注意:由于开发时的不注意或者业务需要,有些业务类被前台引用,造成了紧耦合,不能删除(比如多线程控制等),为了尽量少的更改源代码可以将这些类保留,但是实际上最终执行可以再远程服务的工程里进行。
打开系统中的业务
配置文件,本例中为
tm-manager.spring.xml
。修改原有的业务
定义,修改为支持
的远程调用定义
&bean id="patientService"
class="org.springframework.remoting.caucho.HessianProxyFactoryBean"&
&property name="serviceUrl"
value="${tm.patientService}" /&//远程服务地址
&property name="serviceInterface" //服务接口
value="net.carefx.tm.manager.service.PatientService" /&
2.3新建属性文件
tm-service-location.properties
,将上步中的远程服务地址保存在内
2.4至此配置完成,启动远程医疗系统,同时启动远程服务系统
TMHessianServet
,将两个系统分置于不同的容器中,进行测试,如无异常,证明配置成功
exception is com.caucho.hessian.io.HessianProtocolException: expected hessian
reply at end of file
解决方案:这是因为接口中出现方法重载,在调用时,服务器端会跑出异常。
中,在客户端的配置里面加上“
name="overloadEnabled" value="true"&&/property&
”代码可以解决。如下:
&bean id="doctorService"
class="org.springframework.remoting.caucho.HessianProxyFactoryBean"&
&property name="overloadEnabled" value="true"&&/property&
&property name="serviceUrl"
value="${tm.doctorService}" /&
&property name="serviceInterface" value="net.carefx.tm.manager.service.DoctorService" /&
2.com.caucho.hessian.client.HessianRuntimeException: com.caucho.hessian.io.HessianProtocolException: expected integer at 0x53
java.lang.String
解决方案:检查
包是否存在服务器端和客户端不一致,或者是服务器自带了不同版本的
hessian.jar
包可以解决
wendy_wxie
浏览: 33872 次
来自: 长沙
请问小哥,插入的有例子吗?
好像用这样写的话分页也有困难
多线程下,漏洞百出。。。还有map的实例化的位置有问题,不应该 ...
如果返回类型是LIST&MAP&OBJECT,OB ...
你好,我也配好了,跟你的一样,但我有一个问题,我的嵌入的页面比 ...如何在Spring中集成Hessian框架 - 刺猬的温驯 - 博客园
一、简介&&&&& Hessian是一个由Caucho Technology开发的轻量级二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。下面以hessian-3.0.20版本为例演示如何将Hessian整合到Spring中。&二、配置详解&&&&& 1、在web.xml中的配置
&context-param&&&&&&&&param-name&contextConfigLocation&/param-name&&&&&&&&param-value&&&&&&&&&&&/WEB-INF/config/applicationContext.xml,&&&&&&&&&&/WEB-INF/Hessian-servlet.xml&&&&&&&/param-value&&&&/context-param&&&&&&&&&&&&&&servlet&&&&&&&&servlet-name&Hessian&/servlet-name&&&&&&&&servlet-class&&&&&&&&&&&org.springframework.web.servlet.DispatcherServlet&&&&&&&/servlet-class&&&&&&&&load-on-startup&1&/load-on-startup&&&&/servlet&&&&&&&&&&&&&&servlet-mapping&&&&&&&&servlet-name&Hessian&/servlet-name&&&&&&&&url-pattern&/hessian/*&/url-pattern&&&&/servlet-mapping&&&
&&&&&& 1)Hessian要求远程服务通过Servlet暴露出来,所以我们使用Spring的DispatcherServlet来暴露我们的服务。&&&&&&&& 2)我们必须在WEB-INF目录下创建一个文件名格式为 [Servlet Name]-servlet.xml 的配置文件,由于我们设定servlet-name为Hessian,所以我们在这里创建一个名为Hessian-servlet.xml的文件。&&&& 2、Hessian-servlet.xml文件的配置
&!--&业务类&--&&&&bean&id="hessianService"&class="com.cjm.webservice.hessian.HessianServiceImpl"/&&&&&&&&&&&&&&!--&远程服务&--&&&&bean&name="/hessianService"&class="org.springframework.remoting.caucho.HessianServiceExporter"&&&&&&&&property&name="service"&ref="hessianService"/&&&&&&&&property&name="serviceInterface"&&&&&&&&&&&&value&&&&&&&&&&&&&&&com.cjm.webservice.hessian.HessianService&&&&&&&&&&&/value&&&&&&&&/property&&&&/bean&&&
&&&&&&& 1)实际业务类是通过Spring的HessianServiceExporter类来暴露给客户端的。&&&&&&&& 2)service:指定服务对应的业务类。&&&&&&&& 3)serviceInterface:指定业务类实现哪个接口。Spring推荐采用面向接口编程,因此,Hessian服务建议通过接口暴露。&&&&&&&& 4)Hessian的远程服务名为/hessianService。笔者使用的web服务器是Tomcat-5.5.23,端口是8888,web应用名为spring2,则远程服务的URL为:。&&&& 3、业务类源代码
Java代码&&
//接口类:&&public&interface&HessianService&{&&&&&&public&String&sayHello(String&username);&&&&&&public&HessianModel&getHessianModel(String&username,&String&password);&&}&&&&&&&&&&&&//实现类:&&public&class&HessianServiceImpl&implements&HessianService&{&&&&&&public&String&sayHello(String&username){&&&&&&&&&&return&"Hello&"&+&&&&&&&}&&&&&&&&&public&HessianModel&getHessianModel(String&username,&String&password)&{&&&&&&&&&&return&new&HessianModel(username,&password);&&&&&&}&&}&&&&&&&&&&&&//领域模型类:&&public&class&HessianModel&implements&Serializable{&&&&&&private&String&&&&&&&private&String&&&&&&&&&&&&&&&&&&&&&&&&&public&HessianModel(String&username,&String&password){&&&&&&&&&&this.username&=&&&&&&&&&&&this.password&=&&&&&&&}&&&&&&……&&}&&
&&& 4、客户端调用服务范例&&&&&&&&& 1)在Jsp页面中调用服务
Java代码&&
String&url&=&"http://localhost:8888/spring2/hessian/hessianService";&&HessianProxyFactory&factory&=&new&HessianProxyFactory();&&HessianService&hessianServer&=&&&&&&&&&&&&&&&(HessianService)factory.create(HessianService.class,&url);&&String&ret&=&hessianServer.sayHello("Raymond.chen");&&out.print(ret);&&&&&&&&&&&&HessianModel&model&=&hessianServer.getHessianModel("uid",&"pwd");&&out.print("username:&"&+&model.getUsername()&+&"&br&");&&
&&&&&&&&&&&& A)结果显示:Hello Raymond.chen&&&&&&&&&&&&& B)客户端程序必须引用hessian-3.0.20.jar文件和远程服务对应的接口类。&&&&&&&&&&&&& C)当调用的远程服务方法返回一个自定义类时,该自定义类必须实现Serializable接口。&&&&&&& 2)在Spring环境中调用服务
&bean&id="testHessianService"&class="org.springframework.remoting.caucho.HessianProxyFactoryBean"&&&&&&&&property&name="serviceUrl"&value="http://localhost:8888/spring2/hessian/hessianService"/&&&&&&&&property&name="serviceInterface"&value="com.cjm.webservice.hessian.HessianService"/&&&&/bean&&&&&&&&&&&&&&&&&&!-&Struts2中调用服务&--&&&&bean&id="orgAction"&class="com.cjm.web.action.OrganizationAction"&parent="baseAction"&&&&&&&&property&name="organizationService"&ref="organizationService"/&&&&&&&&property&name="testHessianService"&ref="testHessianService"/&&&&/bean&&&
&&& OrganizationAction.java部分源代码:
Java代码&&
private&HessianService&testHessianS&&&&&&&&&&&&&&&&HessianModel&model&=&testHessianService.getHessianModel("uid",&"pwd");&&System.out.println("username:&"&+&model.getUsername());&&
&&&&&&& A)使用HessianProxyFactoryBean来连接服务。&&&&&&&& B)serviceUrl:远程服务的URL。&&&&&&&& C)serviceInterface:服务对应的接口类。}

我要回帖

更多关于 hessian教程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信