自定义JSF组件。使用UIComponentELTag时

时间:2012-06-25 11:46:55

标签: java jsf jsf-2 custom-component

要在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中使用?

1 个答案:

答案 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视图的呈现方式)。