Jsp 在EL中创建列表

Jsp 在EL中创建列表,jsp,jsp-tags,Jsp,Jsp Tags,假设我有一个自定义标记,它包含一个字符串列表: <%@ attribute name="thelist" type="java.util.List&lt;java.lang.String&gt;" required="true" %> 如何在调用标记的jsp中创建此属性?我可以用脚本 <tags:list thelist='<%= java.util.Arrays.asList("blah","blah2") %>' />

假设我有一个自定义标记,它包含一个字符串列表:

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

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

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


但是有没有办法使用表达式语言来实现这一点,因为这似乎是首选方法?

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

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

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

然而,我认为最好不要强迫JSP做它不想做的事情。在本例中,这意味着您不应该使用JSP标记文件,而应该用Java编写一个实际的标记处理程序。

。例如,类似这样的内容:

#{foo:add(foo:add(foo:add(foo:newList(), 'One'), 'Two'), 'Three')}
你只是遇到了过去被称为


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

如果您想避免使用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>

...
。。。
  • ${item}
...

检查这里的示例:

自EL 3以来,您只需执行
{['blah','blah2']}
即可创建一个列表。

EL自2009年以来有了新功能:请参见。4年后是否仍然如此:“EL和JSTL都不提供向集合添加项目的内置机制”。找不到办法this@cahen-我已经好几年没有大量使用EL了,但我认为没有理由改变它。JSP旨在作为一种视图技术,而变异是控制器应该做的事情。