# JSF + Facelets: Datatable wird nicht angezeigt



## nightpoet (16. Nov 2007)

Hallo zusammen

Ich schlage mich seit einigen Tagen mit einem mysteriösen Datatable Problem herum.

Aus einer Managed Bean "GamesMB" soll eine ArrayList "gamesNotToRegisterFor" ausgelesen und deren Elemente in einer Datatable angezeigt werden. Beim Laden der Seite wird auch die entsprechende get - Methode der Bean aufgerufen. Wenn die Bean eine leere ArrayList zurückliefert, wird eine leere Tabelle angezeigt. Andernfalls wird sie überhaupt nicht gerendert. Lediglich das umgebende Formular ist im erzeugten HTML-Code sichtbar. Merkwürdigerweise wird der Rest der Seite fehlerfrei dargestellt und auch im Server-Log sind keine Hinweise auf die Ursache des Fehlers zu finden.

Zur Verdeutlichung hier einige Codeausschnitte:

Hier ein Auschnitt der Managed Bean


```
private ArrayList<GameMB> gamesNotToRegisterFor;
    private ArrayList<GameMB> gamesToRegisterFor;
	
    private HtmlDataTable gamesDataTable;
    private GameMB gameItem;
	
    [...]
	
    public ArrayList<GameMB> getGamesToRegisterFor() {
        if (logger.isDebugEnabled())
            logger.debug("entered List<GameMB> getGamesToRegisterFor()");
        if (gamesToRegisterFor == null || gamesToRegisterFor.size() == 0)
            logger.debug("Games Vector retrieved form session-bean is null or empty.");
		
        return gamesToRegisterFor;
    }
```

Registrierung der Beans GameMB und GamesMB in der faces-config.xml


```
<managed-bean>
  <managed-bean-name>gameBean</managed-bean-name>
  <managed-bean-class>control.managedBeans.GameMB</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>
 <managed-bean>
  <managed-bean-name>gamesBean</managed-bean-name>
  <managed-bean-class>control.managedBeans.GamesMB</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>
```

Ausschnitt aus der aufrufenden xhtml Seite


```
<h:panelGroup styleClass="messagecontainer" rendered="#{!empty gamesBean.gamesToRegisterFor}">	
				<h:outputText value="#{res['welcome.gamesToRegisterFor']}" styleClass="statusmessageheader"/>
				
	
				<h:outputText value="#{res['welcome.newGameNamesList']}" styleClass="statusmessageelement"/>
			</h:panelGroup>			
						
			<h:form id="selectGameToRegisterForm" styleClass="formcontainer" rendered="#{!empty gamesBean.gamesToRegisterFor}">
				<h:dataTable id="selectGameToRegisterTable" value="#{gamesBean.gamesToRegisterFor}" 
						var="gameItem" binding="#{gamesBean.gamesDataTable}" 
						border="0" cellpadding="0" cellspacing="0" rowClasses="tableelement1, tableelement2">
					      		
					<h:column>
					      <f:facet name="header">
					      	<h:outputText value="#{res['base.game']}" styleClass="tableheader"/>
					    </f:facet>     		
					    <h:commandLink action="#{gamesBean.executeGameSelection}" value="#{gameItem.name}" styleClass="tablelink"/>
					</h:column>
					      		
					<h:column>
					    <f:facet name="header">
					      	<h:outputText value="#{res['welcome.game.description']}" styleClass="tableheader"/>
					    </f:facet> 
					    <h:outputText value="#{gameItem.descriptionShort}" />
					</h:column>
					      		
					<h:column>
					   	<f:facet name="header">
					      	<h:outputText value="#{res['game.base.turn']}" styleClass="tableheader"/>
					    </f:facet> 
					    <h:outputText value="#{gameItem.round}" />
					</h:column>
					      		
					<h:column>
					    <f:facet name="header">
					      	<h:outputText value="#{res['welcome.game.closingDateOfRound']}" styleClass="tableheader"/>
					    </f:facet> 
					    <h:outputText value="#{gameItem.ending}" />
					</h:column>
					      		
					<h:column>
					    <f:facet name="header">
					      	<h:outputText value="#{res['welcome.game.mainLink']}" styleClass="tableheader"/>
					    </f:facet> 
					    <h:outputLink value="#{gameItem.mainLink}">
					      	<h:outputText value="#{gameItem.mainLink}" styleClass="tablelink"/>
					    </h:outputLink>			      		
					</h:column>
					      		
				</h:dataTable> 
			</h:form>
```

Die renderer-Attribute für die Datatable und die panelgroup mit den Hinweistexten habe ich nachtäglich eingefügt, damit beide nur angezeigt werden, wenn die ArrayList Daten enthält. 
Wenn ich die Seite aufrufe ist der Hinweistext jedoch niemals sichtbar - auch dann wenn keine leere Liste zurückgeliefert wird. Der Ausdruck #{!empty gamesBean.gamesToRegisterFor} wird anscheinend überhaupt nicht oder stets zu false evaluiert, obwohl auch hier die get - Methode der Bean korrekt aufgerufen wird. 

Hat jemand eine Idee, was hier falsch laufen könnte?

Thanx


----------



## nightpoet (16. Nov 2007)

Nachdem ich einen Fehler in der GamesMB Implementierung behoben habe, wird der "rendered" - Ausdruck in der panelgroup korrekt ausgewertet und der Text bei einer nicht leeren Liste angezeigt.

Ausserdem habe ich die Bean mit einem einfachen Testproperty getestet, was problemlos angezeigt wird. Der Fehler hängt daher wohl alleinig mit der Arrayliste und der Datatable zusammen.


----------

