3

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

4

1 回答 1

2

如果我不使用标记类,那么我的组件不能在 JSP 页面或以前的 JSF 版本中使用,并且只能在 JSF facelets 中使用?

这是正确的。如果您不为 JSF 2.0 定制组件使用标记类,那么您的 JSF 2.0 定制组件与 JSP 不兼容,也不与 JSF 1.2 或更早版本兼容。JSP 自 JSF 2.0 以来已被弃用,因此除非您绝对需要支持 JSP 和/或 JSF 1.2,否则您根本不需要创建标记类。这使您免于不必要的样板代码。一些 JSF 2.0 组件库(如 PrimeFaces)甚至根本不支持 JSP。

标签处理程序是另一回事。标记处理程序与 UI 组件的标记类不同。要了解什么是标记处理程序,请查看 JSF 核心 ( <f:xxx>) 标记库。所有标准的 JSF 标记处理程序都在其中。它们在 JSF 2.0 中仍然有用。使用标记处理程序,您可以控制 JSF 视图的构建方式(使用 UI 组件,您可以控制 JSF 视图的呈现方式)。

于 2012-06-25T12:57:18.560 回答