渲染器是通过组件系列选择的,而不是您期望的那样通过组件类型选择的。
让我们列举一下JSF2.0规范:
3.1.2组件类型
虽然不是UIComponent的属性,但是组件类型是与每个
UIComponent子类相关的重要数据,它允许Application实例创建UIComponent具有该类型的子类的新实例。有关组件类型的更多信息,请参见第7.1.11节“对象工厂”。3.1.3组件族
每个标准用户界面组件类都有一个针对组件系列的标准值,该标准值用于查找与此组件关联的渲染器。泛型
UIComponent类的子类通常会从其超类继承此属性,以便仅期望超类的渲染器仍然能够处理专门的子类。
基本上,组件类型对于JSF是必需的,以便通过
Application#createComponent()方法创建组件。
UIComponent component = context.getApplication().createComponent("study.faces.Div");这样做的好处是该组件
study.faces.Div不是编译时依赖项,因此提供了运行时多态性和可插入性的可能性(如果您熟悉JDBC的
Class#forName()机制及其工厂,那么您会更好地理解该部分)。
每种组件类型都属于一个家族,该家族可以包含一个或多个组件。根据组件系列和渲染器类型选择渲染器,方法是
RenderKit#getRenderer()
Renderer renderer = context.getRenderKit().getRenderer(component.getFamily(), component.getRendererType());
在渲染器 不
基于所述组件类型和渲染器类型选择。这允许渲染器重新用于属于一个组件族的多个组件类型。否则,即使组件可以共享相同的渲染器,也需要为每个组件注册一个渲染器。
以下
faces-config.xml条目
<component> <component-type>study.faces.Div</component-type> <component-class>javax.faces.component.UIPanel</component-class></component>
告诉JSF,
Application每当要创建给定组件类型的组件时,都应创建给定组件类的实例。没有在其中指定组件系列,因为已经隐式知道了
component.getFamily()。
和以下
faces-config.xml条目
<render-kit> <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>
告诉JSF,
RenderKit每当请求给定组件族和渲染器类型的渲染器时,都应返回给定渲染器类的实例。
以下
.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>
告诉JSF(好吧,Facelets),给定的标签应该在视图根中创建给定组件类型的组件(其类在中定义
faces-config.xml),并且其渲染器类型应该设置为给定的渲染器类型。请注意,组件类型 不用于选择渲染器,而是用于在视图根目录中创建组件。另请注意,渲染器类型条目是可选的。否则,将使用组件自己的预定义渲染器类型。这允许使用其他渲染器类型重用现有组件类型。



