JSF/Facelets:为什么不建议将JSF/Facelets与HTML标记混合使用?

13

我已经多次阅读了这篇文章:一些开发人员不赞成在XHTML文件中将JSF / Facelets标记与HTML标记交错使用。显然,HTML标记不会成为UI组件树的一部分,但这样做有什么缺点呢?

我经常发现代码示例中作者会这样混合使用:

http://www.ibm.com/developerworks/java/library/j-facelets/

http://www.packtpub.com/article/facelets-components-in-jsf-1.2

http://oreilly.com/catalog/9780596529246

"Seam in Action"还将JSF/Facelets和HTML标记交错使用。
我对该如何实际使用感到困惑。我最初混合使用标记,但现在开始相信这可能不是正确的选择。然而,我无法理解为什么纯粹主义的方法更可取。
我确定我有一个表格,JSF datatable不能给我足够的灵活性来显示我需要的内容,所以不能用纯粹的方式完成。
此外,我想知道为什么上面的例子都没有使用f:view等而是使用硬编码的html、head、body等标记。
请问有人能帮我澄清这个问题吗?

1
请参考关于JSF/HTML标签的这个问题 - Matt Handy
好的,这很有帮助。至少对于div和span来说,但是我该如何处理p、br,尤其是标题? - Kawu
从我在参考问题中的回答中可以看出:“实际上,我发现很难遵循这个建议,最终混合使用了html和jsf,例如对于标题或换行符,我使用html。” - Matt Handy
哦,有点失望。难道没有 JSF 的方法吗? - Kawu
3
我不明白为什么这不是一个好主意,也不理解为什么会令人失望。也许你被JSF 1.0/1.1时代的“JSF+HTML=bad”的神话所迷惑了?如果想了解更多历史,请参考https://dev59.com/8HA75IYBdhLWcg3weY_u#3274299。 - BalusC
2个回答

20

在 JSF 1.0/1.1 时代,这确实是“不好的想法”,因为当使用 JSP 作为视图技术时,所有 HTML 不会自动添加到 JSF 组件树中。所有纯 HTML 都会被 JSP 急切地渲染JSF组件树之前。例如:

<p>Lorem ipsum <h:outputText value="#{bean.value1}"> dolor sit amet<p>
<p>Consectetur adipiscing <h:inputText value="#{bean.value2}" /> elit</p>

得到渲染为

<p>Lorem ipsum dolor sit amet<p>
<p>Consectetur adipiscing elit</p>

value1
<input type="text" value="value2" />
为了解决这个问题,您需要引入<f:verbatim>
<f:verbatim><p>Lorem ipsum </f:verbatim><h:outputText value="#{bean.value1}"><f:verbatim> dolor sit amet<p></f:verbatim>
<f:verbatim><p>Consectetur adipiscing </f:verbatim><h:inputText value="#{bean.value2}" /><f:verbatim> elit</p></f:verbatim>

这是一个真正的维护痛点。这也是JSF 1.0/1.1如此不受欢迎的主要原因之一。

自从JSF 1.2以来,使用新的视图处理程序后,<f:verbatim>就不再必要了。开发人员现在可以松口气了。此外,新的视图处理程序允许JSF使用不同于JSP的视图技术,因此Facelets应运而生。

另请参阅:


我之前就知道这个,但你讲得真的很好。 - Andrew Wynham
请注意,使用普通的HTML而不是产生相同结果的组件(div vs t:div)可能会带来轻微的性能优势,因为这样可以减少解析时间。但需要知道的是,HTML标签在视图根中不作为组件包含(据我所知)。 - Steven De Groote
1
@Steven:这不会影响视图构建时间。无论如何,它都会被解析和检查(并转换为专门的“UIInstructions”组件)。只有当您拥有相对较多的组件时,视图渲染时间可能会显着加快,因为它们被呈现为“模板文本”,没有任何状态和属性(但仍具有EL评估支持)。 - BalusC

4
作为一般规则,我在布局/模板页面中使用HTML和Facelets标记的混合。但是对于实际的内容页面,我尝试仅使用我选择的JSF库(JSF + RichFaces)提供的JSF标记。
这样,我可以更好地控制要显示和隐藏的元素,以及每个元素内的内容,但我仍然可以在facelets模板文件中硬编码我的主页布局。

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