如何在JSP页面中使用Iterables?

Jua*_*ero 5 java jsp jstl

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

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

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

Nic*_*ick 0

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

本文档有一个示例,介绍如何创建迭代任意自定义对象的自定义标记 - 您的实现可能会更简单。关键是返回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;
    }
}
Run Code Online (Sandbox Code Playgroud)