如何在JSP页面中使用Iterables?

时间:2011-06-02 09:20:51

标签: java jsp jstl

我正在使用大量使用Iterables(java.lang.Iterable)的API,但我无法直接在JSP页面上使用它们,因为JSTL标记和EL无法处理它们。现在,我正在将每个迭代变换为一个列表,然后再渲染它们。

如果没有先前的转换,最简洁,最简单的方法是什么? 做最新的JSTL-Jasper-EL-taglibs等。版本支持吗?我在哪里可以找到这些信息?我没有发现谷歌搜索...

我知道我可以使用Iterable.iterator(),但我不能在JSP中调用该方法,只能在我的控制器类中调用,这是非常有限的。

3 个答案:

答案 0 :(得分:1)

要在JSTL标记中访问EL表达式中Iterables的迭代器,您可以使用Java代码(在您的模型,控制器或服务层中)将Iterable对象包装在类似Iter的实例中(如下所示)一个遵循Java bean方法名称约定的简单getter方法:

public class Iter<T> {

    private final Iterable<T> iterable;

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

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

答案 1 :(得分:0)

您可以使用Map作为关键字创建Iterables,并将Iterators作为值。然后,您应该能够使用JSTL / EL在JSP中使用Iterators访问Iterables

进一步阅读:

答案 2 :(得分:0)

您可以在Java中实现自己的JSP标记,因此您可以编写一个接受Iterable的标记,然后以与使用JSTL forEach标记相同的方式使用它。 / p>

本文档提供了一个示例,说明如何创建迭代任意自定义对象的自定义标记 - 您的实现可能会更简单。关键是返回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;
    }
}