Создание списка в EL - PullRequest
       15

Создание списка в EL

7 голосов
/ 14 сентября 2009

Предположим, у меня есть пользовательский тег, который принимает список строк:

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

Как я могу создать этот атрибут в jsp, который вызывает тег? Я мог бы использовать скриптлет

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

но есть ли способ сделать это с помощью языка выражений, так как это кажется предпочтительным?

Ответы [ 3 ]

8 голосов
/ 14 сентября 2009

Если все, что вы хотите сделать, это создать список, то вы можете использовать [<jsp:useBean>][1] для создания объекта в нужной области:

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

Это работает, потому что ArrayList имеет конструктор без аргументов. Однако в списке ничего не будет. И, насколько я знаю, ни EL, ни JSTL не предоставляют встроенного механизма для добавления элементов в коллекцию - они оба ориентированы на доступ только для чтения. Я полагаю, что вы могли бы определить EL функцию отображения , чтобы включить метод add().

Однако я думаю, что вам лучше не пытаться заставить JSP делать то, чего он не хочет. В этом случае это означает, что вместо использования файла тегов JSP вы должны написать фактический обработчик тега в Java.

3 голосов
/ 20 января 2013

Если вы хотите избежать скриптовых или уродливых функций 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 голосов
/ 14 сентября 2009

Как говорит kdgregory , вы можете сделать это с помощью функций библиотеки пользовательских тегов , хотя это не будет красиво. Например, что-то вроде этого:

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

Вы просто сталкиваетесь с ограничениями того, что раньше называлось Простейшим возможным языком выражений .

Было бы проще сделать это с помощью какого-то другого механизма, например, бина.

...