# JSTL-Vergleich (choose) innerhalb JSF-Datentabellen-Aufbau greift nicht



## JavaFips (30. Sep 2009)

Hallo,

nach


```
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
```

usw.

kommt eine JSF-Datentabelle mit JSTL-Vergleich:


```
<h:dataTable value="#{menuBean.menudata}"
                     var="menu"
                     styleClass="hauptMenu"
                     columnClasses="menuSpalte1, menuSpalte2"
                     width="186"
                     border="0" cellpadding="0" cellspacing="0">

            <h:column>

                <c:out value="XXX${navigation.hauptmenupunkt}XXX" />
                <h:outputText value="YYY#{menu.id}YYY" />

                <c:choose>
                    <c:when test="${navigation.seite eq '#{menu.menupunkt}'}">
                        <div id="pfeil_<h:outputText value="#{menu.menupunkt}" />">
                            <h:graphicImage url="/grafik/menue/leer_aktiv.png"
                                                width="34"
                                                alt="#{menu.menupunkt} Pfeil"
                                                title="#{menu.menupunkt} Pfeil" />
                        </div>
                    </c:when>
                    <c:otherwise>
                            <h:outputLink value="/java/#{menu.menupunkt}.jsf"
                                          onmouseover="pfeilAktiv('#{menu.menupunkt}')"
                                          onmouseout="pfeilInaktiv('#{menu.menupunkt}')">
                                <div id="pfeil_<h:outputText value="#{menu.menupunkt}" />">
                                    <h:graphicImage url="/grafik/menue/leer_inaktiv.png"
                                                    width="34"
                                                    alt="#{menu.menupunkt} Pfeil"
                                                    title="#{menu.menupunkt} Pfeil" />
                                </div>
                            </h:outputLink>
                    </c:otherwise>
                </c:choose>

        </h:column>

        <h:column>
                <c:choose>
                    <c:when test="${navigation.seite eq '#{menu.menupunkt}'}">
                        <h:graphicImage url="/grafik/menue/menuepunkt_#{menu.menupunkt}_aktiv.png"
                                        id="menue_punkt_${menu.menupunkt}"
                                        width="152"
                                        alt="#{menu.menupunkt}"
                                        title="#{menu.menupunkt}" />
                    </c:when>
                    <c:otherwise>
                        <h:outputLink value="/java/#{menu.menupunkt}.jsf"
                                      onmouseover="pfeilAktiv('#{menu.menupunkt}')"
                                      onmouseout="pfeilInaktiv('#{menu.menupunkt}')">
                            <h:graphicImage url="/grafik/menue/menuepunkt_#{menu.menupunkt}.png"
                                            id="menue_punkt_${menu.menupunkt}"
                                            width="152"
                                            alt="#{menu.menupunkt}"
                                            title="#{menu.menupunkt}" />
                        </h:outputLink>
                    </c:otherwise>
                </c:choose>

        </h:column>

     </h:dataTable>
```

Bei dieser Abfrage ( <c:choose> ... </c:choose> ) - und es geht hier vor allem noch um die Übung - soll
ermittelt werden, ob der Menüpunkt, der an der Stelle angebaut werden soll, gewählt ist, denn dann
soll er nämlich anders dargestellt werden als die übrigen.

Obwohl die Zeilen


```
<c:out value="XXX${navigation.hauptmenupunkt}XXX" />
                <h:outputText value="YYY#{menu.id}YYY" />
```

beim gewählten Menüpunkt den gleichen Output zwischen den drei Erkennungshelferzeichen
(Whitespaces etc.) links und rechts liefern, ergibt


```
<c:when test="${navigation.seite eq '#{menu.menupunkt}'}">
```

nicht true, kein Punkt erscheint damit also anders dargestellt.


Warum greift die Abfrage nicht, auch, wenn inhaltlich gleiche Strings vorliegen?

Die Properties liefern jeweils - gemessen am Output - den gleichen String zurück,
wenn der gewählte Menüpunkt aufgebaut wird:


```
public String getSeite()
            {
                 if ( seite == null )
                 {
                     return "home";
                 }
                 else
                 {
                     return seite;
                 }
            }
```


```
public String getMenupunkt ( )
            {
                return this.menuPunkt;
            }
```

Kann es an den Daten liegen,
liegt der Fehler im JSTL- / EL-Bereich,
hat es was mit dem Scope oder einer deferred-Problematik
zu tun oder vergleiche ich an der Stelle womöglich die
Referenzen und nicht die Inhalte der Strings, brauche ich evtl.
so was wie .equals() ?

Gruß Fips




                                          .


----------



## Terminator (30. Sep 2009)

Das funktioniert nicht weil die Bedingung zu nem anderen Zyklus-Zeitpunkt ausgeführt wird.
=> nimm kein JSTL innerhalb ner Tabelle


----------



## JavaFips (30. Sep 2009)

Verstehe dem Prinzip nach, danke! 

Gibt es irgendwelche Möglichkeiten, den Aufbau strukturell durch die
unified Expression Language zu unterstützen, so, dass etwaige
Unterscheidungen wie 

-------------------------------------------------------------------------------------

wenn Menüpunkt = aktiv: setze eine best. Grafik hin
ansonsten: setze eine andere Grafik hin und mach sie zum Hyperlink

-------------------------------------------------------------------------------------

unmittelbar nachvollziehbar in Blöcke gepackt im View-Bereich unterkommen?

Oder ist eine <h:dataTable ... > für Fallunterscheidungen mit mittleren bis
umfangreichen Konsequenzen nicht geeignet, sollte man
so was also besser über

JSF/JSTL <hanelGrid ...><c:forEach ... ><c:choose>

angehen und nicht über

JSF <h:dataTable ... >?

(Wär ja auch nicht unbedingt im Sinne der Übersicht
mit lauter verstreuten angebundenen Beans insbesondere
der Hyperlink soll in einem best. Fall eben gar nicht erst
eingebaut werden. Die Unterscheidung sollte da
schon im View-Teil unterkommen.  )


.


----------



## MrWhite (1. Okt 2009)

Das rendered Attribut könnte dir weiterhelfen.


----------



## JavaFips (1. Okt 2009)

Das Attribut ist mir bisher noch gar nicht aufgefallen, das hilft natürlich, danke!


----------

