就 MVC 模式而言,Struts 2 中使用的 Action 是啥?

Posted

技术标签:

【中文标题】就 MVC 模式而言,Struts 2 中使用的 Action 是啥?【英文标题】:What is Action used in Struts 2 in terms of MVC pattern?就 MVC 模式而言,Struts 2 中使用的 Action 是什么? 【发布时间】:2016-08-03 09:05:35 【问题描述】:

在Struts2中,控制器将请求分发给Action,Action将其传递给后端逻辑,可以认为是一个非常大的模型来处理请求,JSP代表视图.

Struts2中如何定义Action?绝对不是 视图。是控制器还是模型?

【问题讨论】:

【参考方案1】:

Struts 动作是 MVC 模式意义上的控制器。 我认为对值堆栈和ActionContext 以及动作类中的 getter 方法的讨论会混淆这个问题。通常,这些只是其他对象(通常是模型对象)的容器。

虽然@AndreaLigios 指出您可以使用各种 get 方法从动作中检索对象,但这更多的是通过赋予它通常分配给模型对象的额外职责来削弱动作凝聚力的问题。是的,当您考虑做什么(或应该做什么)时,评估对象的职责很重要。

简单来说,所有MVC框架中主要组件的职责如下:

模型对象负责保存在您的应用程序域中收集或计算的数据。 视图对象负责向用户或其他接收者(如服务客户端)显示信息 控制器对象负责协调模型和视图组件之间的数据流。

当您查看像 Struts(或 Spring MVC)这样的特定 MVC 框架时,您会发现这些框架通常同时提供 Controller 和 View 组件,但您自己的工作是构建模型。尽管如此,Struts 还是提供了大量的附加对象和组件,例如ActionContext,这使得从您的视图组件访问您的模型对象变得更加容易。

【讨论】:

【参考方案2】:

动作绝对接近于作为controller而不是model的术语。特别是如果您将 REST 与 Struts2 一起使用,您可以阅读 Mapping REST URLs to Struts 2 Actions。

动作还是控制器?大多数 Struts 2 开发人员都熟悉 Action。它们是由传入请求执行的东西。在 REST 插件的上下文中,为了让您保持警觉,我们将采用 RESTful 术语并将我们的操作称为控制器。不要混淆;这只是一个名字!


如果您需要消除对用于 Struts 2 框架架构的 MVC 模式的困惑,那么您可以阅读Confusion in Struts 2 MVC architecture:

实际上 Struts2 Actions 是 控制器委托。并且 Struts2 在 View 层上提供了一个 valueStack,它上面有一个 Action,如果你想使用 pseudo-model 那么 action 应该实现 ModelDriven 接口。

您还应该注意,Struts2 操作是由 Struts2 容器管理的简单 POJO。这在 MVC 的观点上有点不同,也称为 MVC Model2。

控制器负责处理请求并返回一个视图作为结果。这就是动作在 Strust2 中所做的事情。

用户经常将他们的模型与控制器聚合这一事实并没有错放控制器定义。那么如果一个控制器有一个模型,那么你可以认为它是big模型的一部分。它是不是

最重要的部分是模型和视图的通信。在 Struts2 中,它是通过动作上下文执行的。视图应该有权访问操作上下文以检索模型。这是由OGNL 连接的。

框架将 OGNL 上下文设置为我们的ActionContext,并将值堆栈设置为 OGNL 根对象。


在当前版本的 Struts 中,动作/控制器被推送到值堆栈,并以与模型相同的方式访问。这是无害的操作,因为控制器是线程安全的实例。为什么不像模型一样重用它们?

将模型对象聚合到控制器并从那里访问它们也是无害的。您可以将任意数量的模型关联到同一操作。但是,如果您考虑一个模型,那么您可以使用ModelDriven 操作。但不推荐使用最后一种,因为它给 Struts2 应用程序的架构带来了不必要的复杂性,而且很容易出错。


【讨论】:

【参考方案3】:

它绝对是(部分)控制器,但它也是(部分)模型。

我的 2 美分:

Action 是控制器,因为...

...在 Struts2 中,控制器由负责读取、解释和操作请求的所有内容组成,以提出适当的响应,因此是的,Action 是控制器,以及拦截器堆栈中的每个拦截器,我们可以将含义扩大到包括Filter、ActionMapper等。

动作就是模型,因为...

... Struts2 是一个Pull-MVC 框架:

Pull-MVC 和 Push-MVC 可以通过视图层的方式更好地理解 获取数据,即要渲染的模型。在 Push-MVC 的情况下,数据( 模型)由控制器构造并提供给视图层 通过将其放入请求或会话等范围变量中。典型的 例如 Spring MVC 和 Struts1。另一方面,Pull-MVC 将 通常在 Controller 中构建的模型数据保存在一个公共的 放置即在动作中,然后由视图层呈现。 Struts2 是基于 Pull-MVC 的架构,其中所有数据都存储在 Value 中 堆栈并由视图层检索以进行渲染

那么在 Struts2 中,Value Stack 就是 Model,Action 被推送到 ValueStack 上(顶部)。因此,动作是模型的一部分。 我们可以扩大 Model 的含义以包括整个 ActionContext(及其所有范围 - Page、Request、Session...)

那么当 Action 在你的 execute() 方法中时是控制器,当它存储你通过 getSomething() getter 方法从 JSP 获取的属性时是模型。


现在,重要的是:不要使用 ModelDriven :o)

【讨论】:

以上是关于就 MVC 模式而言,Struts 2 中使用的 Action 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

基于MVC模式的应用框架之struts

Struts2详解

Struts 2

Struts2是一个基于MVC设计模式的Web应用框架

Struts 2初体验

Struts2——一个用来开发 MVC 应用程序的框架