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.
Réponses
Trop de publicités?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);
}
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 :
- Soumettre une requête GET/POST d'un JSP à une servlet.
- 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.
- Le servlet achemine la réponse vers la JSP suivante, qui peut être la même que la JSP requérante.
- Rincer, répéter.
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é.
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>