Frage

Hallo!

Ich bin nicht einmal sicher, ob dies möglich ist, aber hoffentlich ist es in Java. Ich weiß, ich habe es in PHP getan durch variable Variablen und eine Variable dynamisch zugreifen, aber ich lese diese in Java in einer anderen Frage nicht möglich ist.

Ich habe ein Array von Strings, die den Zustand der Kontrollkästchen in meinem JSF GUI enthält. Wenn alle Kontrollkästchen das Array gesetzt werden, werden dann mit Strings gefüllt werden, um den Wert der verschiedenen Kontrollkästchen enthält.

Die Beschriftungen und Werte des Kontrollkästchen werden durch Schleifen durch eine Reihe gebaut, die wie folgt aussieht:

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

Dann iterieren ich das Array durch und JSF SelectItems daraus zu machen:

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

Das Problem und die aktuelle Lösung (hoffentlich kann mir jemand in etwas helfen Refactoring besser:

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

Und so weiter geht es weiter für 11 booleans. Ich weiß nicht, diese Lösung gefällt, und ich sehe ähnliche Muster in anderen Bohnen in meinem System.

Wer weiß, ob es eine bessere Lösung für dieses Problem ist? Die booleans Kontrollsäulen, wo ich ihr gemacht Feld auf true / false je nachdem, was das Kontrollkästchen Array enthält.

Ich war in der JSF-EL gehofft, ich die Visible Variable zugreifen konnte und die enthält Verfahren, also entweder wahr oder falsch zurückkehrt, wenn das Objekt in dem Array vorhanden sind. Dies scheint allerdings nicht zu arbeiten und der EL gibt mir nicht den Zugriff auf das Verfahren enthält.

Ich bin derzeit mit:

rendered="#{overviewFilterBean.dob}"

Und ich versuchte, mit diesem Code:

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

Nun führte dies mich zu versuchen, meine letzte Array zu verwenden und die booleans nach getFields().contains(OVERVIEW_FIELDS[i][1]) gesetzt, aber wie kann ich dies möglich zu machen?

Teil real und Teil Pseudo-Code folgt (die Lösung, die ich für jetzt wurde mit dem Ziel):

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

Die große Frage:

Gibt es eine Möglichkeit für mich, um den Wert von OVERVIEW_FIELDS[i][1] zu verwenden, um die richtige boolean Variable zu setzen oder kann ich diese in eine Karte drehen vielleicht und verwenden Sie die JSF EL zu überprüfen, ob Schlüssel in der Karte vorhanden ist?

Vielen Dank für Ihre Zeit, und sorry für das Schreiben eines solchen langen Frage zu einem kleinen Punkt zu kommen: /

EDIT:

Das Reflexionsverfahren in Folge 5 Ausnahmen, großer Code-Block Umgang mit ihnen und den Leuten sagten auch, dass sein ein teures Verfahren. Dies führt mich zu glauben, dass entweder meine alte Lösung oder durch Karten ist der beste Weg, es zu tun. Im gonna versuchen, die Karte Lösung =)

War es hilfreich?

Lösung

Sie können immer speichern die Werte in einer Karte eher. Wenn Sie jedoch Methoden aufrufen wollen auf der Grundlage der Methodenname als String, verwenden Reflexion. Sehen http://java.sun.com/developer/technicalArticles/ALT/Reflection/

Andere Tipps

Mit Reflexion , können Sie tun:

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

Die Ausnahmebehandlung und die capitalize Verfahren werden als Übung dem Leser überlassen ( invoke eine Los von Ausnahmen).

Sie können die Java-Reflection-API verwenden Sie das Feld dynamisch zu suchen und stellen Sie ihn, wie in dieses Beispiel . Beachten Sie, dass es eine Leistung dieser Methode getroffen werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top