webentwicklung-frage-antwort-db.com.de

Aufrufen einer parametrisierten Methode aus JSP mit JSTL / EL

Aufrufen einer Java mit Argumenten, die in Java class definiert sind, von JSP mit JSTL/EL. Die Methode gibt Arrays zurück. Jeder Rückgabewert kann verwendet werden.

42
sachin gk

Sie können Methoden mit Argumenten in EL nur aufrufen, wenn Sie einen Servlet 3.0-kompatiblen Container (z. B. Tomcat 7, Glassfish 3, JBoss AS 6 usw.) mit einem web.xml Als konform deklarierten Servlet 3.0 als Ziel festlegen und ausführen. Diese Servlet-Version wird mit EL 2.2 ausgeliefert, mit der beliebige Instanzmethoden mit Argumenten aufgerufen werden können.

Angenommen, Sie haben ein ${bean} Im Gültigkeitsbereich, das sich auf eine Instanz einer Klasse bezieht, die eine Methode wie public Object[] getArray(String key) hat, dann sollten Sie in der Lage sein, dies zu tun:

<c:forEach items="${bean.getArray('foo')}" var="item">
    ${item} <br />
</c:forEach>

oder sogar mit einer anderen Variablen als Argument

<c:forEach items="${bean.getArray(foo)}" var="item">
    ${item} <br />
</c:forEach>

Wenn Sie jedoch keinen Servlet 3.0-Container als Ziel angeben, können Sie in EL überhaupt keine Methoden mit Argumenten aufrufen. Am besten erledigen Sie die Aufgabe einfach im Vorverarbeitungsservlet, wie von Duffymo vorgeschlagen.

Object[] array = bean.getArray("foo");
request.setAttribute("array", array);
// ...

Als völlig andere Alternative könnten Sie eine EL-Funktion erstellen, die den Methodenaufruf delegiert. Sie finden ein Kickoff-Beispiel in der Nähe von dieses Blog . Sie möchten am Ende so etwas wie:

<c:forEach items="${util:getArray(bean, 'foo')}" var="item">
    ${item} <br />
</c:forEach>

mit

public static Object[] getArray(Bean bean, String key) {
    return bean.getArray(key);
}
60
BalusC

Die obige Lösung hat bei mir nicht funktioniert. Ich hatte eine Funktion getRemitanceProfileInformation(user) in meiner Java class. Ich habe eine Usebean von Java class erstellt und dann aufgerufen

<c:set var="paymentValueCode" value='remittanceaddr.getRemitanceProfileInformation("${user}")'/>

und es hat funktioniert.

4
user1417914

Geben Sie der JSP einen Verweis auf eine Instanz der Klasse mit der Methode und rufen Sie sie auf.

Sie fragen sich wahrscheinlich, wer der JSP diese Instanz gibt - es ist ein Servlet in der MVC-Anordnung Modell 2.

So funktioniert der Ablauf:

  1. Senden Sie eine GET/POST-Anforderung von einer JSP an ein Servlet.
  2. Servlet handelt auf diese Anforderung und erledigt einige Arbeiten im Auftrag der JSP. Ordnet alle erforderlichen Objekte einer Anfrage, Sitzung oder einem anderen geeigneten Bereich zu.
  3. Das Servlet leitet die Antwort an die nächste JSP weiter, die möglicherweise mit der anfordernden JSP identisch ist.
  4. Spülen, wiederholen.
2
duffymo

Wenn Sie JSF verwenden, können Sie eine Bean als Modell in View Scope verwenden und automatisch aus der Datenquelle laden. Und wenn Sie JSP verwenden, wie wäre es dann mit TLD-Tag? Und mit JSTL-Tag <c:foreach>? Es rettet den Speicher vor dem Speichern in der Sitzung, oder speichert es in der Sitzung und entfernt es, wenn das Ladeereignis abgeschlossen ist? Einige wie folgt (JSTL + TLD)

<c:forEach items="${myTag:getProductByPage(page)}" var="p">
     Product name: ${p.productName}
</c:forEach>
0
BachT