JSF2复合和cc的区别

标签 jsf jsf-2 composite-component

我试图创建一个基于 BalusC's excellent article 的复合组件. 我无法从支持组件中获取属性或任何值。代码:

<?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”命名空间而不是“复合”。代码:

<?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 保留字或其他内容。

谢谢。

最佳答案

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

<?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 namespace ,如 h , f , c等。这就是为什么许多开发人员选择使用 cc 的原因而不是 composite作为documented由 JSF 本身。请注意复合标签文档本身也使用 #{cc}在整个示例中使用 composite XML 命名空间。

关于JSF2复合和cc的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16918552/

相关文章:

java - JSF 2 复合组件 insertChildren 标记使 @ViewScoped 变为 @RequestScoped :(

java - 使用 SortedSetDocValuesField 对多个字段进行排序 - 错误 : unexpected docvalues type SORTED_SET for field

jsf - 如何使JSF inputText字段在模糊时变为大写

jsf-2 - 如何在 PrimeFaces 中使用共享错误消息对话框

jsf - 将托管 Bean 设置为复合组件中的参数

jsp - 如何将旧 JSP 的片段重构为某些 JSF 等价物?

jsf - JSF 中是否有 do-while-loop 构造,或者即使绑定(bind)列表为空也可以运行 <ui :repeat> at least once, 吗?

jsp - javax.faces.webapp.UIComponentClassicTagBase.setJspId 处的 java.lang.NullPointerException

java - Primefaces 响应 <p :panelGrid> not working with 5 columns

java - JSF 2.0 自定义异常处理程序 - ViewHandler 未在 Weld 应用程序中重定向