我从JSF2.0开始看到,Facelets视图定义语言是首选的视图定义语言,而不是作为遗留回退而被弃用的JSP。我想理解为什么Facelets比JSF2.0以后的视图定义语言更优先于JSP?我知道JSP也有一些模板行为,这是采用Facelets的主要驱动点。
P.S:我在stackoverflow上经历了this post,但我不认为它回答了我的问题。因此将此作为一个单独的问题发布。
答案 0 :(得分:41)
确实,JSP具有一些 templating功能,但在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年龄headache期间。开发人员需要在上面的示例中将second
和fourth
等模板文本打包在<f:verbatim>
标记的所有位置。 JSF 1.2已经用一个改进的视图处理程序来解决它,它解析JSP而不是执行它,但由于JSP语法不是很好的形式,因此它仍然非常笨拙。像XML一样。强烈需要基于XML的视图技术,以便可以使用基于SAX的高效解析器。 Facelets诞生了(Ken Paulsen&#34; JSFTemplating&#34;)。
此外,统一的EL #{}
无法在JSP模板文本中使用,导致丑陋 - 对于初学者unintuitive - 混合了${}
和#{}
。此外,JSTL可以在JSP上的JSF 1.x中不能用作view build time tags。此外,带有<% %>
事物的JSP语法是老派,在JSP中嵌入原始Java代码的可能性被认为是very poor practice,它会中断MVC ideology。
总而言之,在JSF / MVC的角度来看,JSP简直是丑陋可怕而且Facelets简直干净且棒极了。
答案 1 :(得分:11)
我在互联网上找到了以下答案。
JSFToolbox documentation chapter 3:
JSP编译 - 时间开销
每次编辑,保存和重新加载JSP页面时,服务器的JSP编译器都会生成Java servlet代码并将其编译为servlet。这称为JSP转换过程,通常需要1-2秒,具体取决于服务器性能。
Facelets XML编译
与JavaServer Pages不同,Facelets页面不会编译为servlet。由于Facelets页面符合XML,因此Facelets框架使用基于SAX的快速编译器来构建视图。此外,Facelets可以配置为立即检测和呈现页面的更改,从而加快您的JSF开发周期。
Book "JSF 1.2 components" from Ian Hlavats, page 49:
在JSF应用程序开发期间,我们经常对JSF页面进行更改, 导致频繁重新编译我们的JSP页面,以及这个编译时 开销可以加起来。
Facelets页面是从未编译过的简单XML文档(XHTMl页面) 对servlet而言,它使用构建UI的基于SAX的编译过程 我们的观点的组件树。因此,与JSP相比,Facelets的速度更快 免于JSP翻译开销。