这些方法有什么区别?
Facelet模板
如果要将主页面布局片段拆分为可重复使用的模板,请使用Facelet模板(如-1,javax.faces.PROJECT_STAGE和Development)。 例如。 标题,菜单,内容,页脚等
例子:
如何使用JSF 2.0 Facelets在XHTML中包含另一个XHTML?
ui:decorate和ui:include之间真正的概念差异是什么?
如何使用ui:组合模板自定义h:head?
如何在使用ui:composition时更改页面的头元素
如何通过导航菜单ajax-refresh动态包含内容? (JSF SPA)
Facelet标记文件
如果要使用可重复使用的组件组以防止/最小化代码重复,请使用Facelet标记文件。 例如。 一组标签+输入+消息组件。 与复合组件的主要区别在于Facelet标记文件的输出不代表单个-1,并且在某些情况下可能是复合组件不够的唯一解决方案。 通常,具有一个或多个Development的javax.faces.PROJECT_STAGE传递托管bean属性(因此不是硬编码值)是包含文件最好是标记文件的信号。
例子:
如何创建自定义Facelets标记?
如何制作JSF复合组件的网格?
如何为数据表列创建复合组件?
Primefaces outputLabel用于复合组件
复合部件
如果要使用纯XML创建单个且可重复使用的自定义-1,则使用复合组件。 这样的复合组件通常由一堆现有组件和/或HTML组成,并且物理地呈现为单个组件,并且应该绑定到单个bean属性。 例如。 由3个依赖的Development组件表示单个属性的组件,或将和组合成单个自定义com.example.Image实体作为属性的组件。
例子:
我们的复合组件维基页面
BalusC代码:具有多个输入字段的复合组件
将java.util.Date拆分为两个h:表示小时和分钟的inputText字段,使用f:convertDateTime
使用动态ID选择Multiple SelectManyCheckBox中的所有项目
扩展JSF commandLink组件
在同一命名容器中重用facelets组合时避免重复的id
定制组件
每当使用Facelet标记文件或复合组件无法实现功能时,请使用自定义组件,因为标准/可用组件集中缺乏支持。 可以在开源组件库(如PrimeFaces和OmniFaces)的源代码中的所有位置找到示例。
标记处理程序
当您想要控制JSF组件树的构建而不是呈现HTML输出时,您应该使用标记处理程序而不是组件。
例子:
JSF中的自定义Facelet组件
如何访问使用< ui:define>创建的内容?编程?
根据是否指定了属性,在tagfile中进行条件渲染
与查询参数关联的转换/验证失败时执行重定向
示例项目
以下是一些利用上述所有技术的示例项目。
Java EE Kickoff应用程序(模板 - 包括 - 标签文件 - 复合)
OmniFaces Showcase(模板 - 包括 - 标签文件 - 复合)
性能可能不同吗?
从技术上讲,性能问题可以忽略不计。 应根据具体功能要求以及实施的最终抽象程度,可重用性和可维护性来做出选择。 每种方法都有其明确的目的和限制。
但是,在构建/恢复视图期间,复合组件会产生很大的开销(具体来说:在保存/恢复视图状态期间)。 而且,在旧版本的Mojarra中,复合组件在分配默认值时存在性能问题,这已经从2.1.13开始修复。 此外,当-1用于方法表达式时,Mojarra有内存泄漏,基本上整个组件树在HTTP会话中被重新引用,这是自2.1.29 / 2.2.8以来修复的。 旧版2.1版本可以绕过内存泄漏,如下所示:
com.sun.faces.serializeServerState
true
或者在旧的2.2版本中,如下所示:
javax.faces.SERIALIZE_SERVER_STATE
true
不过,当你有相对"很多" 复合组件,你有-1设置为javax.faces.PROJECT_STAGE,那么性能会很痛苦。 如果您只想要使用简单的包含文件或标记文件已经可以实现的基本功能,请不要滥用复合组件。 不要使用易于配置(阅读:无需Development文件)作为优先考虑复合组件而不是标签文件的借口。
使用Mojarra 2.2.10或更早版本时,不要忘记禁用生产模式的相对较短的Facelets刷新周期:
javax.faces.FACELETS_REFRESH_PERIOD
-1
不要使用此设置进行开发,否则您必须重新启动整个服务器才能反映Facelets文件中的更改! 当javax.faces.PROJECT_STAGE未设置为Development时,Mojarra 2.2.11和更新版本以及MyFaces默认为-1。