2010-06-05 29 views
6

¿Qué métodos debo agregar a una clase Java personalizada para que pueda iterar sobre los elementos en uno de sus miembros? No pude encontrar ninguna especificación sobre cómo funciona realmente la etiqueta JSTL forEach, así que no estoy seguro de cómo implementarla.JSTL - Usar forEach para iterar sobre una clase definida por el usuario

Por ejemplo, si he hecho una clase genérica "ProjectSet" y me llenar gusta usar la siguiente línea de código en la vista JSP:

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

básica de archivos de clases:

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

¿Hay ¿Alguna interfaz que debo implementar como PHP ArrayAccess o Iterator para que esto funcione?

Editar: Sin acceso directo al ArrayList en sí mismo, porque probablemente usaré algún tipo de clase Set usando genéricos, y la vista JSP no debería tener que conocer el funcionamiento interno de la clase.

Respuesta

5

La interfaz Iterable proporciona esta funcionalidad:

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(); 
    } 
} 

Puede intercambiar la lógica iterador como sea necesario.

+9

Advertencia a eso es que JSTL forEach no es compatible con iterable (extremadamente molesto) como para cada tipo. Por lo tanto, debe hacer $ {projectSet.iterator()} –

+2

. En realidad, .iterator() solo funcionará en el último Servlet Container (e incluso el último JSTL aún no admite iterable). Tendrá que hacer un getter para el iterador (getIterator()). –

Cuestiones relacionadas