它与 Mojarra 内部渲染优化有关,其中只有由内部handleAttribute()
方法设置的属性才会被渲染为所谓的“pass-thru”属性,而不是检查组件的每个属性是否已经设置与否,如果属性相对较多,最终可能会更昂贵。“pass-thru”属性是一个组件属性,无需任何特定的预处理/后处理即可直接渲染。
查看 Mojarra 的RenderKitUtils
课程,从renderPassThruAttributes()
方法开始:
316 if (canBeOptimized(component, behaviors)) {
317 //noinspection unchecked
318 List<String> setAttributes = (List<String>)
319 component.getAttributes().get(ATTRIBUTES_THAT_ARE_SET_KEY);
320 if (setAttributes != null) {
321 renderPassThruAttributesOptimized(context,
322 writer,
323 component,
324 attributes,
325 setAttributes,
326 behaviors);
327 }
328 } else {
329
330 // this block should only be hit by custom components leveraging
331 // the RI's rendering code, or in cases where we have behaviors
332 // attached to multiple events. We make no assumptions and loop
333 // through
334 renderPassThruAttributesUnoptimized(context,
335 writer,
336 component,
337 attributes,
338 behaviors);
339 }
如果是标准 JSF 组件之一(实际上,如果组件的包名称以 开头)并且数组中的行为不超过 1 个,则canBeOptimized()
返回。true
component
javax.faces.component.
behaviors
renderPassThruAttributesOptimized()
只会渲染参数中指定的属性setAttributes
。
将renderPassThruAttributesUnoptimized()
循环遍历attributes
地图中的每个属性,并检查关联值是否为空/空的每个属性,然后渲染它。
至于为什么某些属性没有被设置handleAttribute()
,那是因为它们需要一些更具体的预处理/后处理,并且已经由特定于组件的渲染器显式渲染,所以它们不需要渲染为“pass-thru” “ 属性。
编写自定义组件时无需担心这一点。您始终可以引入与此类似的自己的优化,但不建议依赖 Mojarra 特定的内部优化,因为例如,当您使用 MyFaces 时,它们可能根本不起作用。