就 MVC 模式而言,Struts2 中使用的 Action 是什么?

What is Action used in Struts 2 in terms of MVC pattern?

在Struts2中,controller向Action派发请求,Action将请求传递给后端逻辑,可以说是一个非常大的model , 来处理请求并且 JSP 表示视图。

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

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

Actions or Controllers? Most Struts 2 developers are familiar with the Action. They are the things that get executed by the incoming requests. In the context of the REST plugin, just to keep you on your toes, we'll adopt the RESTful lingo and refer to our Actions as Controllers. Don't be confused; it's just a name!


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

Actually Struts2 Actions are controller delegates. And Struts2 provides a valueStack on the View layer which has an Action on top of it, and if you want to use a pseudo-model then action should implement ModelDriven interface.

You should also note that Struts2 actions are simple POJOs managed by Struts2 container. This is a bit different in the MVC point of view, also known as MVC Model2.

控制器负责处理请求,return 作为结果的视图。这就是在 Strust2 中执行的操作。

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

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

连接的

The framework sets the OGNL context to be our ActionContext, and the value stack to be the OGNL root object.


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

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


它肯定是 Controller(的一部分),但它也是 Model(的一部分)。

我的 2 美分:

Action 是控制器,因为...

...在 Struts2 中,控制器由负责读取、解释和操作请求的一切组成,以便提出适当的响应,因此是的,操作是控制器,以及Interceptor Stack 中的每个 Interceptor,我们可以扩大含义,包括 Filter、ActionMapper 等。

行动就是榜样,因为...

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

Pull-MVC and Push-MVC are better understood with how the view layer is getting data i.e. Model to render. In case of Push-MVC the data( Model) is constructed and given to the view layer by the Controllers by putting it in the scoped variables like request or session. Typical example is Spring MVC and Struts1. Pull-MVC on the other hand puts the model data typically constructed in Controllers are kept in a common place i.e. in actions, which then gets rendered by view layer. Struts2 is a Pull-MVC based architecture, in which all data is stored in Value Stack and retrieved by view layer for rendering.

然后在 Struts2 中,Value Stack 是模型,Action 被推送到 ValueStack(顶部)上。因此,动作是模型的一部分。 我们可以扩大模型的含义以包括整个 ActionContext(及其所有范围 - 页面、请求、会话...)

然后 Action 在您的 execute() 方法中是控制器,当它存储您从 JSP 到 getSomething() [=38= 中获取的属性时,它是模型] 方法。


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

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

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

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

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

当您查看 Struts(或 Spring MVC)之类的特定 MVC 框架时,您会发现这些框架通常同时提供 Controller 和 View 组件,但构建它们是您的工作模型自己。即便如此,Struts 提供了大量额外的对象和组件,例如 ActionContext,可以更轻松地从 View 组件访问 Model 对象。