【问题标题】:Push vs Pull Model in MVCMVC 中的推与拉模型
【发布时间】:2013-07-03 07:18:13
【问题描述】:

MVC 的推拉模型有什么区别?

是基于 Struts2、Spring MVC Pull 的吗?

【问题讨论】:

    标签: java spring-mvc struts2


    【解决方案1】:

    根据Struts2 Interview Questions and Answers

    Struts2 是一个基于 Pull-MVC 的架构,其中所有数据都存储在 Value Stack 中,并由视图层检索以进行渲染。

    具体来说:

    在 Push-MVC 的情况下,数据(模型)被构建并提供给 控制器通过将视图层放入作用域变量中 像请求或会话。典型的例子是 Spring MVC 和 Struts1。 另一方面,Pull-MVC 将通常构建的模型数据 in 控制器被保存在一个共同的地方,即在动作中,然后 由视图层渲染。

    【讨论】:

    【解决方案2】:

    推送和拉取的概念是指服务器相对于客户端所做的事情。在“推送”应用程序中,服务器在它自己的启动时向客户端推送或发送数据。在“拉取”应用程序中,服务器正在拉取或等待并接收客户端发起的消息。

    这里mvc-pattern-its-importance-push-pull和这里pull-vs-push-mvc-architecture给出了很好的解释

    Struts1 和 Spring 都使用 Push MVC。这个问题可能会有所帮助spring-mvc-complex-model-population-from-multiple-sources Struts2 使用 Pull

    【讨论】:

    • 对不起,但整个万维网的说法恰恰相反。 Spring MVC 是 PUSH,Struts1 是 PUSH,但是 Struts2 是 PULL...
    • 但是 MVC Push 和 Pull 之间哪个更好
    • 这真的取决于你正在构建什么。如果一个在每种情况下都更好,我们就不会使用另一个。通读上面的文章并尝试确定更适合您的文章。如果您仍有疑问,请提出另一个对您的系统有更具体要求的问题
    【解决方案3】:

    Struts2,玩!等等都是MVC模式的各种拉模型实现。

    术语“push”和“pull”直接指在 View 和 Model 之间使用的观察者模式的实现类型。如 GoF 观察者模式解释中所述,我们有:

    在一种极端情况下,我们称之为推送模型,主体向观察者发送有关更改的详细信息,无论他们是否愿意。另一个极端是拉动模型;主题只发送最少量的通知,然后观察者明确要求详细信息。

    这意味着push model的实现需要View和Model使用相同的语言实现,并且在相同的环境中执行。这种实现的好例子是 Javascript 单页应用程序,其中 View 和 Model 组件在浏览器和框架内执行,即Backbone,提供 MVC(又名 Observer)机制。通常,Model 组件与某种服务器 API 交互,以持久化和获取持久化数据。

    另一方面,pull model 让您可以使用不同的技术来实现 MVC,用于 View 组件和 Controller / Model 组件。在这种 MVC 中,没有显式使用观察者模式,视图只与控制器交互。 View 组件通常在浏览器中执行,向 Controller 组件发送模型更新或模型状态的请求。通常请求是使用 HTTP 协议实现的。这种实现需要使用某种类型的“增强的 HTML 脚本语言”,例如 JSP,它允许在 View 和 Controller 之间自动创建链接。

    【讨论】:

    • Spring MVC 不是拉模型。
    • @AleksandrM,看来你是对的。我发现很多资源都说 Spring 是推送模型的实现。我一直认为 Spring MVC 实现了拉取模型。在 push 模型中,View 观察模型,但使用 JSP 怎么可能?!无论如何,我的答案是正确的。
    • @AleksandrM 好的,我知道了。您的定义遵循本次讨论J2EE patterns: Clarification on MVC Pull and MVC Push 中所说的内容。我会尽快更新我的答案:)
    【解决方案4】:

    对不起..我不认为struts 1、struts 2和spring MVC可以当作PUSH MVC..

    因为所有框架都使用在各自的部署描述符中定义的前端控制器[Struts 的 Filer 类和 Spring 的 Controller Listener]。现在,所有这些框架都使用该控制器通过反射将表单数据保存在它们各自的 bean[或模型] 对象中。

    现在,我们可以从我们的动作控制器接收 bean 对象并将获取值,但在实际生成 bean 对象[或模型]的前端控制器中,使用 request.getParameter(param) 在其相应字段中设置值或者内部的 request.getParameterValues(param) 方法。所以这可以被认为是 PULL。

    所以按照我的想法,我们可以说这些框架可以使用两层,即最终程序员使用的 PULL 层和框架基类使用的 PUSH 层。

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 2011-05-02
      • 2012-11-17
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多