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é.
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);
}
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é.
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:
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>