当您要将企业应用程序转变成与 Web 服务一起使用时最简单的途径就是将单个操作与单个的企业服务结合在一块但这并不是最好的方法在本文中Jerome Josephraj 将向您展示如何构架基于分层的正确的模型-视图-控制器(MVC)设计模式的Web 服务应用程序为此他修改了 Struts(一种流行的开放源码MVC 框架)以使其适用于 Web 服务领域通过研究此处所概述的样本应用程序您将知道如何才能将 Struts 与 Web 服务联合起来使用
不断发展的 Java 编程语言和 Sun 公司的 JEE 规范使得遵守各类准则的软件开发者们能够创建出分布式计算应用程序这些应用程序在以前只能通过相关专门工具才可实现这样当某些开发团体要选择在 Java 平台中实现新系统时其他团体就会通过另外的技术来创建提高并维护应用程序然后将它们集成到已有的各类分布式应用程序中去这种情形就引起了互操作性的竞争新应用程序与旧应用程序如何交互呢?答案就是Web 服务Web 服务是程序设计新的圣杯它们能够共享并协调分散的各类计算资源
在本文中您将了解实现此目的的一种方法您将看到如何在与 Web 服务相结合的开放源码 Struts 框加的基础上来构建应用程序在开始之前您必须了解一些 JEE 与 Web 服务的相关知识这里我将简要地介绍下 Struts 架构与模型-视图-控制器(MVC)如果您以前没碰到过那么您应该在后面先看下 参考资料 部分来获取更多信息
MVC 模式分离开发角色
MVC 设计模式很清楚的划定了程序员与设计者的角色界限换句话说从商业逻辑上拆解了数据这种模式是让设计者集中于设计应用程序的显示部分而开发者则集中于开发驱动应用程序功能所需的组件
MVC 模式有好几种变异不过它们都是基于相同的基础结构应用程序的数据模型 (Model)显示层代码(View)以及程序控制逻辑( Controller) 是存在其中的独立但能相互间通信的组件模型组件描述并处理应用程序数据视图指的是用户界面它反映的是模型数据并把它递交给用户控制器是将视图上的行为(例如按下 Submit 按钮)映射到模型上的操作(例如检索用户详细信息)模型更新后视图也被更新用户就能够完成更多行为MVC 模式使代码易懂而且使代码更容易重用另外在很多工程中视图经常要被更新MVC 模式将模型和控制器与这些所做的更改独立开来
图 MVC 设计模式Struts基于 MVC 的坚固框架
Struts 是 MVC 模式基础上构建 Web 应用程序的一种开放源码框加Struts 鼓励在 MVC 模式上构建应用程序而且提供大多数 Web 应用程序所共有的服务
在 Struts 应用程序中您可以构建模型层这样业务逻辑与数据检索逻辑重用就很容易了这层负责运行应用程序的业务逻辑获取相关数据(例如运行 SQL 命令或者读取平面文件)
Struts 鼓励在模型-视图-控制器设计范例基础上构建应用程序Struts 提供自己的控制器组件(ActionController 类)并与其他技术相结合来提供模型与视图对于模型(Model 类) Struts 能与任何标准的数据访问技术相结合包括 EJBJDBC 以及 ObjectRelational Bridge对于视图(ActionForm 类)Struts 在 JSP 环境以及其他基于表示逻辑的系统中运行的很好图 阐明了基于 Struts 应用程序的逻辑流程
图 Struts 应用程序的逻辑流简单粗糙的 Web 服务体系结构
构建 Web 服务最简单的途径就是将单个操作与单个企业服务结合起来如图 所示在这种设计方法中实现业务逻辑的服务与实现数据检索的服务是混合在一起的
图 简单粗糙的 Web 服务体系结构这样的一种 Web 服务可以很容易从已有的业务组件中开发出来然而它有很多的缺点对用户没有提供统一认证提供者与订阅者耦合不紧业务逻辑没有重用简而言之对于一个连贯的解决方案来说这并不是一个非常好的体系结构
在 MVC 模式基础上来实现 Web 服务解决方案会更好点在后续部分您将看到如何使用 Struts 来做到这一点我将通过 WSManager 层来详述现有的 Struts 架构这一层展示了采用 Web 服务的模型服务方法
采用 Struts 应用程序的 Web 服务
在以后的开发工作中您可以扩大构建得比较好的 Struts 应用程序来支持 Web 服务前面讲过Struts 架构清晰地区分开了视图控制器以及模型模型包含所有必须的业务逻辑从存储数据仓库中检索数据您可以构建一个简单的 Web 服务层——称为 WSManager 层——这样的模型可以提供 Web 服务也可以订购 Web 服务使用这种体系结构的应用程序将基于组件开发的最佳点与万维网结合在了一起如 图 所示
图 采用 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 接收 JAXRPC 端点的请求将 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 LanguageWSDL)描述与由它所引用的任何 XML schema 所组成(WSDL 是描述服务的标准语言)
您可以在公共注册中心或在企业内的公司注册表上发布 Web 服务描述同样你也可以发布由WEB 服务定义的XML Schema到同一个公共的或者公司专有的(UDDI)注册中心上 Java Web 服务客户端采用 JAXR 应用编程接口来查询公司或公共注册表上的服务描述
如果您的客户都是专有的合作伙伴那您就不需要使用注册表了不过您可以在您的应用程序的 Web 层或者在具备适当安全保护的熟知位置来发布您的 Web 服务描述( WSDL 和 XML schemas)例如假想有一个转售者的客户应用程序他与某个特殊厂商有协定客户应用程序已经在厂商开发时