Frage

Angenommen, ich einen benutzerdefinierten Tag habe, die eine Liste der Strings nehmen:

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

Wie kann ich dieses Attribut in der jsp erstellen, die den Tag ruft? Ich könnte eine scriptlet verwenden

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

aber ist es eine Möglichkeit, dies mit Expression Language zu tun, denn das ist der Vorzug zu geben scheint?

War es hilfreich?

Lösung

Wenn alles, was Sie tun wollen, die Liste ist erstellen, dann können Sie [<jsp:useBean>][1] verwenden Sie das Objekt in dem gewünschten Umfang zu erstellen:

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

Das funktioniert, weil Arraylist einen No-args Konstruktor hat. Allerdings wird die Liste nicht alles in ihm. Und soweit ich weiß, weder EL noch JSTL bieten einen eingebauten Mechanismus für Elemente zu einer Sammlung hinzugefügt - sie sind beide konzentrierten sich auf den Lesezugriff. Ich nehme an, dass Sie eine EL Funktionszuordnung definieren könnte die add() Verfahren zu ermöglichen.

Aber ich denke, dass Sie besser sind weg, etwas nicht zu tun versuchen, JSP zu zwingen, die es nicht tun will. In diesem Fall bedeutet das, dass, anstatt eine Tagfile JSP verwenden, sollten Sie einen tatsächlichen Tag-Handler in Java schreiben.

Andere Tipps

Wie kdgregory sagt , könnte man dies mit benutzerdefinierte Tag-Bibliotheksfunktionen , obwohl es nicht sei nett. Zum Beispiel, so etwas wie folgt aus:

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

Sie führen lediglich in den Grenzen dessen, was früher die einfachste mögliche Expression Language .

Es wäre einfacher, dies über einen anderen Mechanismus zu tun, wie eine Bohne.

Wenn Sie scriptlet oder hässlich EL-Funktionen vermeiden möchten, können Sie Sie eigene Builder verwenden und die EL-Interpreter täuschen:

...

<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>

...

Überprüfen Sie das Beispiel hier: https://gist.github.com/4581179

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top