Wie benutzt man in oder um mehrere Objekte auszuwählen?

Ich habe eine Facelets-Seite mit einem . In jeder Zeile gibt es eine . Wenn das Kontrollkästchen aktiviert ist, sollte das Objekt hinter der entsprechenden Zeile in der Bean festgelegt werden.

  1. Wie mache ich das?
  2. Wie erhalten Sie die ausgewählten Zeilen oder ihre Daten in einer Backing-Bean?
  3. Oder wäre es besser, es mit ?

    Am besten binden Sie den Wert h:selectBooleanCheckbox mit einer Eigenschaft Map wobei RowId den Typ des Zeilenbezeichners darstellt. Lassen Sie uns ein Beispiel nehmen, dass Sie ein Item Objekt haben, dessen Identifier-Eigenschaft id ein Long id ist:

         ...   

    welches in Kombination mit verwendet werden soll:

     public class Item { private Long id; // ... } 

    und

     public class Bean { private Map checked = new HashMap(); private List items; public void submit() { List checkedItems = checked.entrySet().stream() .filter(Entry::getKey) .map(Entry::getValue) .collect(Collectors.toList()); checked.clear(); // If necessary. // Now do your thing with checkedItems. } // ... } 

    Sie sehen, die Karte wird automatisch mit der id aller Tabellenelemente als Schlüssel gefüllt, und der Wert des Kontrollkästchens wird automatisch als Kartenwert festgelegt, der mit der Element- id als Schlüssel verknüpft ist.

    Im folgenden Beispiel verwende ich Kontrollkästchen, um zwei oder mehr Produkte auszuwählen, damit der Benutzer Produktspezifikationen auf einer neuen Webseite mit JSF 2.0 vergleichen kann.

    Es hat eine Weile gedauert, bis ich das folgende Problem fand (offensichtlich jetzt natürlich). Ich denke, es ist erwähnenswert für diejenigen, die Paginierung mit dem obigen Code von BalusC verwenden wollen (nette Antwort BalusC, viel einfacher, als ich es je erwartet hätte).

    Wenn Sie Paginierung verwenden, erhalten Sie Nullpotentiale in der Zeile:

    if (checked.get (item.getId ()))

    – in BalusCs Code oben.

    Dies liegt daran, dass der Karte nur angezeigte Kontrollkästchen hinzugefügt werden (doh; Schlagstirn). Bei Produkten, deren Kontrollkästchen aufgrund von Paginierung nie angezeigt werden, führt diese Zeile zu einem Nullzeigererrors, und es muss eine Überprüfung hinzugefügt werden, um diese Nullzeiger zu ignorieren (vorausgesetzt, dass alle Kontrollkästchen beim Laden der Seite deaktiviert sind). Damit der Benutzer ein Kontrollkästchen ankreuzen kann, muss er die Paginierungsseite anzeigen, damit danach alles gut funktioniert.

    Wenn einige oder alle Checkboxen beim Laden der ersten Seite angekreuzt werden müssen, hilft Ihnen das nicht weiter … Sie müssen diese manuell zur Karte hinzufügen, damit sie beim Laden der Seite korrekt angezeigt werden .

    Hinweis: Da ich ein JPA-Objekt ‘Entitätsklasse aus database’ verwende, musste ich auch @Transient für die ID in meiner ProductTbl-Entitätsklasse verwenden, da alle Variablen standardmäßig von JPA als Spalten in der database betrachtet werden, sofern sie nicht mit @Transient vorangestellt sind . Auch benutze ich einen zweiten Link, um die Kontrollkästchen zurückzusetzen, die clearSelections () aufruft, und mein “submit” ist ein Link, der compareSelectedProducts () aufruft, anstatt eine Submit-Schaltfläche.

    Der vollständige Code lautet wie folgt:

    In der aus der database abgeleiteten Entity-class ‘ProductTbl’:

     @Transient private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } 

    In der Backing-Bean ‘ProductSelection’:

     private Map checked = new HashMap(); private String errorMessage = ""; // List of all products. private List products; // List of products to compare. private List compareProducts; // Setters and getters for above... public String compareSelectedProducts() { // Reset selected products store. compareProducts = new ArrayList(); for (ProductTbl item: products) { // If there is a checkbox mapping for the current product then... if(checked.get(item.getId()) != null) { // If checkbox is ticked then... if (checked.get(item.getId())) { // Add product to list of products to be compared. compareProducts.add(item); } } } if(compareProducts.isEmpty()) { // Error message that is displayed in the 'ErrorPage.xhtml' file. errorMessage = "No Products selected to compare specifications. Select two or more products by ticking the check box in the second column 'Cmpr'"; return "process_ErrorPage"; } // Rest of code to get product specification data ready to be displayed. return "process_CompareSelected"; } public String clearSelections() { // Untick all checkbox selections. checked.clear(); return "process_MainSearchResult"; } 

    Auf der JSF-Webseite ‘MainSearchResult.xhtml’:

            

    In der Datei ‘faces-config.xml’:

       process_MainSearchResult /MainSearchResult.xhtml     process_CompareSelected /CompareSelected.xhtml     process_ErrorPage /ErrorPage.xhtml   

    Eine Möglichkeit, einen Parameter über zu senden, ist das Senden über den Titel der Checkbox. Im ValueChangeListener können Sie es mit getAttributes().get("title") aus der Komponente getAttributes().get("title") . Dies hilft in Fällen, in denen Sie einen ID-Wert als Parameter senden möchten (im Gegensatz zum ausgewählten Zeilenindex).