jsf 自定义组件 插入 html 元素,jsf 2 - 何时使用<ui:include>,标记文件,复合组件和/或自定义组件?...

这些方法有什么区别?

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组件

如何访问使用&lt; ui:define&gt;创建的内容?编程?

根据是否指定了属性,在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

不过,当你有相对&#34;很多&#34; 复合组件,你有-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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值