Pergunta

Suponha que eu tenho uma marca personalizada que leva uma lista de strings:

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

Como posso criar esse atributo no jsp que chama a tag? Eu poderia usar um scriptlet

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

mas existe alguma maneira de fazer isso usando Expression Language, uma vez que parece ser preferido?

Foi útil?

Solução

Se tudo que você quer fazer é criar a lista, então você pode usar [<jsp:useBean>][1] para criar o objeto no escopo desejado:

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

Isso funciona porque ArrayList tem um construtor no-args. No entanto, a lista não terá nada nele. E, tanto quanto eu sei, nem EL nem JSTL fornece um built-in mecanismo para adicionar itens a uma coleção - ambos estão focados em acesso somente leitura. Eu suponho que você poderia definir um mapeamento de função EL para activar o método add().

No entanto, penso que é melhor não tentar forçar JSP para fazer algo que ele não quer fazer. Neste caso, isso significa que em vez de usar um tagfile JSP, você deve escrever um manipulador de tag real em Java.

Outras dicas

Como kdgregory diz , você poderia fazer isso com funções de biblioteca de marcas personalizadas , embora ele não vai ser bonito. Por exemplo, algo como isto:

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

Você está apenas correndo para as limitações do que costumava ser chamado de simples possível Expression Language .

Seria mais fácil de fazer isso através de algum outro mecanismo, como um feijão.

Se você quer evitar scriptlet ou funções EL feias, você poderia usar você próprio construtor e enganar o intérprete 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>

...

Verifique o exemplo aqui: https://gist.github.com/4581179

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top