JSF/Facelets:为啥将 JSF/Facelets 与 HTML 标签混合不是一个好主意?

Posted

技术标签:

【中文标题】JSF/Facelets:为啥将 JSF/Facelets 与 HTML 标签混合不是一个好主意?【英文标题】:JSF/Facelets: why is it not a good idea to mix JSF/Facelets with HTML tags?JSF/Facelets:为什么将 JSF/Facelets 与 HTML 标签混合不是一个好主意? 【发布时间】:2011-07-25 08:31:56 【问题描述】:

我已经读了好几遍了:一些开发人员不提倡在他们的 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 数据表没有给我足够的灵活性来显示我需要的内容,因此不可能纯粹地这样做。

此外,我想知道为什么上面的示例都没有使用 f:view 等,而不是硬编码的 html、head、body 等标签。

谁能帮我解决这个问题?

【问题讨论】:

查看this question关于JSF/HTML标签 好的,这有帮助。至少关于 div 和 span,但我如何管理 p、br,尤其是标题? 来自我在引用问题中的回答:“在实践中,我发现很难遵循这个建议,最终混合使用了 html 和 jsf,例如对于标题或换行符,我使用 html。” 嗯,令人失望。不应该有JSF方式吗? 我不明白为什么这不是一个好主意,而且这令人失望。也许您是 JSF 1.0/1.1 时代造成的混合 JSF+HTML=bad 神话的受害者?有关更多历史记录,请参阅***.com/questions/3273595/… 【参考方案1】:

在 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" />

要解决此问题,您需要将&lt;f:verbatim&gt; 带入。

<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 开始,有了新的视图处理程序,&lt;f:verbatim&gt; 就不再需要了。开发人员现在可以松一口气了。此外,新的视图处理程序允许 JSF 使用与 JSP 不同的视图技术,Facelets 就是这样诞生的。

另见:

What are the main disadvantages of Java Server Faces 2.0? Why Facelets is preferred over JSP as the view definition language from JSF2.0 onwards? Is it possible to use JSF+Facelets with HTML 4/5? JavaServer Faces 2.2 and HTML5 support, why is XHTML still being used

【讨论】:

+1 简洁的解释和完美的例子。我事先就知道这一点,但说得很好。 请注意,使用纯 html 而不是给出相同结果的组件 (div vs t:div) 可能会有较小的性能优势,因为这会减少解析时间。但是要知道 html 标记不作为组件包含在视图根 (afaik) 中 @Steven:它对视图构建时间没有影响。无论如何都会对其进行解析和检查(并转换为专用的UIInstructions 组件)。如果您的视图渲染时间相对较多,则视图渲染时间可能会显着加快,因为它们被渲染为没有任何状态和属性的“模板文本”(但仍具有 EL 评估支持)。【参考方案2】:

作为一般规则,我在布局/模板页面中混合使用 betweek HTML 和 Facelets 标签。但是对于实际的内容页面,我尝试只使用我选择的 JSF 库(JSF + RichFaces)中可用的 JSF 标签。

这样我可以更好地控制要显示和隐藏的元素,以及每个元素中的内容,但我仍然可以在 facelets 模板文件中硬编码我的主页布局。

【讨论】:

以上是关于JSF/Facelets:为啥将 JSF/Facelets 与 HTML 标签混合不是一个好主意?的主要内容,如果未能解决你的问题,请参考以下文章

JSF,facelets 上的 actionlistener

JSF/Facelets/JSTL 条件显示最佳实践

找不到 http://java.sun.com/jsf/facelets 的标记库描述符

JSF/Facelets:使用 <h:outputStylesheet> 标记无法识别 CSS 文件

java中的Web开发存在哪些Spring+JSF/Facelets的替代品?

如何在 Eclipse 中查看 jsf/facelets 元素的文档