请求式MVC和组件式MVC的区别

63

我听说JSF正在实现基于组件的MVC,而Spring MVC正在实现基于请求的MVC。我想知道这两种类型之间的确切技术差异是什么。


许多好的问题会基于专家经验产生一定程度的观点,但对于这个问题的答案往往几乎完全基于观点,而不是事实、参考或特定专业知识。 - Roman C
12
恕我冒昧,请求技术差异并非主要基于观点。 - BalusC
1个回答

97
在基于请求(操作)的MVC中,单个前置控制器Servlet将根据请求URL/参数委派给操作模型。您直接使用操作模型中的原始HttpServletRequest和HttpServletResponse对象。在调用业务操作之前,您必须自己编写代码来收集、转换和验证请求参数,并在必要时更新模型值。
在组件化的MVC中,单个前置控制器将自行收集、转换和验证请求参数并更新模型值,因此您只需要关注业务操作本身即可。控制器需要如何收集/转换/验证/更新值是在一个地方定义的,即视图。由于这在“普通”HTML中不可能实现,因此需要特定的标记语言才能实现目标。在JSF 2.0的情况下,它是基于XML(XHTML)的。您使用XML来定义UI组件,这些组件又包含有关控制器应如何收集/转换/验证/更新模型值以及生成/呈现必要的HTML表示的信息。
此时应该清楚了优缺点:使用基于请求的MVC框架,您需要自己编写更多(样板)代码才能实现目标。但是,您最终会对过程和HTML/CSS/JS输出拥有更精细的控制。使用基于组件的MVC框架,您不需要自己编写太多代码。但是,您对过程和HTML/CSS/JS输出的控制更少。因此,如果您想以与标准描述和/或实现提供的方式略有不同的方式进行操作,则在组件化的MVC框架中,当您不熟悉其细节时,将浪费更多的时间。

曼弗雷德·里姆(JSF 2.x团队成员和前Java EE 8 MVC 1.0规范负责人)在他在Devoxx 14上关于MVC 1.0(JSR 371)的演讲中很好地概述了它

photo

参见:


很多人说,在MVC模型中,模型代表数据库。这是真的吗?它是Bean还是数据库? - Krishna
4
不,它并没有明确代表数据库。在Java世界中,模型只是一个JavaBean。JavaBean又可以是数据库实体。然后,正是这个类被JDBC或JPA代码用来映射/传输Java运行时环境和数据库表之间的值。 - BalusC
这样就使得ASP .NET MVC基于组件开发了,对吧? - hari_sree
3
ASP.NET MVC 是基于请求的,它是无状态的,并且基于 GET/POST 机制。 - Omar Salem
@BalusC 这两种类型在处理异步HTTP(AJAX)请求的生命周期方面是否有显著差异?还是我理解有误? - Piovezan
1
在Devoxx上发布Manfred Riem演示的图片加1分。当我在谷歌搜索这个主题时,我就想到了那张幻灯片。 - Jaap Coomans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接