2010-06-05 29 views
6

Tôi cần thêm phương thức nào để thêm vào một lớp Java tùy chỉnh để tôi có thể lặp qua các mục trong một thành viên của nó? Tôi không thể tìm thấy bất kỳ thông số kỹ thuật nào về cách thẻ JSTL forEach thực sự hoạt động nên tôi không chắc chắn cách thực hiện điều này.JSTL - Sử dụng forEach để lặp qua một lớp do người dùng định nghĩa

Ví dụ, nếu tôi thực hiện một lớp generic "ProjectSet" và tôi woud muốn sử dụng các đánh dấu sau trong giao diện JSP:

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

cơ bản lớp file:

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

Có bất kỳ giao diện nào mà tôi phải triển khai như ArrayAccess hoặc Iterator của PHP để hoạt động này có hiệu quả?

Chỉnh sửa: Không trực tiếp truy cập vào ArrayList, vì tôi có thể sẽ sử dụng một số loại Set bằng generic, và khung nhìn JSP không cần phải biết về các hoạt động bên trong của lớp.

Trả lời

5

Giao diện Iterable cung cấp chức năng này:

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

Bạn có thể trao đổi logic iterator như bạn cần.

+9

Lưu ý rằng JSTL forEach không hỗ trợ lặp lại (cực kỳ khó chịu) như forEach type. Vì vậy, bạn cần phải làm $ {projectSet.iterator()} –

+2

Trên thực tế .iterator() sẽ chỉ hoạt động trên Servlet Container mới nhất (và thậm chí cả JSTL mới nhất vẫn không hỗ trợ lặp lại). Bạn sẽ cần phải thực hiện một getter cho trình lặp (getIterator()). –

Các vấn đề liên quan