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