Когда я изучаю разработку пользовательских компонентов в JSF, я запутался в связи с отношением между семейством компонентов, типом компонента и типом визуализации. Например, я зарегистрировал средство визуализации и пользовательский компонент, как показано ниже.
faces-config.xml
:
<component>
<component-type>study.faces.Div</component-type>
<component-class>javax.faces.component.UIPanel</component-class>
</component>
<render-kit>
<render-kit-id>HTML_BASIC</render-kit-id>
<renderer>
<component-family>javax.faces.Panel</component-family>
<renderer-type>study.faces.DivRenderer</renderer-type>
<renderer-class>com.study.ui.DivRenderer</renderer-class>
</renderer>
</render-kit>
Я также зарегистрировал новый тег в файле my.taglib.xml
, как показано ниже:
<tag>
<tag-name>div</tag-name>
<component>
<component-type>study.faces.Div</component-type>
<renderer-type>study.faces.DivRenderer</renderer-type>
</component>
</tag>
Эта конфигурация работает очень хорошо. Однако я не понял, почему строка <component-family>javax.faces.Panel</component-family>
требуется при регистрации рендеринга. В my.taglib.xml
компонент и средство визуализации подключены, и, IMHO, должно быть достаточно, чтобы выбрать соответствующий рендерер для компонента. В чем заключается использование дополнительного параметра <component-family>
?
Я проводил исследования Google, и все ответы, которые я получил, говорят: "Один рендер может использоваться для рендеринга нескольких компонентов, которые принадлежат одному семейству". Но эти заявления не очистили мое замешательство. Может ли кто-нибудь объяснить взаимосвязь между типом компонента, семейством компонентов и стратегией выбора рендеринга? (Надеюсь, на хорошем примере.)