java - 动态生成 View 时忽略 JSF 组件 ID

标签 java jsf primefaces

我遇到了一点问题。

我通过 c:forEach 标记迭代字符串列表来动态生成 View 然后通过facelets include 标签包含它们。

这对于构建布局效果很好,但显示出一些奇怪的行为。

我有一个包含 2 个选项卡的 primefaces 选项卡 View 。 对于第一个选项卡(最初显示的选项卡),设置了组件 ID(例如 tabview:categoryTab),但情况并非如此,例如第二个选项卡,这里我只获取 tabview: 作为组件 id(但实际上应该是 tabview:usrTab)

为什么 JSF 会覆盖我为第二个选项卡设置的 id?我是否遗漏了规范中的一些重要信息?

我使用 JSF 2 和 Primefaces 3.6(快照构建) (是的,我故意使用快照构建,并使用稳定的 PF 版本对此进行了测试,但出现了相同的行为)

<小时/>

编辑

代码: 管理.xhtml

<ui:composition template="/templates/commonLayout.xhtml">
    <ui:define name="content">
        <p:panel id="parentPanel">
            <h:outputText value="Verwaltung" />
            <br />
            <p:tabView id="tabview">
                <!-- insert marker -->
                <c:forEach items="#{adminTabs}" var="tab">
                    <ui:include src="#{tab}" />
                </c:forEach>
            </p:tabView>
        </p:panel>
    </ui:define>
</ui:composition>

catTab.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <p:tab title="Categories Tab" id="catTab">
            ....
    </p:tab>
</ui:composition>

usrTab.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <p:tab title="Users Tab" id="usrTab">
            ....
    </p:tab>
</ui:composition>

testTab.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <p:tab title="TestTab" id="testTab">
            ....
    </p:tab>
</ui:composition>

ContentProvider.java

 public class ContentProvider {
    ....

    @Produces
    @Named("adminTabs")
    public List<String> getTabs(){
        List<String> components = new ArrayList<String>();
        components.add("/templates/tabs/catTab.xhtml");
        components.add("/templates/tabs/usrTab.xhtml");
        components.add("/templates/tabs/testTab.xhtml");
        return components;   
    }

    ....

}

生成:

<ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" role="tablist">
<li class="ui-state-default ui-tabs-selected ui-state-active ui-corner-top" aria-expanded="true" role="tab">
<a href="#tabview:catTab">Categories</a>
</li>
<li class="ui-state-default ui-corner-top" aria-expanded="false" role="tab">
<a href="#tabview:j_idt31">TestTab</a>
</li>
<li class="ui-state-default ui-corner-top" aria-expanded="false" role="tab">
<a href="#tabview:j_idt32">Benutzer und Rollen</a>
</li>
</ul>

因此,重申一下:仅保留第一个选项卡的 id,尽管在 xhtml 代码中设置了其他选项卡的 id,但仍会生成...

最佳答案

我在 Richfaces 4 和 JSF 2 中遇到了非常相似的情况。我通过在 id 属性中包含 EL 表达式来设法绕过它。对我来说

<h:form id="staticName"> 

被渲染成

<form id="j_idblah>

但是一旦我这样做了

<h:form id="#{_objectInContext}">

它开始正确渲染。相当老套,但现在它可以工作了。祝你好运!!

关于java - 动态生成 View 时忽略 JSF 组件 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15467658/

相关文章:

java - 在 java 中创建一个稀疏的 BufferedImage

java - Bit.ShiftRight - 在 Java 中等效

java - 正则表达式用一个替换多个字符

jsf-2 - 添加在带有对话的 PrimeFaces ver 3.4.2 dataTable 中无法正常工作

java - 无法在命令提示符下将Spring Boot应用程序作为可运行的jar运行

mysql - 将图像保存到数据库是个好主意吗?

jsf - 我的组件在对话框中的值未更新为支持 bean

jsf - 文件上传不适用于 PrimeFaces 4.0/JSF 2.2.x 中的 AJAX - javax.servlet.ServletException : The request content-type is not a multipart/form-data

java - 具有多个 p 的行选择 :dataTable

jsf primefaces 数据表 p :columns