これは、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()
戻ります。true
component
javax.faces.component.
behaviors
は、引数renderPassThruAttributesOptimized()
で指定された属性のみをレンダリングします。setAttributes
は、マップ内のすべてのrenderPassThruAttributesUnoptimized()
属性をループしattributes
、関連付けられた値がnull /空でないかどうかをすべての属性をチェックしてから、レンダリングします。
一部の属性がによって設定されない理由についてはhandleAttribute()
、より具体的な前処理/後処理が必要であり、コンポーネントに固有のレンダラーによってすでに明示的にレンダリングされているため、「パススルー」としてレンダリングする必要はありません。 " 属性。
カスタムコンポーネントを作成するときに、これについて心配する必要はありません。これに似た独自の最適化をいつでも導入できますが、たとえばMyFacesを使用している場合はまったく機能しない可能性があるため、Mojarra固有の内部最適化に依存することはお勧めしません。