29 votes

Comment appeler une méthode paramétrée depuis une JSP en utilisant JSTL/EL

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

40voto

BalusC Points 498232

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

En supposant que vous avez un ${bean} dans la portée qui fait référence à une instance d'une classe qui possède une méthode du type public Object[] getArray(String key) alors vous devriez être en mesure de le faire :

<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 invoquer des méthodes avec des arguments dans EL. Votre meilleure chance est de faire le travail dans la servlet de prétraitement comme le suggère Duffymo.

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

Une autre solution consiste à créer une fonction EL qui délègue l'appel de la méthode. Vous trouverez un exemple de lancement quelque part vers le bas du document ce blog . Vous aimeriez finir par quelque chose comme ça :

<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);
}

2voto

duffymo Points 188155

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

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

Voici comment le flux fonctionnera :

  1. Soumettre une requête GET/POST d'un JSP à une servlet.
  2. Le servlet agit sur cette requête et effectue un travail pour le compte de la JSP. Elle place tous les objets nécessaires dans la requête, la session ou toute autre étendue appropriée.
  3. Le servlet achemine la réponse vers la JSP suivante, qui peut être la même que la JSP requérante.
  4. Rincer, répéter.

2voto

user1417914 Points 21

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 la classe java et ensuite invoqué

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

et ça a marché.

0voto

BachT Points 603

Si vous utilisez JSF, vous pouvez utiliser un bean qui agit comme un modèle dans View Scope, et charger automatiquement depuis la source de données. Et si vous utilisez JSP, pourquoi ne pas utiliser le tag TLD ? Et utiliser le tag JSTL <c:foreach> ? Il s'agit d'économiser la mémoire en sauvegardant dans la session, ou de sauvegarder dans la session et de la supprimer lorsque l'événement de chargement est terminé ? Un peu comme ceci (JSTL+TLD)

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X