# Status als Bild anzeigen lassen. Wie?



## rider (3. Sep 2009)

Hallo,
wie kann ich 2 verschiedene Bilder anzeigen lassen bei JSF?
Sprich: rot -> noch offen
          grün -> erledigt

Für dies hab ich ein Enum in der Entity- Klasse:

```
public enum Status
	{
		Erledigt,
		Offen		
	}
```

Wie stelle / wo programmiere ich das nun, dass wenn es auf ERLEDIGT gesetzt wurde ein grüner Button o.Ä. erscheint?
Bei OFFEN eben rot!
Prinzip sollte klar sein, oder?


----------



## MrWhite (3. Sep 2009)

xmlns:c="http://java.sun.com/jstl/core"

c:if


----------



## rider (3. Sep 2009)

so wirklich viel kann ich damit leider nicht anfangen. 
Könntest du das weiter erläutern (Beispielcode?)


----------



## Geeeee (3. Sep 2009)

Wenn schon core erwähnt wurde, wo es ja kein else gibt.
Beispielhaft:

```
<c:choose> 
  <c:when test="${status == Klasse.Status.OFFEN} > 
    <img rot />
  </c:when> 
  <c:otherwise> 
    <img gruen /> 
  </c:otherwise> 
</c:choose>
```
oder eben zwei c:if... finde ich bei entweder oder gerade total sinnlos. Vor allem warum überhaupt enum für 2 Werte, die doch auch boolean sein können. Wenn es natürlich noch mehr geben soll, dann bietet sich Enum an.


----------



## rider (4. Sep 2009)

Danke für die Antwort zunächst:
So habe ich jetzt:
Allerdings: passt das hier so?


> test="${status == vorgang.status.Offen}



Auf was greift dies denn zu? Das greift doch auf die ManagedBean zu, oder?
Auf was wird denn hier genau verglichen?


[XML]					<h:column id="Status">
						<c:choose> 
  							<c:when test="${status == vorgang.status.Offen} > 
    							<h:graphicImage id="Offen" url="#{resource['images/offen.jpg']}" alt="Offen" />
 							 </c:when> 
 							<ctherwise> 
    							<h:graphicImage id="Erledigt" url="#{resource['images/erledigt.jpg']}" alt="Erledigt" /> 
  							</ctherwise> 
						</c:choose>
					</h:column>[/XML]


----------



## rider (8. Sep 2009)

Keiner eine Idee?


----------



## Terminator (8. Sep 2009)

Da kannste doch verschiedene Möglichkeiten nutzen:

1. Url für das Image Tag durch ne Bean Methode zurückliefern 
2. Mehrere Image Tags über rendered Attribute steuern
3. Eigenen Renderer schreiben

Letzte ist am besten, vor allem wenn mans mehrfach einsetzt.
JSTL solltest nicht in ner JSF Page verwenden.


----------



## Prismapanda (8. Sep 2009)

Ich würde es bei einem Fall, wo es nur um die Anzeige unterschiedlicher Bilder geht, über JSF EL machen:

<h:graphicImage url="#{(bean.status eq 'offen') ? '/img/offen.jpg' : '/img/erledigt.jpg'}" />

Hoffe, dass geht, aber ich glaube ich habs so in etwa auch schonmal gemacht.
Sonst würd ichs halt über das rendered Attribut machen:

<h:graphicImage url="/img/offen.jpg" rendered="#{bean.status eq 'offen'}" />
<h:graphicImage url="/img/erledigt.jpg" rendered="#{bean.status eq 'erledigt'}" />

Damit könnten dann auch unterschiedliche Komponenten gemacht werden. Bspw. könnte beim Status offen ein commandButton genommen werden, der der es dann als erledigt markiert etc.


----------



## rider (8. Sep 2009)

Danke zunächste für eure Antworten. 
Aber so ganz verstehe ich es noch nicht :/

So sieht nun die Seite aus:
[XML]			<h:dataTable id="VorgangTabelle"
						value="#{vv.vorgangliste}"
						var="vorgang"
						cellspacing="10"
						rendered="#{not empty vv.vorgangliste}">

					<h:column id="Vorgangs-ID">
						<f:facet name="header">
						#{msgVv['showVorgangDetails.id']}
						</f:facet>
						#{vorgang.id}
					</h:column>

					<h:column id="Status">
						<h:graphicImage url="/img/offen.jpg" rendered="#{vv.vorgangstatus eq 'OFFEN'}" />
						<h:graphicImage url="/img/erledigt.jpg" rendered="#{vv.vorgangstatus eq 'ERLEDIGT'}" />
					</h:column>

			</h:dataTable>		[/XML]

1. so ganz passt das nicht, oder? Wie geht meint ihr das mit dem rendered?
2. muss "vorgangstatus" in der ManagedBean stehen? Kann ich auch über vv.vorgang.vorgangstatus gehen?

Erklärung:
vv = BeanName
private Vorgang vorgang;

vorgangstatus (in der Klasse vorgang):

```
public enum VorgangStatus
	{
		ERLEDIGT,
		OFFEN		
	}
	private VorgangStatus vorgangstatus = VorgangStatus.OFFEN;
```

3. was heißt dieses "eq" ?


----------



## MrWhite (8. Sep 2009)

Terminator hat gesagt.:


> JSTL solltest nicht in ner JSF Page verwenden.



Wieso? Funktioniert super und hält die Components sauber.


----------



## Prismapanda (8. Sep 2009)

Dein Code sollte funktionieren. Du kannst die Eigenschaften der Beans natürlich ansprechen (solange es entsprechende Getter hat sogar bis zu einer beliebigen Tiefe also bean.eigenschaft.x.y.z etc.).
'eq' ist der Operator 'equals' in EL. 'ne' entsprechend 'not equals'. Ich bin mir nur nicht sicher, ob du einen enum mit einem String vergleichen kannst. Probiers doch einfach aus und guck obs passt 
JSTL mag teilweise funktionieren und wird bspw. in einigen Facelets Tutorials verwendet, aber es gibt auch Gegenbeispiele, wo's halt nicht geht, deshalb sollte man sie nicht verwenden, wenns nicht auch anders geht^^


----------



## rider (9. Sep 2009)

nochmal zur Deutlichkeit:
vielleicht habe ich mich ein wenig falsch ausgedrückt:

Das ist in der ManagedBean

```
private Vorgang vorgang;
```

und das in der Entity - Klasse "Vorgang"


```
public enum VorgangStatus
    {
        ERLEDIGT,
        OFFEN       
    }
    private VorgangStatus vorgangstatus = VorgangStatus.OFFEN;
```


Jetzt nochmal: kann ich dies dann so aufrufen? Normalerweiße ja!

```
vv.vorgang.vorgangstatus
```

vv ist der Name der ManagedBean in der faces-config!
vorgang ist in der ManagedBean und greift nun auf das Attribut "vorgangstatus" in der Entity-Klasse zu!
Getter + Setter sind auch hier vorhanden. 

Für "vorgangstatus" brauche ich keine Getter+Setter in der ManagedBean, oder?


Ob das mit dem "eq" auf Enums geht, weiß ich leider auch nicht.


----------



## Prismapanda (9. Sep 2009)

rider hat gesagt.:


> Für "vorgangstatus" brauche ich keine Getter+Setter in der ManagedBean, oder?


Doch, das meinte ich ja. Sonst kann auf die Eigenschaft ja nicht zugegriffen werden.
Aber probier es doch erstmal selber aus, dann hättest du doch gesehen, dass es nicht geht...


----------



## rider (9. Sep 2009)

mein Server läuft noch nicht - daher kann ich es nicht testen!

Aber in der Klasse VORGANG sind doch die Getter + Setter von "vorgangstatus", reichen die nicht?


----------



## Prismapanda (9. Sep 2009)

Hab dich wohl falsch verstanden. Du brauchst in der *Managed*Bean den Getter natürlich nicht, wenn er in der Klasse Vorgang drin ist. Dann kannst du es wie von dir beschrieben handhaben.


----------



## rider (10. Sep 2009)

Ok, dann lag ich doch richtig, danke!


----------

