2008-10-22 7 views
14

Ich arbeite an einer JSP wo ich Methoden auf Objekt aufrufen muss, die von einer Bean kommen. Die vorherige Version der Seite verwendet JSTL nicht und es funktioniert ordnungsgemäß. Meine neue Version hat wie diese eine ein:JSTL, Bohnen und Methodenaufrufe

<jsp:useBean id="pageBean" scope="request" type="com.epicentric.page.website.PageBean" /> 
<c:set var="pageDividers" value="<%= pageBean.getPageDividers() %>" /> 
<c:set var="numColumns" value="${pageDividers.size()}" /> 

Die Variable pageDividers ist ein List Objekt.

Ich stoße auf dieses Problem: wenn ich nach pageDivider 's Größe frage, wird eine Ausnahme ausgelöst. Ich weiß, dass dies ein einfacher JTSL-Fehler ist - was mache ich falsch?

Die Fehlermeldung lautet:

Die Funktion Größe muss mit einem Präfix verwendet werden, wenn ein Standard-Namespace nicht angegeben

Wie richtig ich zugreifen oder die Methoden meines pageDividers Objekt aufrufen ?

Antwort

27

Wenn der Punkt-Operator für den Zugriff auf Eigenschaften in JSTL verwenden, ${pageDividers.size} (keine () erforderlich) führt zu einem Aufruf einer Methode getSize() benannt.
Da java.util.List eine Methode namens size() (statt getSize()) anbietet, können Sie nicht mit diesem Code auf die Listenlänge zugreifen.


Um auf eine Liste Größe zuzugreifen, bietet JSTL die fn: Länge Funktion, verwendet wie

${fn:length(pageDividers)} 

Beachten Sie, dass, um die fn Namespace zu verwenden, sollten Sie erklären Es folgt

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 

Darüber hinaus kann die gleiche Funktion mit jedem Sammlungsart und mit Stri verwendet werden ngs auch.

+0

Das funktioniert, danke! –

+1

Seien Sie vorsichtig. Ich bin in Websphere 6.12 auf einen obskuren Bug gestoßen, der auftrat, als eine JSTL-Funktion in einem Tag-Body ausgeführt wurde. Dies ist in Websphere 6.13+ behoben, aber nicht niedriger als 6.13. Als wir 6.11 verwendeten, mussten wir tatsächlich benutzerdefinierte Tags für die von uns verwendeten Funktionen erstellen und an den tatsächlichen Code delegieren. – MetroidFan2002

+5

Das saugt große Cahones. Warum zur Hölle werden sie dich eine Methode aufrufen lassen, die die Klasse/Instanz selbst benutzt !? Du findest auf der JEE-Plattform alle Arten von Wurmlöchern ... ffs! – momomo

2

Um auf die Eigenschaft einer Bean mit EL zuzugreifen, benennen Sie einfach die Eigenschaft (nicht die Methode aufrufen). Nehmen wir an, Sie haben eine Methode namens getSize() in der Bean dann

Hinweis no().

EDIT: Sorry ... hat einen Fehler im ursprünglichen Beitrag gemacht.