3

我试图根据BalusC 的优秀文章创建一个复合组件。我无法从支持组件中获取属性或任何值。代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:composite="http://java.sun.com/jsf/composite">

<composite:interface componentType="test">
    <composite:attribute name="something" />
</composite:interface>

<composite:implementation>
    <h:outputText value="#{composite.attrs.something}" />
    <h:outputText value="#{composite.hello}" />
</composite:implementation>
</html>

我发现相同的代码可以工作,然后我使用“cc”命名空间而不是“composite”。代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:cc="http://java.sun.com/jsf/composite">

<cc:interface componentType="test">
    <cc:attribute name="something" />
</cc:interface>

<cc:implementation>
    <h:outputText value="#{cc.attrs.something}" />
    <h:outputText value="#{cc.hello}" />
</cc:implementation>
</html>

问题是,为什么它不能与“复合”命名空间一起使用?我找不到任何“复合”是 JSF 保留字之类的信息。

谢谢。

4

1 回答 1

5

您将 XML 命名空间与隐式 EL object混淆了。ccin#{cc}不引用当前正在使用的复合组件 XML 名称空间。它只是引用 EL 范围内的复合组件实例,并且是一个固定名称。这个构造与compositeXML 命名空间一样好。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:composite="http://java.sun.com/jsf/composite">

<composite:interface componentType="test">
    <composite:attribute name="something" />
</composite:interface>

<composite:implementation>
    <h:outputText value="#{cc.attrs.something}" />
    <h:outputText value="#{cc.hello}" />
</composite:implementation>
</html>

(注意:我宁愿使用<ui:component>而不是<?xml?><!DOCTYPE><html>,就像您在此处链接的博客文章中一样)

至于 XML 命名空间,composite它不必要地长,并且不能很好地适应所有其他缩写的 XML 命名空间,如hfc等。这就是为什么许多开发人员选择使用cc而不是JSF 本身composite记录的。请注意,复合标记文档本身也在#{cc}整个示例中使用compositeXML 命名空间。

于 2013-06-04T13:08:05.947 回答