jsf-2 - 使用 <ui:include> 标记文件复合组件和/或者自定义组件时的jsf 2?

  显示原文与译文双语对照的内容
138 5

最近使用Facelets开始使用 jsf2,got了解现有的<ui:include> 和由 1. x. 提供的其他模板技术感到困惑的新复合组件

这些方法的区别是什么?在功能上,它们似乎提供了相同的功能:<ui:param> vs <cc:attribute><ui:insert> + <ui:define> vs 标记文件,重用现有模板。除了复合组件之外,还有语法和清晰的接口规范?性能是否不同?

时间:原作者:0个回答

117 1

那么,这些方法的区别是什么?

Facelet模板

如果要将主页面布局 Fragments 拆分为reuseable模板,请使用Facelet模板( 。在 <ui:composition><ui:include><ui:decorate> 中) 。比如 header,菜单,内容,页脚等。

例如:

Facelet标记文件

如果要有一组可以用的组件组,可以以使用标记文件来防止/最小化代码重复。比如 一组label+input+message组件。复合组件的主要区别是does标记文件的输出不代表单个 UIComponent,而且在某些情况下是唯一的解决方案。通常,具有一个或者多个 <ui:param><ui:include> 是包含文件可以更好地作为标记文件的信号。

例如:

复合组件

使用复合组件,如果你想要创建单个和可以用的自定义 UIComponent,只需单独使用纯 XML 。这种组合组件通常由一组现有组件和/或者HTML组成,并且被物理呈现为单个bean属性。组件的名称,该组件表示由 3个依赖的<h:selectOneMenu> 组件或者将 <p:fileUpload><p:imageCropper> 组合到单个自定义 com.example.Image 实体作为属性的单个 <my:uploadAndCropImage>

例如:

自定义组件

每当功能不能通过of标记文件或者复合组件实现时,使用自定义组件,因为缺少标准/可以用组件。可以在开源组件库( 如 PrimeFacesOmniFaces ) 中的所有源代码中找到示例。

标记处理程序

当你想要控制JSF组件树的构建而不是呈现HTML输出时,你应该使用标记处理程序,而不是使用组件。

例如:

示例项目

下面是一些利用所有 above 技术的示例项目。

的性能会有所不同

从技术上讲,性能的。应该根据具体功能需求和实现的final 抽象性。可以重用性和可以维护性来做出选择。每种方法都有自己的definied目的和局限性。

但是,复合组件在生成视图/还原视图时具有很大的开销( 特别是:在保存/还原视图状态时) 。在早期版本的Mojarra中,复合组件在分配默认值时具有性能问题,这是自 2.1.13以来已经修复的。此外,Mojarra还有一个内存泄漏,当<cc:attribute method-signature>用于方法表达式,基本上是在HTTP会话中引用整个组件树,这是从 2.1.29/2.2. 8 开始的。如下所示,可以以在旧 2.1版本中忽略内存泄漏:

<context-param>
 <param-name>com.sun.faces.serializeServerState</param-name>
 <param-value>true</param-value>
</context-param>

或者在较旧的2.2版本中,如下所示:

<context-param>
 <param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name>
 <param-value>true</param-value>
</context-param>

然而,当你有相对的"很多"组合组件,并且 javax.faces.STATE_SAVING_METHOD 设置为 client 时,性能将是一个痛苦。如果只需要简单的包含文件或者标记文件的基本功能,那么不要滥用复合组件。不要使用配置的简易性( 读取:不需要 *.taglib.xml 文件) 作为首选组件在标记文件上的首选。

使用 Mojarra 2.2.10或者更低版本时,请不要忘记禁用生产模式相对较短的Facelets刷新周期:

<context-param>
 <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
 <param-value>-1</param-value>
</context-param>

对于开发,不要使用这里设置,否则必须重新启动整个服务器以在要反映的Facelets文件中进行更改 !Mojarra 2.2.11和更新版本,并且当 javax.faces.PROJECT_STAGE 未设置为 Development 时,MyFaces已经默认为 -1

原作者:
...