2008-10-22 8 views
14

Je travaille sur un JSP où j'ai besoin d'appeler des méthodes sur un objet provenant d'un Bean. La version précédente de la page n'utilise pas JSTL et cela fonctionne correctement. Ma nouvelle version a un jeu comme ça:JSTL, Beans, et appels de méthode

<jsp:useBean id="pageBean" scope="request" type="com.epicentric.page.website.PageBean" /> 
<c:set var="pageDividers" value="<%= pageBean.getPageDividers() %>" /> 
<c:set var="numColumns" value="${pageDividers.size()}" /> 

La pageDividers variable est un objet List.

Je rencontre ce problème: lorsque je demande la taille de pageDivider, une exception est levée. Je sais que c'est une simple erreur JTSL - qu'est-ce que je fais mal?

Le message d'erreur est:

La taille de la fonction doit être utilisée avec un préfixe lorsqu'un espace de noms par défaut n'est pas spécifié

Comment puis-je accéder correctement ou appeler les méthodes de mon objet pageDividers ?

Répondre

27

Lorsque vous utilisez l'opérateur point pour l'accès à la propriété JSTL, ${pageDividers.size} (pas () nécessaire) se traduit par un appel à une méthode appelée getSize().
Puisque java.util.List offre une méthode appelée size() (plutôt que getSize()), vous ne pourrez pas accéder à la longueur de la liste en utilisant ce code.


Pour accéder à une taille de la liste, JSTL offre la fn: longueur, utilisée comme

${fn:length(pageDividers)} 

Notez que pour pouvoir utiliser l'espace de noms fn, vous devez déclarer comme suit

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 

En outre, la même fonction peut être utilisée avec n'importe quel type de collection, et avec Stri ngs aussi.

+0

Cela fonctionne, merci! –

+1

Méfiez-vous. J'ai rencontré un bogue obscur dans Websphere 6.12- qui s'est produit quand une fonction JSTL a été exécutée dans un corps d'étiquette. Ceci est corrigé dans Websphere 6.13+, mais pas plus bas que 6.13. Comme nous utilisons 6.11, nous devions créer des balises personnalisées pour les fonctions que nous utilisions, en déléguant au code actuel. – MetroidFan2002

+5

Ça craint les grands cahones. Pourquoi ne vont-ils pas vous invoquer une méthode utilisant la classe/l'instance elle-même? Vous rencontrez toutes sortes de trous de ver sur la plate-forme JEE ... ffs! – momomo

2

Pour accéder à la propriété d'un bean en utilisant EL, il vous suffit de nommer la propriété (sans invoquer la méthode). Disons donc que vous avez une méthode appelée getSize() dans la fève puis

${pageDividers.size} 

Avis non(). EDIT: Désolé ... une erreur est survenue dans le message d'origine.

Questions connexes