Gewusst wie: füllen Sie die Optionen des h:selectOneMenu aus der Datenbank?
Ich bin erstellen einer web-Anwendung, wo Sie haben, um zu Lesen, eine Liste von Objekten /Entitäten, die aus einer DB, und füllen Sie es in eine JSF <h:selectOneMenu>
. Ich bin nicht in der Lage, code dies. Kann mir jemand zeigen, wie es zu tun?
Ich wissen, wie man ein List<User>
aus der DB. Was brauche ich, um zu wissen, wie füllen Sie diese Liste in eine <h:selectOneMenu>
.
<h:selectOneMenu value="#{bean.name}">
...?
</h:selectOneMenu>
InformationsquelleAutor Illep | 2011-07-27
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf Ihre Frage, die die Geschichte, bist du mit JSF 2.x. So, hier ist eine JSF-2.x gezielte Antwort. In JSF 1.x Sie gezwungen wäre, wrap-Element Werte/Bezeichnungen in hässlich
SelectItem
Instanzen. Dies ist glücklicherweise nicht mehr nötig, in JSF 2.x.Einfaches Beispiel
Zur Beantwortung Ihrer Frage direkt, verwenden Sie einfach
<f:selectItems>
derenvalue
Punkte zu einemList<T>
Eigenschaft, die Sie erhalten von der DB bei bean ' s (post -) Bau. Hier ist eine einfache kickoff Beispiel unter der Annahme, dassT
stellt tatsächlich eineString
.mit
Einfach ist das. Tatsächlich, die
T
'stoString()
verwendet werden, repräsentieren sowohl der dropdown-Element label und Wert. Wenn man also stattList<String>
mit Hilfe einer Liste von komplexen Objekten wieList<SomeEntity>
und Sie noch nicht überschrieben der KlassetoString()
Methode, dann würden Sie sehencom.example.SomeEntity@hashcode
als item-Werte. Siehe Nächster Abschnitt, wie zu lösen, es richtig zu stellen.Beachten Sie auch, dass die Bohne für
<f:selectItems>
Wert müssen nicht unbedingt identisch sein bean als bean für<h:selectOneMenu>
Wert. Dies ist immer dann nützlich, wenn die Werte tatsächlich anwendungsweite Konstanten, auf die man einfach nur einmal laden während der Anwendung zu starten. Sie könnten dann machen es gerade eine Eigenschaft des application-scoped bean.Komplexe Objekte als verfügbare Elemente
Wenn
T
handelt sich um eine komplexe Objekte (JavaBeans), wieUser
die eineString
Eigenschaft vonname
haben, dann könnten Sie dievar
- Attribut auf die iteration variable, die Sie verwenden können, initemValue
- und/oderitemLabel
attribtues (bei weglassen deritemLabel
, dann das label wird dem Wert entspricht).Beispiel #1:
mit
Oder, wenn es eine
Long
Eigenschaftid
was du lieber magst, die als Element mit dem Wert:Beispiel #2:
mit
Komplexe Objekt als selektierte Element
Wann immer Sie möchten, um es zu einem
T
Eigenschaft in der bean als gut undT
stellt eineUser
, dann würden Sie brauchen, um zu Backen, eine benutzerdefinierteKonverter
wandelt zwischenUser
und eine eindeutige string-Darstellung (was sein kann, dieid
- Eigenschaft). Beachten Sie, dass dieitemValue
darstellen muss, die das komplexe Objekt selbst, das ist genau der Typ muss festgelegt werden, wie die Auswahl der Komponentevalue
.mit
und
(bitte beachten Sie, dass die
Converter
ist ein bisschen hacky, um der Lage sein, um zu injizieren, eine@EJB
in einer JSF-Konverter; normalerweise würde man haben kommentiert, wie@FacesConverter(forClass=User.class)
, aber das ist leider nicht erlaubt@EJB
- Injektionen)Vergessen Sie nicht, stellen Sie sicher, dass der komplexe Objekt-Klasse hat die
equals()
undhashCode()
richtig umgesetzt, sonst JSF wird beim Rendern nicht angezeigt ausgewählten Elements(s), und Sie werden auf submit Gesicht Validierungs-Fehler: Wert ist nicht gültig.Komplexe Objekte mit einer generischen Konverter
Kopf zu dieser Antwort: Implementieren Konverter für Einheiten mit Java Generics.
Komplexe Objekte ohne benutzerdefinierten Konverter
JSF-utility-Bibliothek OmniFaces bietet einen speziellen Konverter aus der box, das Ihnen erlaubt, komplexe Objekte in
<h:selectOneMenu>
ohne die Notwendigkeit, erstellen Sie eine benutzerdefinierte Konverter. DieSelectItemsConverter
einfach die Konvertierung basiert auf leicht verfügbaren Elemente, die in<f:selectItem(s)>
.Siehe auch:
<h:selectOneMenu>
wiki-Seite+10 sehr schöne Erklärung
Ich habe keine Ahnung, wovon du redest. Ich bin nirgendwo explizit initialisieren der Liste selbst. In diesem Beispiel wird davon ausgegangen, standard-Java-EE-stack mit EJB und JPA. Dies scheint nicht sein Thema zu der Frage. Drücken Sie
Ask Question
zu bitten, eine klare und konkrete Frage.Hi BalusC ich habe eine Frage könntest du bitte bitte Hilfe stackoverflow.com/questions/16062703/...
Lesen Sie das Kapitel "Komplexe Objekt als selektierte Element" von oben nach unten. Für die Zukunft "nichts passiert" Probleme, den Kopf zu stackoverflow.com/q/2118656
InformationsquelleAutor BalusC
View-Seite
Backing-Bean
Zur Anzeige von bestimmten ausgewählten Datensatz, es muss einer der Werte in der Liste.
Das Ziel festgelegt werden werden in der Bohne nach der Auswahl einer der Optionen(hier selectedName). Wert(valueObject) kann sein, einige, id, die Sie wollen, im back-end, aber muss Anzeigenamen auf dem Bildschirm mit Etikett.
InformationsquelleAutor Nayan Wadekar
Roll-your-eigenen generischen Konverter für komplexe Objekte wie ausgewählte Element
Den Balusc gibt eine sehr nützliche übersicht über Antworten auf dieses Thema. Aber es gibt eine alternative, die er nicht präsent: Das Roll-your-eigenen generischen Konverter, verarbeitet die komplexe Objekte wie das ausgewählte Element. Das ist sehr Komplex zu tun, wenn Sie wollen, um alle Fälle, aber ziemlich einfach, für einfache Fälle.
Den code unten enthält ein Beispiel für einen solchen Konverter. Es funktioniert im gleichen Sinne wie die OmniFaces SelectItemsConverter wie es aussieht durch die Kinder einer Komponente für
UISelectItem(s)
mit Objekten. Der Unterschied ist, dass es nur Griffe Bindungen entweder einfach-collections von entity-Objekte oder strings. Es behandelt nicht die item-Gruppen, Sammlungen vonSelectItem
s, arrays und wahrscheinlich eine Menge anderer Dinge.Den Entitäten, die die Komponente bindet, zu implementieren muss
IdObject
- Schnittstelle. (Dies könnte gelöst werden, in anderer Weise, wie mittoString
.)Beachten Sie, dass die Entitäten implementieren muss
equals
in der Weise, dass zwei Entitäten mit dem gleichen ID vergleicht gleich.Die einzige Sache, die Sie tun müssen, um es zu benutzen ist, geben Sie es als Konverter auf die Komponente auswählen, eine Bindung an eine Person-Eigenschaft und eine Liste der möglichen Einheiten:
Konverter:
InformationsquelleAutor Lii
Ich mache es so:
Modelle sind ViewScoped
Konverter:
binden und Komponente mit:
Wenn Sie die Person-id, anstatt hashCode kannst du eine Kollision, wenn Sie haben einige Listen auf einer Seite für verschiedene Entitäten (Klassen), die mit der gleichen id
InformationsquelleAutor
Rufen Sie mich faul, aber das Programmieren ein Konverter scheint wie eine Menge unnötige Arbeit. Ich bin mit Primefaces und, nicht genutzt haben ein plain-vanilla-JSF2 Listenfeld oder dropdown-Menü vor, ich bin einfach davon ausgegangen (faul), dass das widget könnte mit komplexen Objekte, d.h. übergeben Sie das ausgewählte Objekt, wie ist die entsprechende getter - /setter-wie so viele andere widgets zu tun. Ich war enttäuscht, (nach Stunden Kopf kratzen), dass diese Funktion existiert nicht für dieses widget-Typ ohne Konverter. In der Tat, wenn Sie ein setter für das komplexe Objekt, anstatt für einen String, es schlägt im hintergrund fehl (geht einfach nicht, rufen Sie die setter, keine Ausnahme, keine JS-Fehler), und ich verbrachte eine Menge Zeit geht durch BalusC ausgezeichnete tool für die Problembehandlung, die Ursache zu finden, ohne Erfolg, da keiner der Vorschläge angewendet. Mein Fazit: listbox/menu widget Bedürfnisse anpassen, die anderen JSF2 widgets nicht. Das scheint irreführend und anfällig für die führenden uninformiert Entwickler wie mich, die unten ein Kaninchenbau.
In der Ende-ich wehrte mich, Kodierung a-Wandler und fand durch Versuch und Irrtum, dass wenn Sie den widget-Wert, um ein Komplexes Objekt, z.B.:
... , wenn der Benutzer ein Element auswählt, das widget kann der Aufruf einer String setter für das Objekt, z.B.
setSelectedThing(String thingString) {...}
, und die Zeichenfolge übergeben, wird ein JSON-String, der das Ding-Objekt. Ich kann analysieren, um festzustellen, welches Objekt ausgewählt wurde. Diese fühlt sich ein wenig wie ein hack, aber weniger ein hack als ein Konverter.h:inputText
auch nicht, wenn Sie erstellt Ihre eigenen, stark typisierte Objekte statt mit einem string.Ich meine, dass andere widgets verarbeiten kann (passiert ab und setzen auf die backing-bean) komplexe Objekte während listbox/Menü nicht. Auf darüber nachzudenken, String ist in der Tat ein Komplexes Objekt, so würde man denken, dass diese widgets wäre in der Lage Umgang mit komplexen Objekt. Es scheint mir, dass
h:inputText
oder sogar mehr anspruchsvolle Geschwisterp:inputText
nur mit Strings, die durch Ihre Natur. listbox/menu scheint, wie es sollte in der Lage sein zu handhaben, jedes Objekt, obwohl Sie natürlich das Objekt kann nur dargestellt werden, indem Sie eine Zeichenfolge in der Benutzeroberfläche.h:inputText
undp:inputText
verarbeiten kann zahlen und mehr. Das ist, weil diese basieren auf der bekannten java-Typen und Konverter werden von jsf und implizit angewendet. Für jede andere Art, braucht es einen Konverter, also z.B. benutzerdefinierte stark typisierte GTIN dass ist effektiv eine Zahl (in dieser Implementierung verwenden Sie ein String). Und ja, die Konvertierung zu und von der 'client-side' String-Darstellung ist, was die Wandler kümmern...Was Sie codiert klingt wie ein serializer/deserializer, die am Ende wirkt wie ein Wandler (die vielleicht sogar anfällig für client-seitige manipulation). Ich vermute, dass Sie entweder codiert dies in der Person oder in der backing-bean (controller), beide sollten keine Kenntnis von dieser "Umwandlung Ding' zwischen client und server, also es klingt für mich eher wie ein hack. Vor allem, da Omnifaces hat Dinge wie showcase.omnifaces.org/converters/SelectItemsConverter. Und denken Sie daran, dass, wenn Sie über select-Menü operieren, die auf Listen von Zeichenfolgen, die Sie auch verwenden der built-in-Wandler.
Das ist eine ganz andere Perspektive, danke. Als Primefaces Benutzer erwartete ich diese widgets, um "einfach so" funktionieren wie die anderen widgets die ich verwendet habe. Ich wusste nicht, dass einige JSF-widgets haben einen eingebauten Wandler und einige nicht. Geht vorwärts, ich werde mich bezüglich der built-in-Wandler ein Komfort, der den Rahmen liefert für mich eher als ein erwartetes feature. Allerdings weiß ich nicht, dass die Bereitstellung der Konvertierung in die getter/setter wird wesentlich von der Bereitstellung von it in einer eigenen Klasse, und es scheint einfacher.
InformationsquelleAutor snakedog