当您要将企业应用程序转变成与 Web 服务一起使用时,最简单的途径就是将单个操作与单个的企业服务结合在一块。但这并不是最好的方法。在本文中,Jerome Josephraj 将向您展示如何构架基于分层的、正确的模型-视图-控制器(MVC)设计模式的Web 服务应用程序。为此,他修改了 Struts(一种流行的开放源码MVC 框架),以使其适用于 Web 服务领域。通过研究此处所概述的样本应用程序,您将知道如何才能将 Struts 与 Web 服务联合起来使用。
不断发展的 java 编程语言和 Sun 公司的 J2EE 规范使得遵守各类准则的软件开发者们能够创建出分布式计算应用程序,这些应用程序在以前只能通过相关专门工具才可实现。这样,当某些开发团体要选择在 Java 平台中实现新系统时,其他团体就会通过另外的技术来创建、提高并维护应用程序,然后将它们集成到已有的各类分布式应用程序中去。这种情形就引起了互操作性的竞争。新应用程序与旧应用程序如何交互呢?答案就是:Web 服务。Web 服务是程序设计新的圣杯。它们能够共享并协调分散的各类计算资源。
在本文中,您将了解实现此目的的一种方法。您将看到如何在与 Web 服务相结合的开放源码 Struts 框加的基础上来构建应用程序。在开始之前您必须了解一些 J2EE 与 Web 服务的相关知识。这里,我将简要地介绍下 Struts 架构与模型-视图-控制器(MVC),假如您以前没碰到过,那么您应该在后面先看下 参考资料 部分来获取更多信息。
MVC 模式:分离开发角色
MVC 设计模式很清楚的划定了程序员与设计者的角色界限。换句话说,从商业逻辑上拆解了数据。这种模式是让设计者集中于设计应用程序的显示部分,而开发者则集中于开发驱动应用程序功能所需的组件。
MVC 模式有好几种变异,不过它们都是基于相同的基础结构:应用程序的数据模型 (Model),显示层代码(View),以及程序控制逻辑( Controller) 是存在其中的独立但能相互间通信的组件。模型组件描述并处理应用程序数据。视图指的是用户界面;它反映的是模型数据并把它递交给用户。控制器是将视图上的行为(例如,按下 Submit 按钮)映射到模型上的操作(例如,检索用户具体信息)。模型更新后,视图也被更新,用户就能够完成更多行为。MVC 模式使代码易懂而且使代码更轻易重用;另外,在很多工程中视图经常要被更新,MVC 模式将模型和控制器与这些所做的更改独立开来。
图 1. MVC 设计模式
Struts:基于 MVC 的坚固框架
Struts 是 MVC 模式基础上构建 Web 应用程序的一种开放源码框加。Struts 鼓励在 MVC 模式上构建应用程序而且提供大多数 Web 应用程序所共有的服务。
在 Struts 应用程序中,您可以构建模型层,这样业务逻辑与数据检索逻辑重用就很轻易了。这层负责运行应用程序的业务逻辑,获取相关数据(例如,运行 SQL 命令或者读取平面文件)。
Struts 鼓励在模型-视图-控制器设计范例基础上构建应用程序。Struts 提供自己的控制器组件(ActionController 类)并与其他技术相结合来提供模型与视图。对于模型(Model 类), Struts 能与任何标准的数据访问技术相结合,包括 EJB、JDBC 以及 Object-Relational Bridge。对于视图(ActionForm 类),Struts 在 jsp 环境以及其他基于表示逻辑的系统中运行的很好。图 2 阐明了基于 Struts 应用程序的逻辑流程。
图 2. Struts 应用程序的逻辑流
简单粗糙的 Web 服务体系结构
构建 Web 服务最简单的途径就是将单个操作与单个企业服务结合起来,如图 3 所示。在这种设计方法中,实现业务逻辑的服务与实现数据检索的服务是混合在一起的。
图 3. 简单粗糙的 Web 服务体系结构
这样的一种 Web 服务可以很轻易从已有的业务组件中开发出来。然而,它有很多的缺点:对用户没有提供统一认证,提供者与订阅者耦合不紧,业务逻辑没有重用。简而言之,对于一个连贯的解决方案来说这并不是一个非常好的体系结构。
在 MVC 模式基础上来实现 Web 服务解决方案会更好点。在后续部分,您将看到如何使用 Struts 来做到这一点。我将通过 WSManager 层来详述现有的 Struts 架构,这一层展示了采用 Web 服务的模型服务方法。
采用 Struts 应用程序的 Web 服务
在以后的开发工作中您可以扩大构建得比较好的 Struts 应用程序来支持 Web 服务。前面讲过,Struts 架构清楚地区分开了视图、控制器以及模型。模型包含所有必须的业务逻辑,从存储数据仓库中检索数据。您可以构建一个简单的 Web 服务层——称为 WSManager 层——这样的模型可以提供 Web 服务也可以订购 Web 服务。使用这种体系结构的应用程序将基于组件开发的最佳点与万维网结合在了一起,如 图 4所示。
图 4. 采用 Web 服务的 Struts 应用程序
下面的部分要讨论的是这种体系结构中不同组件的具体信息,非凡要密切注重 WSManager 层,因为它是此体系结构中真正新加的部分。
Struts 控制器
MVC 体系结构的控制器部分主要集中于接收客户端的请求(一般为运行 Web 浏览器的用户),决定执行哪一种业务逻辑功能来响应请求,然后负责生成下一个用户界面连接到合适的视图组件上去。在 Struts 中,控制器的主要组件就是 ActionServlet 类的一个小服务程序。
ActionServlet 负责通过 xml 文档将 URI 请求映射到特定的行为。这个文档包含了 URI 请求列表而且还告知 ActionServlet 它应该如何分配每个请求。这种方法有几个好处:
应用程序的整个逻辑流程在分级文本文件中。
这种格式的列表更轻易查看与理解,尤其是对于一个很大的应用程序而言。
ActionServlet 决定了应用程序的流程。许多 Action 类都继续了 ActionServlet 。每个 Action 类:
都映射到各自独立的处理过程
通过 Struts 的 ActionController 与 Struts JSPs 相结合
作为继续 Struts中 Action 类的一个 Java 类来实现。
Struts中 Action 类调用 WSManager 类中的相关方法来使用 Web 服务。 WSManager 获取所要求的响应——或者假如有一个被解除了就会出现异常——将它回传给 Struts 控制器。
WSManager
WSManager 接收 JAX-RPC 端点的请求。将 WSManager 类中的方法调用映射到新来的客户端请求。这些新来的客户端请求是 SOAP 信息的格式。WSManager 必须实现安全认证,转变参数,在指定请求到模型服务之前,要对这些请求进行参数预处理。请求所包含的参数形式有 Java 对象,Java原始参数,XML 文档,或者甚至是 SOAP 文档分片(例如,SOAP Element 对象)。这些类型必须要转化成内部所支持的 schema(例如,预定义的 Java 数据访问对象)。
虽然 WSManager 可以很直接地处理与 Java 对象结合的参数,但它还需要采取一些附加步骤来处理 XML 文档。建议以下步骤:
WSManager 类应该能够通过XML Schema来验证XML文档的有效性。
WSManager 类接着要把 XML 文档转化成内部支持的 schema。
最后 WSManager 应该分解文档并且尽可能地将它映射到域对象中去。
WSManager 实现以下任务是非常重要的:
身份验证和授权使用
错误处理
缓存。
WSManager 也可以生成响应;这个过程由方法调用返回值的简单构造所组成。WSManager 中保留这样的功能,您可以通过缓存数据从而避免重复访问模型服务层。您还可以集中治理响应聚集以及 XML 文档转换,假如您要返回给调度者的文档必须遵守与内部 schema 不同的 schema 时,这一点就显得尤其重要。
WSManager 处理所有SOAP 请求并把它们委派到模型层所暴露的业务逻辑。假如模型服务是作为一个 EJB 层来实现,那您一样可以在 EJB 层中通过 session Fa?ade 设计模式来实现。假如您采用这种模式执行 WSManager ,您将获得很多好处,因为 WSManager 会:
作为初始联系点来治理请求与服务
调用安全服务,包括身份验证与授权使用,从而避免任何重复的层访问。
委派业务处理(采用由 Struts 应用程序所使用的模型服务)
在 WSManager 层缓存数据避免任何不必要的数据库访问。
发布者:展示 Web 服务
在 WSManager 类中实现的每一个公共方法都将作为一种 Web 服务发布出来。换句话说,您要为这些类发布一种 Web 服务描述 。Web 服务描述是由服务的 Web 服务描述语言(Web Services Description Language,WSDL)描述与由它所引用的任何 XML schema 所组成。(WSDL 是描述服务的标准语言。)
您可以在公共注册中心或在企业内的公司注册表上发布 Web 服务描述。同样,你也可以发布由WEB 服务定义的XML Schema到同一个公共的或者公司专有的(UDDI)注册中心上。 Java Web 服务客户端采用 JAXR 应用编程接口来查询公司或公共注册表上的服务描述。
假如您的客户都是专有的合作伙伴,那您就不需要使用注册表了。不过,您可以在您的应用程序的 Web 层或者在具备适当安全保护的熟知位置来发布您的 Web 服务描述( WSDL 和 XML schemas)。例如,假想有一个转售者的客户应用程序,他与某个非凡厂商有协定。客户应用程序已经在厂商开发时