要在 JSF 中创建自定义组件,需要创建一个扩展 UIComponent 的类并在 JSF 中注册其组件类型,例如使用 @FacesComponent。要在 facelets 页面中使用该组件及其属性,必须将组件与 facelets 标记链接到一个称为标记描述文件的特殊文件中:
<tag>
<tag-name>test</tag-name>
<component>
<component-type>local.test.component_type</component-type>
</component>
</tag>
好的,但我对标签类(和标签处理程序)的使用感到困惑。查看 mojarra 源代码,所有 html 基本组件都在标签库描述文件中使用扩展 UIComponentELTag 的组件标签类声明。例如:
<tag>
<name>commandButton</name>
<tag-class>
com.sun.faces.taglib.html_basic.CommandButtonTag
</tag-class>
</tag>
查看 UIComponentELTag 的 JSF api:
UIComponentELTag 将其超类专门用于允许从 EL API 表达式中获取其值的属性。
此标记设计用于 Faces 1.2 版和 JSP 2.1 版容器。
那么问题是,什么时候我应该使用扩展 UIComponentELTag 的类来链接标签属性和自定义组件,而不是通过链接组件?如果我不使用标记类,那么我的组件不能在 JSP 页面或以前的 JSF 版本中使用,并且只能在 JSF facelets 中使用?