JavaServer Faces(JSF) - ui:重复不显示新元素

时间:2011-04-10 12:39:49

标签: jsf

我正在开发一个简单的JSF应用程序,但我再次陷入困境......

基本上,我有一个人已登录并希望发布新消息:

<h:form id="messageform">
    <div style="width:900px; margin-top:-20px;">
        <div id="count">250</div>
        <div id="barbox"><div id="bar"></div></div>
        <h:inputTextarea id="textarea_message" cols="8" rows="5" value="#{messageBean.message}" />
    </div>
    <h:commandButton id="message_submit" value="" action="#{messageBean.postMessage(login.username)}" styleClass="input-submitbericht" />
</h:form>

以及messageBean中的postMessage方法。

public void postMessage(String username) {
    Message.clearMessage();
    System.out.println(db.getAlleBerichten().size());
    if (Message.checkValidMessage(message) && Message.checkValidUsername(username)) {
        Gebruiker g = db.readGebruiker(username);
        db.addBerichtBijGebruiker(g, message);
        Message.setMessage("Uw bericht is succesvol gepost!");
        Message.setMessageType("info");
        Message.setRenderMessage(true);
        System.out.println(db.getAlleBerichten().size());
    }
}

此代码完美无缺。我在messageBean中使用了一个简单的System.out.println(),并且元素得到了完美的添加。

现在,当我尝试在屏幕上显示新消息时,它根本无法被检测到。这就像元素从未添加到ArrayList ...

我使用此代码显示消息:

<ui:repeat value="#{database.alleBerichten}" var="berichten">
    <div class="record">
        <div class="#{(rowCount % 2) != 0 ? 'posteven' : 'postodd'}">
            <div class="text_wrapper text_wrapperm#{berichten.id}">
                #{berichten.bericht}
            </div>
            <div class="edit editm#{berichten.id}" style="display:none; width:890px;">
                <textarea class="editbox editboxm#{berichten.id}" cols="23" rows="3" id="m#{berichten.id}" method="message"></textarea>
            </div>
            <div class="postinfo"> door #{berichten.gebruiker.gebruikersnaam}
                <c:if test="#{berichten.gebruiker.gebruikersnaam == login.username}">
                    <h:form>
                        <a style="cursor: pointer;" class="edit_link" title="Edit" id="m#{berichten.id}">Wijzigen</a> -
                        <h:commandLink value="Verwijderen" action="#{database.deleteBericht(berichten.id)}" styleClass="delbutton"/>
                    </h:form>
                </c:if>
            </div>
        </div>
    </div>
    <c:set var="rowCount" value="#{rowCount + 1}"/>
</ui:repeat>

所以我认为问题出在ui:repeat部分,但我不知道如何解决这个问题......

1 个答案:

答案 0 :(得分:1)

您在JSF <c:if>标记内有一个JSTL <ui:repeat>标记。重要的是要理解JSTL和JSF并不像编码所期望的那样同步运行。它是JSTL,它在视图构建期间首先运行,并仅生成带有JSF标记的视图。然后JSF在视图渲染时运行并生成HTML输出。

当JSTL var标记运行时,JSF <ui:repeat>的{​​{1}}属性后面的对象因此永远不会。您想要使用JSF标记/属性。在这种特殊情况下,<c:if>属性是合适的。

所以,替换

rendered

通过

<c:if test="#{berichten.gebruiker.gebruikersnaam == login.username}">
    <h:form>
        <a style="cursor: pointer;" class="edit_link" title="Edit" id="m#{berichten.id}">Wijzigen</a> -
        <h:commandLink value="Verwijderen" action="#{database.deleteBericht(berichten.id)}" styleClass="delbutton"/>
    </h:form>
</c:if>

此外,JSTL <h:form rendered="#{berichten.gebruiker.gebruikersnaam == login.username}"> <a style="cursor: pointer;" class="edit_link" title="Edit" id="m#{berichten.id}">Wijzigen</a> - <h:commandLink value="Verwijderen" action="#{database.deleteBericht(berichten.id)}" styleClass="delbutton"/> </h:form> 标记不起作用。如果您使用的是JSF 2.0,请改用<c:set>的{​​{1}}属性。

varStatus