- 作者简介
- 内容提要
- 关于本书
- 路线图
- 代码规范与下载
- 作者在线
- 封面插图简介
- 前言
- 译者序
- 致谢
- 第1部分 Spring 的核心
- 第1章 Spring 之旅
- 第2章 装配 Bean
- 第3章 高级装配
- 第4章 面向切面的 Spring
- 第2部分 Web 中的 Spring
- 第5章 构建 Spring Web 应用程序
- 第6章 渲染 Web 视图
- 第7章 Spring MVC 的高级技术
- 第8章 使用 Spring Web Flow
- 第9章 保护 Web 应用
- 第3部分 后端中的 Spring
- 第10章 通过 Spring 和 JDBC 征服数据库
- 第11章 使用对象-关系映射持久化数据
- 第12章 使用 NoSQL 数据库
- 第13章 缓存数据
- 第14章 保护方法应用
- 第4部分 Spring 集成
- 第15章 使用远程服务
- 第16章 使用 Spring MVC 创建 REST API
- 第17章 Spring消息
- 第18章 使用 WebSocket 和 STOMP 实现消息功能
- 第19章 使用 Spring 发送 Email
- 第20章 使用 JMX 管理 Spring Bean
- 第21章 借助 Spring Boot 简化 Spring 开发
15.3.1 使用 Hessian 和 Burlap 导出 bean 的功能
像之前一样,我们希望把SpitterServiceImpl类的功能发布为远程服务——这次是一个Hessian服务。即使没有Spring,编写一个Hessian服务也是相当容易的。我们只需要编写一个继承com.caucho.hessian.server.HessianServlet的类,并确保所有的服务方法是public的(在Hessian里,所有public方法被视为服务方法)。
因为Hessian服务很容易实现,Spring并没有做更多简化Hessian模型的工作。但是和Spring一起使用时,Hessian服务可以在各方面利用Spring框架的优势,这是纯Hessian服务所不具备的。包括利用Spring的AOP来为Hessian服务提供系统级服务,例如声明式事务。
导出Hessian服务
在Spring中导出一个Hessian服务和在Spring中实现一个RMI服务惊人的相似。为了把Spitter服务bean发布为RMI服务,我们需要在Spring配置文件中配置一个RmiServiceExporterbean。同样的方式,为了把Spitter服务发布为Hessian服务,我们需要配置另一个导出bean,只不过这次是HessianServiceExporter。
HessianServiceExporter对Hessian服务所执行的功能与RmiServiceExporter对RMI服务所执行的功能是相同的:它把POJO的public方法发布成Hessian服务的方法。不过,正如图15.6所示,其实现过程与RmiServiceExporter将POJO发布为RMI服务是不同的。
图15.6 HessianServiceExporter是一个Spring MVC控制器,它可以接收Hessian请求,并把这些请求转换成对POJO的调用从而将POJO导出为一个Hessian服务
HessianServiceExporter(稍后会有更详细的介绍)是一个Spring MVC控制器,它接收Hessian请求,并将这些请求转换成对被导出POJO的方法调用。在如下Spring的声明中,HessianServiceExporter会把spitterService bean导出为Hessian服务:
正如RmiServiceExporter一样,service属性的值被设置为实现了这个服务的bean引用。在这里,它引用的是spitterServicebean。serviceInterface属性用来标识这个服务实现了SpitterService接口。
与RmiServiceExporter不同的是,我们不需要设置serviceName属性。在RMI中,serviceName属性用来在RMI注册表中注册一个服务。而Hessian没有注册表,因此也就没必要为Hessian服务进行命名。
配置Hessian控制器
RmiServiceExporter和HessianServiceExporter另外一个主要区别就是,由于Hessian是基于HTTP的,所以HessianSeriviceExporter实现为一个Spring MVC控制器。这意味着为了使用导出的Hessian服务,我们需要执行两个额外的配置步骤:
在web.xml中配置Spring的DispatcherServlet,并把我们的应用部署为 Web应用;
在Spring的配置文件中配置一个URL处理器,把Hessian服务的URL分发给对应的Hessian服务bean。
我们在第5章学习了如何配置Spring的DispatcherServlet和URL处理器,所以这些步骤看起来有些熟悉。首先,我们需要一个DispatcherServlet。还好,这个我们已经在Spittr应用的web.xml文件中配置了。但是为了处理Hessian服务,DispatcherServlet还需要配置一个Servlet映射来拦截后缀为“*.service”的URL:
如果你在Java中通过实现WebApplicationInitializer来配置DispatcherServlet的话,那么需要将URL模式作为映射添加到ServletRegistration.Dynamic中,在将DispatcherServlet添加到容器中的时候,我们能够得到ServletRegistration.Dynamic对象:
或者,如果你通过扩展AbstractDispatcherServletInitializer或Abstract-AnnotationConfigDispatcherServletInitializer的方式来配置DispatcherServlet,那么在重载getServletMappings()的时候,需要包含该映射:
这样配置后,任何以“.service”结束的URL请求都将由DispatcherServlet处理,它会把请求传递给匹配这个URL的控制器。因此“/spitter.service”的请求最终将被hessianSpitterServicebean所处理(它实际上仅仅是一个SpitterServiceImpl的代理)。
那我们是如何知道这个请求会转给hessianSpitterSevice处理呢?我们还需要配置一个URL映射来确保DispatcherServlet把请求转给hessianSpitterService。如下的SimpleUrlHandlerMappingbean可以做到这一点:
如果不喜欢Hessian的二进制协议,我们还可以选择使用Burlap基于XML的协议。让我们看看如何把一个服务导出为Burlap服务。
导出Burlap服务
从任何方面上看,BurlapServiceExporter与HessianServiceExporter实际上都是相同的,只不过它使用基于XML的协议而不是二进制协议。下面的bean定义展示了如何使用BurlapServiceExporter把Spitter服务导出为一个Burlap服务:
正如我们所看到的,这个bean与使用Hessian所对应bean的唯一区别在于bean的方法和导出类。配置Burlap服务和配置Hessian服务是一模一样的,这包括需要准备一个URL处理器和一个DispatcherServlet。
现在让我们看看会话的另一端,如何访问我们使用Hessian(或Burlap)所发布的服务。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论