Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top