【问题标题】:How can I work with Iterables in my JSP pages?如何在我的 JSP 页面中使用 Iterables?
【发布时间】:2011-06-02 09:20:51
【问题描述】:

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

在没有先前转换的情况下使其工作的最干净和最简单的方法是什么? 做最新的 JSTL-Jasper-EL-taglibs-etc。版本支持吗?我在哪里可以找到这些信息?我没有找到任何关于它的谷歌搜索...

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

【问题讨论】:

  • 你不能在你的jsp页面的scriptlet中使用iterable.iterator()?
  • 我宁愿避免使用 scriptlet,但无论如何,它绝对是一个快速而简单的解决方案。

标签: java jsp jstl


【解决方案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();
    }
}

【讨论】:

    【解决方案2】:

    您可以在 Java 中实现自己的 JSP 标签,因此您可以编写一个接受 Iterable 的标签,然后像使用 JSTL forEach 标签一样使用它。

    本文档有一个示例,说明如何创建一个自定义标签,该标签遍历任意自定义对象 - 您的实现可能会更简单。关键在于返回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;
        }
    }
    

    【讨论】:

    • 看起来很不错。有时间我会试试的。我接受它,因为我认为这是迄今为止最好的解决方案。优雅,只是迭代一个 Iterable 有点太多了......我希望它被集成到 c:ForEach
    【解决方案3】:

    您可以创建一个Map,将您的Iterables 作为键,将它们的Iterators 作为值。然后,您应该能够在使用 JSTL/EL 的 JSP 中使用 Iterables 访问 Iterators

    进一步阅读:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 2011-01-01
      相关资源
      最近更新 更多