Como usar em ou para selecionar vários itens?

Eu tenho uma página Facelets com um . Em cada linha existe uma . Se a checkbox de seleção estiver selecionada, o object atrás da linha correspondente deve ser definido no bean.

  1. Como eu faço isso?
  2. Como obter as linhas selecionadas ou seus dados em um bean de apoio?
  3. Ou seria melhor fazê-lo com ?

   

    Sua melhor aposta é ligar o valor de h:selectBooleanCheckbox com uma propriedade Map onde RowId representa o tipo do identificador de linha. Vamos dar um exemplo de que você tem um object Item cujo id propriedade do id é Long :

         ...   

    que deve ser usado em combinação com:

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

    e

     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. } // ... } 

    Você vê, o mapa é preenchido automaticamente com o id de todos os itens da tabela como chave e o valor da checkbox de seleção é automaticamente definido como valor do mapa associado ao id do item como chave.

    No exemplo a seguir, estou usando checkboxs de seleção para selecionar dois ou mais produtos para permitir que o usuário compare as especificações do produto em uma nova página da Web usando o JSF 2.0.

    Levei um bom tempo para encontrar o seguinte problema (totalmente óbvio agora, é claro), então acho que vale a pena mencionar para aqueles que tentam usar paginação com o código do BalusC acima (boa resposta do BalusC, muito mais simples do que eu imaginava que seria).

    Se você estiver usando paginação, você receberá nulo na linha:

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

    no código do BalusC acima.

    Isso ocorre porque somente as checkboxs de seleção exibidas são adicionadas ao Mapa (doh; tapa na testa). Para os produtos cujas checkboxs de seleção nunca são exibidas, devido à paginação, essa linha resultará em um erro de ponteiro nulo e uma verificação precisará ser incluída para ignorar esses pointers nulos (supondo que todas as checkboxs de seleção estejam desmarcadas no carregamento da página). Para que o usuário marque uma checkbox de seleção, eles precisam exibir a página de paginação para que tudo funcione bem depois dela.

    Se algumas ou todas as checkboxs de seleção tiverem que ser marcadas no carregamento da primeira página, isso não será de nenhuma ajuda … você terá que adicioná-las manualmente ao Mapa para que elas sejam exibidas corretamente no carregamento da página. .

    Nota: como estou usando um object JPA ‘Entity class from database’, também precisei usar @Transient para o id em minha Classe de Entidade ProductTbl, pois todas as variables ​​são consideradas colunas no database por JPA, por padrão, a menos que seja prefixado com @Transient . Também estou usando um segundo link para redefinir as checkboxs de seleção, que chama clearSelections (), e meu ‘submit’ é um link chamando compareSelectedProducts () em vez de um botão Enviar.

    O código completo é o seguinte:

    Na class de entidade ‘ProductTbl’ derivada do database:

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

    No bean de apoio ‘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"; } 

    Na página da Web do JSF, ‘MainSearchResult.xhtml’:

            

    No arquivo ‘faces-config.xml’:

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

    Uma maneira de enviar um parâmetro via é enviá-lo por meio do título da checkbox de seleção. No ValueChangeListener , você pode obtê-lo do componente usando um getAttributes().get("title") . Isso ajuda nos casos em que você deseja enviar um valor de id como um parâmetro (em oposição ao índice de linha selecionado).