# JSTL Tags funktionieren nicht in Facelets/MyFaces



## alan79 (4. Mai 2008)

Hallo miteinander

Folgende Libs werden verwendet.
- MyFaces 1.2.2
- Richfaces 3.2
- Facelets 1.1.13
- Hibernate 3.2.4
Applicationserver: Tomcat6


In meiner MySQL DB gibts eine Tabelle "news". Bestehend aus folgenden Feldern:
header (varchar(50))
description (text)

Ich möchte gerne die "News"-Datensätze Auflisten. Funktioniert alles soweit sehr gut. Allerdings möchte ich gerne die "description", falls grösser als 60 Zeichen, in der Liste auf 60 Zeichen kürzen. Falls die description gekürzt wurde soll ein Link "Read more" eingeblendet werden.

Grundsätzlich stellt sich hier für mich schon mal die Frage, wo diese Logik implementiert werden sollte? Ich verfolge das MVC Konzept.
Aus meiner Sicht geht es hier um eine reine GUI thematik und daher sollte diese Funktionalität doch eigentlich in die View oder allenfalls den Controller integriert werden..

Ich habe versucht das Ganze mit JSTL zu realisieren. Musste jedoch feststellen, das JSTL zusammen mit Facelets nicht 100%ig funktioniert? Oder?
Die Funktionen "fn:length" und "fn:substring" funktionieren. "c:if" jedoch nicht, es scheint so, als wird jede "c:if" Schleife ausgewertet, egal wie die Bedingung evaluiert.

Hat jemand eine Idee wie ich diese Funktionalität direkt in der Page integrieren könnte?

Danke für irgendwelche Tipps und Tricks.
Grüsse
Alan


----------



## freez (5. Mai 2008)

Hm, ich realisiere so etwas in einer Managed Bean. Im Action Listener (oder wegen mir auch in ner Action Methode) hole ich mir die Daten aus der DB und kürze dann bei Bedarf den String auf die 60 Zeichen. Zusätzlich setze ich ein boolean auf true, welche ich im Rendered Attribut des commandLink "Read More" abfrage. Somit brauche ich jstl dafür nicht.

Ob diese Vorgehensweise richtig ist, kann man diskutieren, aber mir hat das schon gute Dienste geleistet.


----------



## alan79 (5. Mai 2008)

hallo freez
Danke für deine Antwort.

Ich habe auch schon versucht das Ganze in der Managed Bean umzusetzen. Habs allerdings noch nicht 100%ig zum laufen gekriegt..

Die Datenkürzung hat mal soweit geklappt. War allerdings nicht ganz einfach da ich Hibernate nutze und da hab ich festgestellt, dass man höllisch aufpassen muss, dass die Datenkürzung nicht automatisch gespeichert wird. Das hat dann schlussendlich eigentlich alles geklappt (detached Objects). Obwohl es bei der Auswahl / Bearbeitung des Datensatzes noch ein paar Problemchen gibt.

Das mit dem "rendered" Attribut hab ich bis jetzt nicht hingekriegt. Ich habe verschiedene Wege ausprobiert.
Ich hab da wahrscheinlich noch ein Verständnisproblem. Ich habe auch in der Managed-Bean eine Boolean definiert. Nur verstehe ich nicht wo und wann dieser Boolean wert gesetzt werden muss. In meine versuch habe ich über das "rendered" Attribut eine Methode in der Managed-Bean aufgerufen:



```
public Boolean getReadMoreRendered() {

		
               News temp = (News) dataTable.getRowData();
		
		if (temp.getDescription().length()>60){
			return true;
		}
		else
		{
			return false;
		}
	}
```

Das Ganze endet jedoch dann in einer NullPointerException. "dataTable.getRowData()" kann zum "render"-Zeitpunkt anscheinend nicht aufgerufen werden. Wie kann ich in der Methode auf die entsprechende Row zugreifen?
Ich habe mir auch schon überlegt, dieses Boolean in der Backing-Bean "News" direkt zu berechnen. Da ich jedoch Hibernate Reverse Engineering (-> Backing Beans werden automatisch generiert) nutze finde ich diese Lösung sehr unschön.

Vielen Dank für Deine Hilfe!
Grüsse
Alan


----------



## alan79 (5. Mai 2008)

kann man in 

rendered="#{newsHandler.getReadMoreRendered}"

überhaupt eine Methode aufrufen oder nur auf Eigenschaften zugreifen?


----------

