问题描述
我听说JSF正在实现基于组件的MVC,Spring MVC正在实现基于请求的MVC.我想知道这两种类型之间的确切技术差异是什么.
推荐答案
在基于请求(操作)的MVC中,单个前控制器Servlet将根据请求URL/params委派给动作模型.您可以直接与操作模型中的RAW HttpServletRequest和HttpServletResponse对象一起工作.您已经自己编写代码以收集,转换和验证请求参数,并在必要时更新模型值,然后再调用业务行动.
在基于组件的MVC中,单个前控制器将收集,转换和验证请求参数并更新模型值本身,因此您只需要担心自己的业务行动即可.控制器需要如何收集/转换/validate/更新值,在单个位置(视图)中定义.由于"普通" HTML无法做到这一点,因此需要一种特定的标记语言才能实现目标.如果是JSF 2.0,则基于XML(XHTML).您使用XML定义UI组件,该组件又包含有关控制器应如何收集/转换/validate/更新模型值并生成/渲染必要的HTML表示的信息.
在这一点上应该很明确:使用基于请求的MVC框架,您需要自己编写更多(样板)代码以实现目标.但是,您最终可以对该过程和HTML/CSS/JS输出进行更精细的谷物控制.使用基于组件的MVC框架,您无需自己编写太多代码.但是,您对该过程和HTML/CSS/JS输出的粒度控制较少.因此,如果您想与标准描述和/或实现所提供的 bit 不同,那么当您不是在基于组件的MVC框架中,您将浪费更多的时间精通它的ins and out.
Manfred Riem(JSF 2.X团队成员和Ex Java EE 8 MVC 1.0 Spec Lead)在他关于Devoxx上关于MVC 1.0(JSR 371)的演讲14 :
另请参见:
问题描述
I have heard that JSF is implementing the component based MVC and Spring MVC is implementing the request based MVC. I would like to know what is the exact technical difference between these two types.
推荐答案
In request (action) based MVC, a single front controller servlet will delegate to action models based on request URL/params. You work directly with raw HttpServletRequest and HttpServletResponse objects in the action model. You've to write code yourself to gather, convert and validate the request parameters and if necessary update the model values before you can ever invoke the business action.
In component based MVC, a single front controller will gather, convert and validate request parameters and update the model values itself so that you only need to worry about the business action yourself. How the controller needs to gather/convert/validate/update the values is definied in a single place, the view. Since that's not possible with "plain" HTML, a specific markup language is required to achieve the goal. In case of JSF 2.0, that's XML (XHTML) based. You use XML to define UI components which in turn contain information about how the controller should gather/convert/validate/update the model values and generate/render the necessary HTML representation.
Advantages and disadvantages should be clear at this point: With a request based MVC framework you need to write more (boilerplate) code yourself to achieve the goal. However you end up with much more fine grained control over the process and the HTML/CSS/JS output. With a component based MVC framework you don't need to write much code yourself. However you have less fine grained control over the process and the HTML/CSS/JS output. So if you'd like to do things a bit differently than the standard describes and/or the implementation provides, then you'll waste a lot more time in a component based MVC framework when you're not well versed with its ins and outs.
Manfred Riem (JSF 2.x team member and ex Java EE 8 MVC 1.0 spec lead) has outlined it nicely during his speech about MVC 1.0 (JSR 371) on Devoxx 14: