36

我看到从 JSF2.0 开始,Facelets 视图定义语言是首选的视图定义语言,而不是 JSP,它已被弃用为旧式后备。我想了解为什么从 JSF2.0 开始,Facelets 优于 JSP 作为视图定义语言?我知道 JSP 也有一些模板行为,这是采用 Facelets 的主要驱动点。

PS:我已经通过stackoverflow上的这篇文章,但我认为它不能回答我的问题。因此将其作为一个单独的问题发布。

4

2 回答 2

45

诚然,JSP 有一些 模板功能,但在 JSF 中使用 JSP 的最大缺点是 JSP 一遇到模板文本内容就会写入响应,而 JSF 想用它做一些前/后处理。在 JSF 1.0/1.1 中,以下 JSF 代码

<h:outputText value="first"> second <h:outputText value="third"> fourth

会产生

第二 第四 第一 第三

这是在 JSF 1.0/1.1 时代令人头疼的问题。开发人员需要将模板文本secondfourth上面示例中的和<f:verbatim>在所有地方的标签中进行包装。JSF 1.2 已经通过改进的视图处理程序解决了这个问题,该处理程序解析 JSP 而不是执行它,但它在底层仍然非常笨拙,因为 JSP 语法不像 XML 那样“格式良好”。强烈需要基于 XML 的视图技术,以便可以使用基于 SAX 的高效解析器。Facelets 诞生了(在 Ken Paulsen 的“JSFTemplating”中)。

此外,统一的 EL#{}不能在 JSP 模板文本中使用,从而导致丑陋的(对于初学者来说不直观${}#{}. 此外,JSTL 在 JSP 上的 JSF 1.x 中不能用作视图构建时间标记。此外,带有事物的 JSP 语法<% %>是老派,在 JSP 中嵌入原始 Java 代码的可能性被认为是一种非常糟糕的做法,它打破了MVC 意识形态

总而言之,从 JSF/MVC 的角度来看,JSP 简直丑陋而糟糕,而 Facelets 简直就是干净而令人敬畏。

于 2012-10-26T19:22:42.993 回答
12

我在网上找到了以下答案。

JSFToolbox 文档第 3 章

JSP 编译时开销

每次编辑、保存和重新加载 JSP 页面时,服务器的 JSP 编译器都会生成 Java servlet 代码并将其编译成 servlet。这称为 JSP 转换过程,通常需要 1-2 秒,具体取决于服务器性能。

Facelets XML 编译

与 JavaServer Pages 不同,Facelets 页面不会编译成 servlet。由于 Facelets 页面与 XML 兼容,因此 Facelets 框架使用基于 SAX 的快速编译器来构建视图。此外,Facelets 可以配置为立即检测和呈现对页面的更改,从而加快 JSF 开发周期。

来自 Ian Hlavats 的书“JSF 1.2 组件”,第 49 页

在 JSF 应用程序开发过程中,我们经常对 JSF 页面进行更改,从而导致频繁地重新编译 JSP 页面,并且这种编译时开销可能会增加。

Facelets 页面是简单的 XML 文档(XHTMl 页面),它们从不编译为 servlet,而是使用基于 SAX 的编译过程为我们的视图构建 UI 组件树。因此,与 JSP 相比,Facelets 更快,因为它没有 JSP 转换开销。

于 2014-10-16T07:32:49.520 回答