2

所以让我们选择一个 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 会调用 method 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 大师可以向我解释这个方法尝试完成什么以及为什么某些属性调用此方法而其他属性没有?太感谢了

4

1 回答 1

5

它与 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()返回。truecomponentjavax.faces.component.behaviors

renderPassThruAttributesOptimized()只会渲染参数中指定的属性setAttributes

renderPassThruAttributesUnoptimized()循环遍历attributes地图中的每个属性,并检查关联值是否为空/空的每个属性,然后渲染它。


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


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

于 2012-08-07T23:55:31.340 回答