要在JSF中创建自定义组件,必须使用例如@FacesComponent创建一个扩展UIComponent并在JSF中注册其组件类型的类。要在facelets页面中使用此组件及其属性,必须将组件与facelets标记链接到名为标记描述文件的特殊文件中:
<tag>
<tag-name>test</tag-name>
<component>
<component-type>local.test.component_type</component-type>
</component>
</tag>
好的,但我对使用标记类(和标记处理程序)感到困惑。查看mojarra源代码,使用扩展UIComponentELTag的组件标记类在标记库描述文件中声明所有html基本组件。例如:
<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中使用?
答案 0 :(得分:1)
如果我不使用标记类,那么我的组件不能在JSP页面或以前的JSF版本中使用,只能在JSF facelets中使用?
这是对的。如果您没有为JSF 2.0自定义组件使用标记类,那么您的JSF 2.0自定义组件与JSP不兼容,也不与JSF 1.2或更早版本兼容。自JSF 2.0以来,JSP已被弃用,因此除非您绝对需要支持JSP和/或JSF 1.2,否则根本不需要创建标记类。这可以节省您不必要的样板代码。像PrimeFaces这样的一些JSF 2.0组件库甚至根本不支持JSP。
标签处理程序是另一回事。标记处理程序与UI组件的标记类不同。要了解标记处理程序是什么,请查看JSF核心(<f:xxx>
)标记库。所有标准的JSF标记处理程序都在那里。它们在JSF 2.0中仍然有用。使用标记处理程序,您可以控制JSF视图的构建方式(使用UI组件可以控制JSF视图的呈现方式)。