2010-06-05 24 views
6

Welche Methoden muss ich einer benutzerdefinierten Java-Klasse hinzufügen, damit ich über die Elemente in einem ihrer Member iterieren kann? Ich konnte keine Spezifikationen darüber finden, wie das JSTL forEach-Tag tatsächlich funktioniert, also bin ich mir nicht sicher, wie das zu implementieren ist.JSTL - Verwenden von forEach zum Iterieren über eine benutzerdefinierte Klasse

Zum Beispiel, wenn ich eine generische "ProjectSet" Klasse gemacht und ich woud das folgende Markup in der JSP-Ansicht verwenden möchten:

<c:forEach items="${projectset}" var="project"> 
... 
</c:forEach> 

Basisklassendatei:

public class ProjectSet { 
    private ArrayList<Project> projects; 
    public ProjectSet() { 
     this.projects = new ArrayList<Project>(); 
    } 
    // .. iteration methods ?? 
} 

Gibt es jede Schnittstelle, die ich wie PHP ArrayAccess oder Iterator implementieren muss, damit dies funktioniert?

Bearbeiten: Ohne direkten Zugriff auf die ArrayList selbst, weil ich wahrscheinlich eine Art Set-Klasse mit Generics verwenden wird, und die JSP-Ansicht sollte nicht über die inneren Funktionen der Klasse wissen müssen. Ja

Antwort

5

Die Iterable Schnittstelle diese Funktionalität bietet implementieren:

public class ProjectSet implements Iterable<Project> { 
    private ArrayList<Project> projects; 
    public ProjectSet() { 
     this.projects = new ArrayList<Project>(); 
    } 

    // .. iteration methods ?? 
    @Override 
    public Iterator<Project> iterator() { 
     return projects.iterator(); 
    } 
} 

Sie können die Iterator Logik austauschen, wie Sie benötigen.

+9

Vorbehalt ist, dass JSTL forEach nicht iterable (extrem nervig) als für jeden Typ unterstützt. Also müssen Sie $ {projectSet.iterator()} tun –

+2

Eigentlich funktioniert .iterator() nur auf dem neuesten Servlet-Container (und selbst die neueste JSTL unterstützt immer noch nicht iterierbar). Sie müssen einen Getter für den Iterator erstellen (getIterator()). –

Verwandte Themen