2011-04-10 51 views
1

我正在開發一個簡單的JSF應用程序,但我再次卡住了...的JavaServer Faces(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> 

postMessage方法在messageBean中。

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

你有一個JSTL <c:if>標籤裏面的JSF <ui:repeat>標籤。理解JSTL和JSF不會像編碼期望的那樣同步運行是很重要的。它是JSTL,它在視圖構建時間內首先運行,並且僅用JSF標記生成一個視圖。然後,JSF在視圖渲染時運行並生成HTML輸出。

後面JSF <ui:repeat>var屬性目的因此從未時可用JSTL <c:if>標籤運行。您希望使用JSF標記/屬性。在這種情況下,rendered屬性是適當的。

因此,通過

<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> 

另外,JSTL <c:set>標籤是不會在這裏工作更換

<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> 

。如果您使用的是JSF 2.0,請改用<ui:repeat>varStatus屬性。

<ui:repeat value="#{database.alleBerichten}" var="berichten" varStatus="loop"> 
    <div class="record"> 
     <div class="#{(loop.index % 2) != 0 ? 'posteven' : 'postodd'}"> 
+0

好吧,我不知道JSTL和JSF不會同步運行。但用戶發佈的新消息仍未添加到輸出中... – Arolition 2011-04-10 12:54:19

+0

此問題是由其他原因引起的。確保消息bean中的'db'實例和EL中的'#{database}'引用指向完全相同的實例。 – BalusC 2011-04-10 12:57:02

相關問題