我有以下Facelet Taglib:
<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
没有id
?id
是根据o:tagAttribute
的文档生成的,因为div
的内容是呈现的。但作为id
,它不起作用。为什么?
这确实令人困惑。
文档的字面意思是:
…它将自动生成一个
j_ido[tagId]
形式的唯一ID,其中[tagId]
是<o:tagAttribute>
标签自己的唯一ID。
但实际的行为更像这样:
换句话说,当JSF本身需要时要呈现HTML元素的…它将覆盖任何自动生成的ID为
j_ido[tagId]
的形式,其中[tagId]
是<o:tagAttribute>
标签自己的唯一ID。
id
属性,通常是因为链中的一些内部逻辑需要它,例如<f:ajax>
和friends,并且没有像<x:someTag id="fixedId" />
那样在标记上指定显式ID,那么JSF将默认自动生成j_id[autoIncrementInteger]
形式的ID。但是这将在标记文件上出错,因为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认为没有必要生成它。
与此同时,我已经更新了文档。