在EL中创建列表

时间:2009-09-14 12:02:39

标签: jsp jsp-tags

假设我有一个带有字符串列表的自定义标记:

<%@ attribute name="thelist" type="java.util.List&lt;java.lang.String&gt;"
    required="true" %>

如何在调用标记的jsp中创建此属性?我可以使用scriptlet

<tags:list thelist='<%= java.util.Arrays.asList("blah","blah2") %>' />

但有没有办法使用表达式语言,因为这似乎是首选?

4 个答案:

答案 0 :(得分:8)

如果您只想创建列表,则可以使用[<jsp:useBean>][1]在所需范围内创建对象:

<jsp:useBean id="thelist" scope="request" class="java.util.ArrayList" />

这是有效的,因为ArrayList有一个no-args构造函数。但是,列表中没有任何内容。而且,据我所知,EL和JSTL都没有提供用于向集合添加项目的内置机制 - 它们都专注于只读访问。我想您可以定义EL function mapping来启用add()方法。

但是,我认为你最好不要强迫JSP做一些它不想做的事情。在这种情况下,这意味着您应该使用Java编写实际的标记处理程序,而不是使用JSP标记文件。

答案 1 :(得分:3)

作为kdgregory says,您可以使用custom tag library functions执行此操作,但它不会很漂亮。例如,像这样:

#{foo:add(foo:add(foo:add(foo:newList(), 'One'), 'Two'), 'Three')}

您只是遇到过去被称为Simplest Possible Expression Language的限制。

通过其他一些机制(比如bean)更容易做到这一点。

答案 2 :(得分:3)

如果你想避免使用scriptlet或丑陋的EL函数,你可以使用自己的构建器并欺骗EL解释器:

...

<jsp:useBean id="listBuilder" class="com.example.ELListBuilder"/>

<ul>
  <c:forEach var="item" items="${listBuilder['red']['yellow']['green'].build}">
      <li>${item}</li>
  </c:forEach>
</ul>

...

查看此处的示例:https://gist.github.com/4581179

答案 3 :(得分:1)

从 EL 3 开始,您只需执行 #{['blah','blah2']} 即可创建列表。