gpt4 book ai didi

jsf - UIComponent Mojarra 中的方法 handleAttribute(String name, Object value) 在做什么?

转载 作者:行者123 更新时间:2023-12-02 22:33:18 26 4
gpt4 key购买 nike

所以让我们选择一个 UIComponent,例如 HtmlSelectOneRadio(请在此处查看源代码:http://grepcode.com/file/repo1.maven.org/maven2/com.sun.faces/jsf-api/2.1.7/javax/faces/component/html/HtmlSelectOneRadio.java#HtmlSelectOneRadio)

所以有些 setter 会调用方法 handleAttribute(...),而有些则不会,例如

public void setDir(java.lang.String dir) {
getStateHelper().put(PropertyKeys.dir, dir);
handleAttribute("dir", dir);
}

public void setDisabled(boolean disabled) {
getStateHelper().put(PropertyKeys.disabled, disabled);
}

我非常不清楚 handleAttribute 正在做什么,请 JSF 大师向我解释一下这个方法试图完成什么以及为什么一些属性调用这个方法而其他属性不调用这个方法?非常感谢

最佳答案

它与 Mojarra 内部渲染优化有关,其中由内部handleAttribute() 方法设置的属性被渲染为所谓的“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 }

如果 component 是标准的 JSF 组件之一(实际上,如果组件的包名称以javax.faces.component.),如果 behaviors 数组中的行为不超过 1 个。

renderPassThruAttributesOptimized() 将仅呈现在 setAttributes 参数中指定的属性。

renderPassThruAttributesUnoptimized() 将遍历 attributes 映射中的每个属性,如果关联值不为 null/empty,则检查每个属性,然后呈现它.


至于为什么有些属性没有被handleAttribute()设置,那是因为它们需要一些更具体的前/后处理,并且已经被组件特定的渲染器显式渲染了,所以它们不需要呈现为“直通”属性。


编写自定义组件时无需担心这一点。您始终可以引入与此类似的您自己的优化,但不建议依赖特定于 Mojarra 的内部优化,因为例如,当您使用 MyFaces 时它们可能根本不起作用。

关于jsf - UIComponent Mojarra 中的方法 handleAttribute(String name, Object value) 在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11854925/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com