摘 要 Struts与EJB大大提高了Web应用开发的效率。Web服务及其相关技术的出现为解决了EJB组件与其他类型组件之间的协同工作与信息交互。本文通过分析Struts 架构与Web 服务的集成,给出了一个结合Struts框架将EJB包装成Web服务的新的基于分层的MVC结构框架。
关键词 Struts;MVC;EJB;Web服务
0 前言
Struts与EJB结合进行B/S模式的开发,解决了“表示”与“业务逻辑”的分离,“业务逻辑”与“数据”的分离问题以及页面的多变性问题,发挥EJB基于组件分布式计算结构的优势,从而大大提高了Web应用的开发效率,数据安全性和可维护性。EJB组件作为一种成熟的组件技术已经被广泛应用于各个领域,然而随着企业的发展,企业不断实施应用新的系统。如何确保新应用程序与旧应用程序之间的交互,如何将现有的系统集成到新系统?传统的RMI-IIOP和CORBA技术由于自身的局限性,限制了EJB组件与其他类型组件之间的协同工作与信息交互,而Web服务及其相关技术的出现为解决软件开发环境中组件间的互操作问题提供了一种有效手段,它是在Internet上进行分布式计算的基本构造块。为快速高效的开发集成早期应用程序的新系统,我们需要为Web服务构建Struts应用系统。
1 Struts与EJB结合B/S的开发模式
1.1 MVC模式
MVC(Model/View/Controller)模式最早是在Smaltalk中出现的。MVC包括三类对象,简单地说,Model是应用对象,View是它在屏幕上的表示,Controller定义用户界面对用户输入的响应方式。
MVC设计模式中的“模型”指的是真正执行任务的代码。在模型同界面分离的情况下,代码即可实现可管理性和可重用性。模型通常被称为“业务逻辑”。所谓“视图”就是使用界面,界面的每一部分都只能包含采集数据的足够逻辑,并把它传递给设计模式中的其他组成部分以进行处理。“控制器”控制着模型和视图之间的交互过程。它决定着向用户返回怎样的视图、检查通过界面输入的信息以及选择处理输入信息的模型。
在JSP开发中,最长使用Model2。Model2实际上就符合MVC模式,其中各组件的关系如图1所示。
图1 Model2中各组件的关系
1.2 Struts+EJB开发模式
Struts是一种符合MVC模式的框架。Struts采用JSP作为MVC的视图,Java Servlet作为控制器,JavaBean作为模型。Struts的处理过程如图2所示。
图2 Struts+EJB的MVC
首先,控制器(Action Servlet)进行初始化工作,读取配置文件(struts-config.xml),为不同的Struts模块初始化相应的ModuleConfig对象。控制器接收Http请求,并从ActionConfig中找出对应于该请求的Action子类,如果没有对应的Action,控制器直接将请求转发给JSP或者静态页面,否则控制器将请求分发至具体Action类进行处理。在控制器调用具体Action的Execute方法之前,ActionForm对象将利用Http请求中的参数来填充自己。Action要处理的业务逻辑封装在JavaBean中,通过JavaBean调用EJB以完成业务处理。Action执行完后返回一个ActionFroward对象。
2 简单的Web服务体系结构
当您要将企业应用程序转变成与 Web 服务一起使用时,最简单的途径就是将单个操作与单个的企业服务结合在一块,如图3所示。
图3 简单Web服务体系结构
在这种设计方法中,实现业务逻辑的服务与实现数据检索的服务是混合在一起的。这样的一种 Web 服务可以很容易从已有的业务组件中开发出来。然而,它有很多的缺点:对用户没有提供统一认证,提供者与订阅者耦合不紧,业务逻辑没有重用。简而言之,对于一个连贯的解决方案来说这并不是一个非常好的体系结构。
3 采用 Struts的 Web 服务
前面讲过,Struts 架构清晰地区分开了视图、控制器以及模型。模型包含所有必须的业务逻辑,从存储数据仓库中检索数据。您可以构建一个简单的 Web 服务层——称为 WSManager 层——这样的模型可以提供 Web 服务也可以订购 Web 服务。使用这种体系结构的应用程序将基于组件开发的最佳点与Internet结合在了一起,如图4所示。
其它Struts相关组件前面已讨论,下面主要讨论这种体系结构中WSManager层,因为它是此体系结构中真正新加的部分。
作为Web服务端和EJB容器之间的中间件,WSManager 接收 JAX-RPC 端点的请求。将客户端请求映射到WSManager 类中的方法调用。这些客户端请求是SOAP 信息的格式。WSManager 必须实现安全认证,转变参数,在指定请求到模型服务之前,要对这些请求进行参数预处理。请求所包含的参数形式有 Java 对象,Java原始参数,XML 文档,或者甚至是 SOAP 文档分片(例如,SOAP Element 对象)。这些类型必须要转化成内部所支持的 schema(例如,预定义的 Java 数据访问对象)。
图4 采用Web服务的Struts应用程序
WSManager 也可以生成响应;这个过程由方法调用返回值的简单构造所组成。WSManager 中保留这样的功能,您可以通过缓存数据从而避免重复访问模型服务层。您还可以集中管理响应聚集以及 XML 文档转换,如果您要返回给调度者的文档必须遵守与内部 schema 不同的 schema 时,这一点就显得尤其重要。
在以上模型中,Web服务的客户端通过SOAP消息与Web服务端点进行交互从而达到使用EJB组件提供的服务的目的。在Web服务端,WSManager 处理所有SOAP 请求并把它们委派到模型层(EJB层,使用Session Facade 设计模式)所暴露的业务逻辑。这样有很多好处,因为 WSManager 会:
(1)作为初始联系点来管理请求与服务。
(2)调用安全服务,包括身份验证与授权使用,从而避免任何重复的层访问。
(3)委派业务处理(采用由 Struts 应用程序所使用的模型服务)WSManager代理对EJB的方法调用。接受客户端传递的所有参数然后简单地把这个调用代理给会话外观的某个方法,把对EJB的调用过程从Web服务端点中分离出来。
(4)隐藏与EJB相关的系统异常。与API相关的系统异常,比如RemoteException,EJBException都在WSManager中被捕获然后作为一个非EJB的相关异常(比如一个自定义的业务代理异常)通过Web服务端点重新抛出给客户端。应用级的异常仍然被传递给Web服务端点,然后由Web服务端点通过SOAP消息发送给调用Web服务的客户端。
(5)缓存数据避免任何不必要的数据库访问,可以在本地缓存一个会话bean方法调用返回结果,然后在后续请求中把它们传递给Web服务端点。还可以缓存一个会话bean的引用。
(6)具有重新尝试失败事务的能力。WSManager可以实现判断事务失败原因所需的复杂错误处理代码。通过重新执行会话外观的方法来重新尝试执行事务,WSManager对Web服务端点隐藏了复杂的处理过程。
(7)快速方便地进行Web服务地发布和使用。在 WSManager 类中实现的每一个公共方法都将作为一种Web服务发布出来。换句话说,您要为这些类发布一种Web 服务描述。Web 服务描述是由服务的Web 服务描述语言(Web Services Description Language,WSDL)描述与由它所引用的任何 XML schema 所组成。应用程序可以利用在公共注册表或者企业内部中已存的Web服务。WSManager有解析必要的WSDL文件的方法并且调用相关的操作返回一个值。
4 总结
通过在Action和EJB层间加入WSManager层即在Web容器和EJB容器之间加入WSManager中间件,很好地结合了Struts和Web服务。使用本文所阐明的体系结构,我们可以快速高效地开发出这样的企业应用程序,它非常健壮,很容易维护,而且能很容易地与早期应用程序集成在一起。
参考文献
[1]飞思科技产品研发中心编著,JSP应用开发详解。北京:电子工业出版社,2004.1
[2]Ted Husted著,Eric Liu(铁手)译,Struts In Action中文版,2005.10.14
[3]Ed Roman著,刘晓华等译,精通EJB(第二版)。北京:电子工业出版社,2002.10