Struts是在J2EE Web应用程序中使用的框架,该框架试图为Web应用程序提供基于MVC模式的编码方法。它包括一些用于表单数据验证的附加实用程序等。它是一个开源项目,并且非常擅长解决Web应用程序难题中的特定部分,并且仅限于解决特定部分。
另一方面,ATG(ATG Dynamo)是一个应用程序平台-解决方案和框架-用于构建数据和内容驱动的Web应用程序-主要用于商业和发布。在框架级别,它是一个基于Java的应用程序平台,用于承载基于Web的应用程序以及RMI可访问的业务组件,并带有ORM层,组件容器,MVC框架和JSP的一组标记库。组件框架(Nucleus)是一个轻量级的容器,用于管理Java组件对象(bean)的生命周期和依赖项绑定(bind)(依赖项注入(inject))。从这个意义上讲,它有点类似于Spring bean容器,并且是ATG框架的核心-所有其他服务和框架都托管在其中。 ORM层框架(存储库)将对象映射到关系数据库或从关系数据库映射对象(正如您所期望的)。但是,它也可以使用相同的一致数据访问API处理LDAP,XML和文件系统数据的映射。用于将页面上的表单元素绑定(bind)到业务对象等上的值的JSP标记比我所见过的任何其他框架中的表单绑定(bind)标记更加优雅和简洁。与标准J2EE标签相比,编写自己的标签库等效项(Droplets)的机制与Servlet API更加一致。
MVC框架(基本的Form处理程序模式)在某种程度上类似于Struts的Form和Action类-但是提供了Struts所提供的更为基本的框架。开箱即用,并且在大多数开发人员的工作层次上,ATG模型是页面驱动的,而不是 Controller 驱动的。在内部,它肯定是由 Controller 驱动的,通过流水线方法链接调度程序和 Controller 。
此外,基本框架为您提供RMI容器,分布式缓存,分布式锁定和分布式单例,分布式事件和消息传递,任务调度程序,规则引擎以及用于定义具有自定义操作和结果的业务工作流的机制,用于业务工作流的图形编辑器,对版本数据的支持,对角色和权限的支持,日志记录和审计-全部开箱即用,并且全部使用非常一致且一致的API
然后,在解决方案级别,您具有用于处理用户配置文件,身份管理和个性化,内容创作,版本控制和发布,内容搜索,有形和无形商品的产品目录,产品搜索和导航,定价,税收计算,促销,购物车,礼品 list 和愿望 list ,付款类型,运输方式,订单跟踪,客户关系管理等。
ATG的扩展点和集成点通常设计得很好,并且有据可查。它们支持与电子商务和发布空间中几乎任何人的集成,例如创作和内容管理,身份管理和安全性,产品目录,搜索和引导式导航等。此外,框架的几乎所有 Realm 都是可扩展的和可插拔的,因此您可以编写自己的组件来增强或替换现成的组件。
比较这两者并没有多大意义。但是,考虑到您的问题,我想您真正感兴趣的是ATG的MVC部分
对于MVC,Struts可以给您带来比ATG更大的 yield (但是Spring MVC可以给您带来比Struts更大的 yield )。但是,与Struts相比,与ATG相比,您更容易陷入框架的机制。
就我个人而言,我认为ATG基于表单处理程序的模型比我所见过的大多数其他Web MVC框架更加优雅,简洁和易于使用,并且API与Servlet API更加一致。
还请记住,大多数“Web-MVC”框架都不像真正的MVC(即用于Smalltalk甚至Java Swing等中的GUI编程的模式)。 Struts和ATG都没有提供(按设计)真正的MVC-尽管ATG实际上更接近。关于术语有很多困惑。
例如,
真正的MVC中的模型既不是您的数据模型,也不是您的域模型对象。它是代表 View 中所有数据的模型。如果那恰好是一个领域模型(Domain Model)对象,那就很好了-但是通常,您会发现需要一组不同的 View 或表单对象。而且,该模型负责保持自身的更新-它是与业务服务交互的模型。 ATG倾向于将模型和 Controller 融合为一个组件-表单处理程序。 Struts倾向于使 View 数据模型(表单对象)与众不同,但在真正的MVC意义上不鼓励将其用作模型-它不是与其他业务服务交互以保持自身更新的表单对象。 MVC中的 Controller 不是您的业务 Controller 。 MVC中的 Controller 是 View 和模型之间的 channel 。它对 View 中的更改或对 View 执行的操作使用react,并指示模型进行相应的更新。他们在Struts中谈论的Controller根本不是MVC Controller -它实际上是一个调度程序。 Controller 中的许多代码最终都在您的Action类中。但是,按照Struts的设计方式,Action类实际上是要执行Model的工作。 MVC中的View应该由模型填充-它是模型更新 View 的推送机制,而不是 View 查询模型的拉机制。在大多数Web MVC框架中, View (通常是JSP)从模型中提取状态以进行显示。 ATG的页面驱动方法尤其如此。如果发现在渲染页面时正在获取数据,则表示MVC设计有问题。 在Struts中,MVC Controller 的功能分布在Struts Controller 和Action中,而MVC Model的功能分布在Form对象和Action中。
在ATG中,MVC Controller 和MVC模型的功能全部在表单处理程序中
话虽如此,由于HTTP的请求-响应特性,Web MVC框架中Controller的功能非常有限。对于Web应用程序,我们倾向于获得表单提交的完整更新 View ,而不是像使用丰富的UI框架那样进行大量小的更改(例如每次按键或单击鼠标或更改每个输入字段)。 AJAX的使用正在改变这一点-我们必须更多地考虑正确实现MVC。
请记住,MVC是一种设计模式-即它是在设计应用程序的GUI方面时要使用的设计时原理。 Struts和ATG是框架-即它们是在构建应用程序时要扩展,实现或配置的类和对象。框架不能强制使用设计模式-只能鼓励它。选择使用特定的框架不会使您的ciode设计得更好-最多可能会鼓励一定的纪律。
如果您对MVC进行了精心设计,则无论使用Struts类还是ATG类来实现它都不会有太大的不同。同样,如果您对MVC的设计不好,希望您选择的框架能够弥补您的不足,那么无论您使用Struts还是ATG都不会有太大的不同。如果理解并使用了设计原则,您会发现在框架之间来回切换非常容易。
最好的代码将是抽象的代码,它遵循良好的设计原则(例如,真正的MVC),并使用所选框架中打算使用的正确工具来实现(实现)。
回到您的问题;
如果您正在从事ATG项目,则应使用ATG提供的框架。我可以很容易地将Struts插入ATG应用程序中-我很多年前就已经做到了-但付出的努力远远超过其值(value)-并且您放弃了ATG提供的许多现成功能对象生命周期管理,表单数据绑定(bind)等。
如果您将要开始一个新项目并且可以选择使用各种框架-我个人将推荐一个开源应用服务器(例如JBoss)和Spring框架-它为您提供了ATG和Struts提供的最好的东西。它具有一个类似于Nucleus的组件容器(应用程序上下文),它与所有良好的ORM解决方案(例如Hibernate)集成,并且包含一个MVC框架,在我看来它已经远远超过了Struts。另外,我建议您查看Spring Web-flow以获取更高级别的GUI流程设计。