在开发struts2应用程序时,我被要求实现两个页面:一个列出当前用户的书籍,另一个列出当前用户的CD。所以我决定实现两个struts2动作:ListBooks和ListCDs,它们都有标准的调度结果类型,指向相应的JSP页面。
后来,客户改变了主意,并决定书籍和CD的两个列表应该位于同一页面上。那么如何重用我的动作以便我不需要重写任何类。
第一种方法是使用动作链。这样两个动作都可以将它们的属性贡献给值栈。但后来出现了一个问题:我们为行动建立了一些不自然的秩序。如果我将ListBooks链接到ListCDs,那么自己调用ListCD会导致一些错误的行为 - 因为它会导致一个页面,其中应该列出书籍和CD。
另一种方法是使用动作标签。但是我不喜欢它,因为它强制将我的页面分成多个JSP部分,并且通常感觉不像struts2风格那样做。
那么如何以“干净的方式”将我的行为组合成单页呢?问题似乎很简单。
这个问题产生的另一个问题是关于struts2设计 - struts2的行为是否需要承担太多责任?除了作为“单一工作单元”之外,它们还与演示级别相结合。每当我改变页面结构时,我都要考虑重新设计我的动作。我错过了什么或struts2真的有这种设计弱点吗?
答案 0 :(得分:1)
Struts 2操作只有在设计时才会承担太多责任 - 它们应该充当Web和业务层之间的薄弱桥梁。
每个早期的操作应该只有一个服务来检索有问题的项目。新操作将同时具有这两种服务,并将用户书籍和CD的结果公开给视图层。
当然,它们与演示级别相关联 - 它们决定了视图可用的内容。在任何基于动作的框架中都是如此,无论是动作本身,ModelDriven
动作中的模型,返回视图的Spring MVC控制器,Struts 1动作形式,请求属性等等。
支持您所描述的更改类型所需的工作量几乎为零:将服务从一个操作移动到另一个操作,并直接公开其他结果,或将它们添加到公开的模型中。