簡體   English   中英

如何在我的 JSP 頁面中使用 Iterables?

[英]How can I work with Iterables in my JSP pages?

我正在使用大量使用 Iterables (java.lang.Iterable) 的 API,但我不能直接在我的 JSP 頁面上使用它們,因為 JSTL 標簽和 EL 無法處理它們。 現在,我正在將每個可迭代對象轉換為列表,然后再渲染它們。

在沒有先前轉換的情況下使其工作的最干凈和最簡單的方法是什么? 做最新的 JSTL-Jasper-EL-taglibs-etc。 版本支持嗎? 我在哪里可以找到這些信息? 我在谷歌上沒有找到任何關於它的信息......

我知道我可以使用 Iterable.iterator(),但我不能在 JSP 中調用該方法,只能在我的 controller class 中調用該方法,這是非常有限的。

To access the iterators of your Iterables in EL expressions in your JSTL tags, you could use Java code (in your model, controller or service layer) that wraps your Iterable objects in instances of a class Iter that looks like this (with a simple getter遵循 Java bean 方法名稱約定的方法):

public class Iter<T> {

    private final Iterable<T> iterable;

    public Iter(Iterable<T> iterable) {
        this.iterable = iterable;
    }

    public Iterator<T> getIterator() {
        return iterable.iterator();
    }
}

您可以創建一個Map ,其中您的Iterables作為鍵,它們的Iterators作為值。 然后,您應該能夠使用 JSTL/EL 使用 JSP 中的Iterables訪問Iterators

進一步閱讀:

您可以在 Java 中實現您自己的 JSP 標簽,因此您可以編寫一個接受Iterable的標簽,然后以與使用 JSTL forEach標簽相同的方式使用它。

本文檔有一個關於如何創建自定義標簽的示例,該標簽遍歷任意自定義 object - 您的實現可能會更簡單。 關鍵在於返回EVAL_BODY_AGAIN以允許您多次處理標簽的主體。

http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPTags6.html#68297

我還沒有嘗試過運行它,但它可能是從以下開始的:

public class IterableForEachTag extends BodyTagSupport {
    private static final long serialVersionUID = 1L;
    private Iterable<?> iterable = null;
    private Iterator<?> iterator = null;
    private String var = null;

    public int doStartTag() throws JspException {
        if (iterator == null) {
            iterator = iterable.iterator();
        }
        if (iterator.hasNext()) {
            Object element = iterator.next();
            pageContext.setAttribute(var, element);
            return (EVAL_BODY_AGAIN);
        } else
            return (SKIP_BODY);
    }

    public int doAfterBody() throws JspException {
        if (bodyContent != null) {
            try {
                JspWriter out = getPreviousOut();
                out.print(bodyContent.getString());
                bodyContent.clearBody();
            } catch (IOException e) {
                throw new JspException(e);
            }
        }
        if (iterator.hasNext()) {
            Object element = iterator.next();
            pageContext.setAttribute(var, element);
            return (EVAL_BODY_AGAIN);
        } else {
            return (SKIP_BODY);
        }
    }

    public void setIterable(Iterable i) {
        iterable = i;
        iterator = null;
    }

    public void setVar(String v) {
        var = v;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM