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

したがって、セッターの中にはメソッドを呼び出すものと呼び出さ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);
}

そして、何が行われているのかは私には非常にわかりません。JSFhandleAttributeの第一人者は、このメソッドが何を達成しようとしているのか、なぜ一部の属性がこのメソッドを呼び出し、他の属性は呼び出さないのかを説明できますか?どうもありがとう

4

1 に答える 1

5

これは、Mojarra-内部レンダリングの最適化に関連しています。内部メソッドによって設定された属性のみhandleAttribute()が、コンポーネントのすべての属性がチェックされるのではなく、いわゆる「パススルー」属性としてレンダリングされます。設定するかどうか。属性が比較的多い場合は、コストが高くなる可能性があります。「パススルー」属性は、特定の前処理/後処理なしで完全にレンダリングできるコンポーネント属性です。

次のメソッドRenderKitUtilsから始めて、Mojarraのクラスをのぞいてみましょう。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つである場合(実際には、コンポーネントのパッケージ名がで始まる場合)、および配列に1つ以下の動作がある場合にcanBeOptimized()戻ります。truecomponentjavax.faces.component.behaviors

は、引数renderPassThruAttributesOptimized()で指定された属性のみをレンダリングします。setAttributes

は、マップ内のすべてのrenderPassThruAttributesUnoptimized()属性をループしattributes、関連付けられた値がnull /空でないかどうかをすべての属性をチェックしてから、レンダリングします。


一部の属性がによって設定されない理由についてはhandleAttribute()、より具体的な前処理/後処理が必要であり、コンポーネントに固有のレンダラーによってすでに明示的にレンダリングされているため、「パススルー」としてレンダリングする必要はありません。 " 属性。


カスタムコンポーネントを作成するときに、これについて心配する必要はありません。これに似た独自の最適化をいつでも導入できますが、たとえばMyFacesを使用している場合はまったく機能しない可能性があるため、Mojarra固有の内部最適化に依存することはお勧めしません。

于 2012-08-07T23:55:31.340 に答える