web-dev-qa-db-fra.com

Comment appeler une méthode paramétrée à partir de JSP à l'aide de JSTL / EL

Comment appeler une méthode Java avec des arguments définis dans la classe Java, à partir de JSP en utilisant JSTL/EL. La méthode renvoie des tableaux. Toute valeur de retour peut être utilisé.

42
sachin gk

Vous ne pouvez appeler des méthodes avec des arguments dans EL que si vous ciblez et exécutez un conteneur compatible Servlet 3.0 (par exemple Tomcat 7, Glassfish 3, JBoss AS 6, etc.) avec un web.xml Déclaré Servlet 3.0 conforme. Cette version de servlet est fournie avec EL 2.2 qui permet d'appeler des méthodes d'instance arbitraires avec des arguments.

En supposant que vous avez un ${bean} Dans la portée qui se réfère à une instance d'une classe qui a une méthode quelque chose comme public Object[] getArray(String key), alors vous devriez pouvoir faire ceci:

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

ou même avec une autre variable comme argument

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

Mais si vous ne ciblez pas un conteneur Servlet 3.0, vous ne pouvez pas du tout appeler des méthodes avec des arguments dans EL. Votre meilleur pari est de simplement faire le travail dans le servlet de prétraitement comme suggéré par Duffymo.

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

Comme alternative complètement différente, vous pouvez créer une fonction EL qui délègue l'appel de méthode. Vous pouvez trouver un exemple de lancement quelque part vers le bas de ce blog . Vous aimeriez finir quelque chose comme:

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

avec

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

La solution ci-dessus n'a pas fonctionné pour moi. J'avais une fonction getRemitanceProfileInformation(user) dans ma classe Java. J'ai créé un usebean de Java puis invoqué

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

et ça a marché.

4
user1417914

Donnez au JSP une référence à une instance de la classe qui a la méthode et appelez-la.

Vous demandez probablement qui donne à la JSP cette instance - c'est une servlet dans l'arrangement MVC modèle-2.

Voici comment le flux fonctionnera:

  1. Soumettez une demande GET/POST d'un JSP à un servlet.
  2. Servlet répond à cette demande et effectue certains travaux au nom du JSP. Place tous les objets nécessaires dans la demande, la session ou toute autre étendue appropriée.
  3. Le servlet achemine la réponse au JSP suivant, qui peut être le même que le JSP demandeur.
  4. Rincez, répétez.
2
duffymo

Si vous utilisez JSF, vous pouvez utiliser un bean comme modèle dans View Scope et le charger automatiquement à partir de la source de données. Et si vous utilisez JSP, que diriez-vous d'utiliser TLD Tag? Et en utilisant la balise JSTL <c:foreach>? Cela sauve la mémoire de l'enregistrement dans la session, ou enregistre dans la session et la supprime lorsque l'événement de chargement est terminé? Certains comment ça (JSTL + TLD)

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