7

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

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

如何在调用标签的 jsp 中创建此属性?我可以使用小脚本

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

但是有什么方法可以使用表达式语言来做到这一点,因为这似乎是首选?

4

4 回答 4

8

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

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

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

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

于 2009-09-14T12:57:10.587 回答
3

正如kdgregory 所说,您可以使用自定义标记库函数来执行此操作,尽管它不会很漂亮。例如,像这样:

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

您只是遇到了曾经被称为最简单的可能表达语言的限制。

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

于 2009-09-14T17:47:58.253 回答
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

于 2013-01-20T19:51:38.947 回答
2

从 EL 3 开始,您可以简单#{['blah','blah2']}地创建一个列表。

于 2021-05-19T12:56:39.670 回答