Omnifaces TagAttribute Id 不能用作 id

Omnifaces TagAttribute Id cannot be used as id

我有以下 Facelet 标签库:

<ui:composition
        xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
        xmlns:o="http://omnifaces.org/ui"
        xmlns:h="http://java.sun.com/jsf/html">

    <o:tagAttribute name="id"/>

    <h:panelGroup id="#{id}" layout="block" styleClass="idTest">
        #{id}
    </h:panelGroup>
</ui:composition>

taglib.xml 看起来像这样:

<tag>
    <tag-name>idTest</tag-name>
    <source>resources/myProject/tags/idTest.xhtml</source>
</tag>

而使用它的代码很简单:

<myProject:idTest/>

怎么会呈现以下HTML:

<div class="idTest">
    j_ido489794984_4bf870cd
</div>

为什么我的PanelGroup没有idid 是根据 o:tagAttribute 的文档生成的,因为 div 的内容已呈现。但是作为 id 它不起作用。为什么?

这确实令人困惑。

documentation字面意思是:

... it will autogenerate an unique ID in the form of j_ido[tagId] where [tagId] is the <o:tagAttribute> tag's own unique ID.

但实际行为更像是这样:

... it will override any autogenerated ID into the form of j_ido[tagId] where [tagId] is the <o:tagAttribute> tag's own unique ID.

换句话说,当 JSF 本身 需要 呈现 HTML 元素的 id 属性时,通常是因为某些内部逻辑进一步需要它在链的下方,例如 <f:ajax> 和 friends,并且没有像 <x:someTag id="fixedId" /> 这样在标签上指定明确的 ID,那么 JSF 将默认以 j_id[autoIncrementInteger] 的形式自动生成一个。但这在标记文件上会出错,因为 autoIncrementInteger 可能会在每次回发时进一步增加一个,具体取决于所使用的 JSF impl 和视图状态配置。 <o:tagAttribute> 只是尝试以这种方式确保自动生成的 ID 在每次回发时保持相同。

当您编辑测试标记文件以添加 <f:ajax>

<h:panelGroup id="#{id}" layout="block" styleClass="idTest">
    <f:ajax event="click" />
</h:panelGroup>

然后你会看到生成的 <div> 有一个 id,因为这是 <f:ajax> 的技术要求。

<div id="j_ido-1512689859_13a7e7e3" class="idTest"
    onclick="mojarra.ab(this,event,'click',0,0)">
</div>

或者当您将 <h:panelGroup> 换成例如<h:form> 或任何在客户端始终需要 ID 的组件,

<h:form id="#{id}" styleClass="idTest">
    <ui:insert />
</h:form>

然后你也会看到它已经生成了。

<form id="j_ido-1512689859_13a7e7e3" name="j_ido-1512689859_13a7e7e3" method="post" action="/test.xhtml" class="idTest" enctype="application/x-www-form-urlencoded">
    <input type="hidden" name="j_ido-1512689859_13a7e7e3" value="j_ido-1512689859_13a7e7e3" />
    ...
</form>

换句话说,该功能运行良好,但在您的特定情况下根本没有使用它,因为 JSF 认为没有必要生成它。

我同时 updated 文档。