繁体   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