我正在使用大量使用Iterables(java.lang.Iterable)的API,但我无法直接在JSP页面上使用它们,因为JSTL标记和EL无法处理它们。现在,我正在将每个迭代变换为一个列表,然后再渲染它们。
如果没有先前的转换,最简洁,最简单的方法是什么? 做最新的JSTL-Jasper-EL-taglibs等。版本支持吗?我在哪里可以找到这些信息?我没有发现谷歌搜索...
我知道我可以使用Iterable.iterator(),但我不能在JSP中调用该方法,只能在我的控制器类中调用,这是非常有限的。
答案 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;
}
}