2010-05-12 4 views
0

Je suis un JavaBean dans une page jsp. Je voudrais lui donner un nom dynamique, car en fonction de la valeur d'une variable (appelons-la foo), je veux qu'elle ait un contenu différent, et je veux garder toutes ces différentes versions en mémoire. Je veux que les beans aient une portée de session, parce que réévaluer le contenu est cher.Récupérer des noms JavaBean associés à JSP ou construire une variable avec un nom dynamique

Maintenant le bean a un nom statique, et si je recharge la page avec une valeur différente de foo, le contenu du bean est le même qu'avant (jsp:usebean cherche un JavaBean avec le nom spécifié, et si existe, il utilise l'ancien). Je voudrais garder à la fois l'ancienne version et la nouvelle, donc ils doivent avoir des noms différents.

Ce que je veux faire est la suivante:

<jsp:useBean id="stats<%=foo%>" class="foo.bar" scope="session"> 
</jsp:useBean> 

Mon problème est que je ne peux pas faire référence au JavaBean dans le code JSP, comme je ne sais pas son nom. Des idées sur la façon de résoudre cela?

En substance, je veux construire une variable avec un nom dynamique, basé sur la vaslue d'une autre variable.

Alternativement, je veux récupérer les noms des JavaBeans associés à la page courante, de sorte que j'obtienne une référence au JavaBean juste créé.

Répondre

0

Le moyen le plus simple serait d'implémenter un Map personnalisé que vous stockez dans la portée de session. Avec un Map vous pouvez utiliser la notation de l'accolade pour renvoyer dynamiquement une clé.

<jsp:useBean id="beanMap" class="com.example.BeanMap" scope="session" /> 
... 
${beanMap[someDynamicKey].someProperty} 

Il vous suffit de remplacer la méthode Map#get() pour laisser instancier le grain si absent au lieu de retourner null.

public class BeanMap extends HashMap<String, Bean> { 
    @Override public Bean get(Object key) { 
     Bean bean = super.get(key); 
     if (bean == null) { 
      bean = new Bean(); 
      super.put(String.valueOf(key), bean); 
     } 
     return bean; 
    } 
} 
+0

Cela semble assez simple, et je peux aussi décompresser la classe foo.bar (que je préfère). Cependant, je ferais quelque chose que le framework JSP a déjà implémenté, ce que je préférerais ne pas faire. Je suppose que si je ne peux pas faire ce que je pensais à l'origine, c'est un hack acceptable. :) Merci pour votre réponse! – FrontierPsycho

+0

J'ai essayé de le faire, et Java ne comprend pas que Bean est une classe, il pense que c'est un paramètre de type, même si j'ai importé la classe. Ainsi "new Bean()" donne une erreur. J'ai même essayé avec "String" et je reçois la même chose. – FrontierPsycho

+0

J'ai utilisé cette solution, bien que modifiée un peu. Je n'ai pas étendu HashMap (comme ce n'était pas possible), mais j'ai utilisé un Hashtable dans la balise useBean, et j'ai implémenté la logique ci-dessus dans mon code jsp. Pas très propre, mais ça marche et ce n'est pas si moche. – FrontierPsycho

Questions connexes