Question

Bonjour!

Je ne sais même pas si cela est possible, mais j'espère que cela se passe en Java. Je sais que je l'ai fait en PHP en utilisant des variables variables et en accédant à une variable de manière dynamique, mais j'ai lu que cela n'était pas possible en Java dans une question différente.

J'ai un tableau de chaînes qui contient l'état des cases à cocher dans mon interface graphique JSF. Si toutes les cases à cocher sont définies, le tableau sera alors rempli de chaînes contenant la valeur de différentes cases à cocher.

Les étiquettes et les valeurs des cases à cocher sont construites en parcourant un tableau ressemblant à ceci:

private static final String[][] OVERVIEW_FIELDS = {{"ID", "requestid"},
    {"Date added", "dob"}, {"Title", "requestTitle"}, {"Process", "processId"},
..., ..., ...};

Ensuite, je parcours le tableau et en fais sortir JSF SelectItems:

for (int i = 0; i < OVERVIEW_FIELDS.length; i++) {
    SelectItem item = new SelectItem(OVERVIEW_FIELDS[i][0], OVERVIEW_FIELDS[i][1]);
    getFields().add(item);
}

Le problème et la solution actuelle (j'espère que quelqu'un pourra m'aider à le transformer en quelque chose de mieux:

for (String item : getVisibleFields()) {
           if (item.equals("dob")) {
                setDob(true);
            }
            if (item.equals("requestTitle")) {
                setRequestTitle(true);
            }
            if (item.equals("processId")) {
                setProcessId(true);
            }
            if (...) {
            }
}

Et ainsi de suite, cela continue pour 11 booléens. Je n'aime pas cette solution et je vois des modèles similaires dans d'autres beans de mon système.

Quelqu'un sait-il s'il existe une meilleure solution à cela? Les colonnes de contrôle booléens dans lesquelles je règle le champ affiché sur true / false en fonction du contenu du tableau de cases à cocher.

J'espérais dans l'EL JSF que je pouvais accéder à la variable visibleFields et à la méthode contains, renvoyant ainsi la valeur true ou false si l'objet existe dans un tableau. Cela ne semble pas fonctionner cependant et le EL ne me donne pas accès à la méthode contient.

J'utilise actuellement:

rendered="#{overviewFilterBean.dob}"

Et j'ai essayé avec ce code:

rendered="#{overviewFilterBean.visibleFields.contains['dob']}">

Cela m’a amené à essayer d’utiliser mon tableau final et à définir les booléens selon getFields().contains(OVERVIEW_FIELDS[i][1]), mais comment puis-je rendre cela possible?

Une partie du code réel et une partie du pseudo-code suivent (la solution que je cherchais pour l'instant):

for (int i = 0; i < OVERVIEW_FIELDS.length; i++) {
    if (item.equals(OVERVIEW_FIELDS[i][1])) {
           setOVERVIEW_FIELDS[i][1](true);
       }
    }

La grande question:

Puis-je utiliser la valeur de OVERVIEW_FIELDS[i][1] pour définir la variable booléenne correcte ou puis-je en faire une carte et peut-être utiliser l'EL JSF pour vérifier si la clé existe dans la carte?

Merci pour votre temps et désolé d'avoir écrit une question aussi longue pour en arriver à un petit point: /

EDIT:

La méthode de réflexion a abouti à 5 exceptions, à un gros bloc de code les manipulant et également à une méthode coûteuse. Cela me porte à croire que mon ancienne solution ou l'utilisation de cartes est la meilleure façon de le faire. Je vais essayer la solution de la carte =)

Était-ce utile?

La solution

Vous pouvez toujours stocker les valeurs dans une carte plutôt. Toutefois, si vous souhaitez invoquer des méthodes basées sur le nom de la méthode sous forme de chaîne, utilisez la réflexion. Voir http://java.sun.com/developer/technicalArticles/ALT/Reflection/

Autres conseils

Avec la réflexion , vous pouvez effectuer les opérations suivantes:

for (String item : getVisibleFields()) {
    getClass().getMethod("get" + capitalize(item)).invoke(this, true);
}

La gestion des exceptions et la méthode capitalize sont laissées au lecteur sous forme d'exercice ( invoke lève un lot d'exceptions).

Vous pouvez utiliser l'API de réflexion Java pour rechercher le champ de manière dynamique et le définir, comme dans cet exemple . Notez que cette méthode aura un impact négatif sur les performances.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top