何时使用<ui:include>,标记文件,复合组件和/或自定义组件?

mre*_*isz 95 facelets tagfile custom-component composite-component jsf-2

我最近开始使用带有Facelets的JSF 2.0,并且对于了解<ui:include>Facelets 1.x提供的现有和其他模板技术的新复合组件感到困惑.

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

Bal*_*usC 168

这些方法有什么区别?

Facelet模板

如果要将主页面布局片段拆分为可重复使用的模板<ui:composition>,请使用Facelet模板(如<ui:include>和中所示<ui:decorate>).例如标题,菜单,内容,页脚等

例子:

Facelet标记文件

如果要使用可重复使用的组件组以防止/最小化代码重复,请使用Facelet标记文件.例如一组标签+输入+消息组件.与复合组件的主要区别在于,Facelet标记文件的输出不代表单个UIComponent,并且在某些情况下可能是复合组件不足时的唯一解决方案.通常,具有<ui:include>一个或多个<ui:param>传递托管bean属性(因此不是硬编码值)的信号是包含文件可以更好地是标记文件的信号.

例子:

复合部件

如果要UIComponent使用纯XML 创建单个且可重复使用的自定义单一职责,请使用复合组件.这样的复合组件通常由一堆现有组件和/或HTML组成,并且物理地呈现为单个组件,并且应该绑定到单个bean属性.例如表示单个的组件java.util.Date由3个依赖性属性<h:selectOneMenu>组件,或者其结合的部件<p:fileUpload><p:imageCropper>成一个单一的<my:uploadAndCropImage>参考单个自定义com.example.Image实体属性.

例子:

定制组件

每当使用Facelet标记文件或复合组件无法实现功能时,请使用自定义组件,因为标准/可用组件集中缺乏支持.可以在开源组件库(如PrimeFacesOmniFaces)的源代码中的所有位置找到示例.

标记处理程序

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

例子:

示例项目

以下是一些利用上述所有技术的示例项目.


性能会有所不同?

从技术上讲,性能问题可以忽略不计.应根据具体功能要求以及实施的最终抽象程度,可重用性和可维护性来做出选择.每种方法都有其明确的目的和限制.

但是,在构建/恢复视图期间,复合组件会产生很大的开销(具体来说:在保存/恢复视图状态期间).而且,在旧版本的Mojarra中,复合组件在分配默认值时存在性能问题,这已经从2.1.13开始修复.此外,当a 用于方法表达式时,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>
Run Code Online (Sandbox Code Playgroud)

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

<context-param>
    <param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name>
    <param-value>true</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

尽管如此,当你拥有相对"很多"的复合组件时,你已经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>
Run Code Online (Sandbox Code Playgroud)

不要使用此设置进行开发,否则您必须重新启动整个服务器才能反映Facelets文件中的更改!钻嘴鱼科2.2.11,更新,和MyFaces的已经默认-1javax.faces.PROJECT_STAGE未设置为Development.

  • 标记文件应该被视为包含类型.应将复合组件视为实际组件.复合组件**需要**来实现`NamingContainer`,否则当多次重用同一组件时,最终会出现重复的ID问题. (2认同)
  • @Tarik:与标签文件相比,复合材料有很多开销.换句话说:表现不佳.仅在需要基于一组密切相关的现有组件创建单个自定义UI组件时才使用它.使用标记文件无法做到这一点.例如,ZEEF.com只有一个复合:上传/下载/裁剪图像一体化的东西,用于ao页面图片,个人资料图片,链接块标题,图像块等.它必然只是一个` bean中的image`属性. (2认同)

归档时间:

查看次数:

50344 次

最近记录:

6 年,8 月 前