【发布时间】:2010-11-17 20:55:06
【问题描述】:
我最近在一次采访中被问到 - 在 java 中,您如何比较基于组件的框架和基于请求的框架?我将 EJB 解释为基于组件的框架的示例,将 Struts 解释为基于请求的框架,但我不相信我是否公正地回答了这个问题。
对于面试官的意思和应该比较的内容有什么想法吗?
问候, 阿瓦朱鲁格
【问题讨论】:
标签: java frameworks struts ejb components
我最近在一次采访中被问到 - 在 java 中,您如何比较基于组件的框架和基于请求的框架?我将 EJB 解释为基于组件的框架的示例,将 Struts 解释为基于请求的框架,但我不相信我是否公正地回答了这个问题。
对于面试官的意思和应该比较的内容有什么想法吗?
问候, 阿瓦朱鲁格
【问题讨论】:
标签: java frameworks struts ejb components
他们最有可能在寻找 web 框架的示例 - 例如,JSF 是一个基于组件的框架,而 Struts 是一个基于请求的框架。
基于请求的框架通常通过其 API 清楚地表明它们正在解析 HTML 请求/生成 HTML 响应,而基于组件的框架试图将其抽象出来并将应用程序视为具有渲染器的组件集合和做事的行动。
在我看来,基于组件的 Web 框架比它们的价值要麻烦得多——它们的主要目的通常是让不熟悉 Web 开发的开发人员“更容易”开发 Web 应用程序,并且更接近于传统的桌面开发.然而,在实践中,当出现问题时,您需要开发自定义组件,您需要为非“开箱即用”功能的东西自定义框架等等。您需要了解底层的“传统”Web 开发以及基于组件的框架如何对其进行抽象 - 如果您是一位经验丰富的 Web 开发人员,并且拥有适用于“传统”Web 开发的现有解决方案、实用程序、库或 sn-ps,您将浪费时间重新实现它们以在基于组件的框架内工作。
【讨论】:
基于请求的框架是一个网络框架,它获取用户的请求,然后确定系统应该做什么并将响应返回给用户。所以流量几乎是线性的。您正在考虑采取行动:用户想要什么(请求)-> 用户将得到什么(响应)。基于请求的框架的一个例子是Struts。现代的Grails 也是一个基于请求的框架。
基于组件的框架并非如此。从前到后实际上没有清晰的流动感。它的一个例子不是 JSF,因为在某些方面 JSF 与 Struts 几乎完全相同(因为 creator of Struts and JSF 是相同的)。基于组件的框架Tapestry 和Wicket 的一个很好的例子。这两个框架中的范式是不同的。你思考的不是行动或请求-响应,而是组件和组件。您在应用程序中定义一个组件,并告诉该组件做什么。但流程不必像在基于请求的框架中那样是线性的。
【讨论】:
JSF 是基于组件的Java API,正如Nate 所说,Struts 是一个基于动作的框架,Http 请求被解析,同时处理动作最终由控制器Servlet 将请求转发给JSP,JSP 将负责生成回复。虽然 JSF 已成为基于组件的 Web 框架的标准,但实际上不需要处理请求和响应,因为我们只需要编写 JSP 或 XHTML 页面,绑定页面中使用的组件或它们应该呈现的值到支持 bean 或托管 bean 中的属性,FacesServlet(控制器)完成所有工作以关心请求解析和重定向到 JSP,该 JSP 将根据 faces-config.xml 中指定的导航规则呈现响应。因此,您可以看到 Struts 和 JSF 之间有很大的不同,因为 JSF 带来了基于组件事件的方法,而 Struts 更接近经典的 JSP/Servlet 模型。还有一点 jpartogi 说过 JSF 和 struts 的创建者是一样的,我只想提一下,Struts 是 Apache 社区拥有的框架,而 JSF 是 JCP 在 JSR-127 中为 1.1 版和 JSR-252 指定的 API适用于 1.2 版并具有不同的实现(SUN-RI、Apache MyFaces...)
【讨论】:
简单地说,如果框架在java端为每个web元素都有对象,那么你可以改变它的属性或添加一些功能,它是基于组件的框架,但如果框架不提供对象,你必须把响应值其标签之间的 web 元素是一个基于请求的框架。
【讨论】: