Сопоставить несколько представленных значений динамической формы с одним свойством компонента - PullRequest
2 голосов
/ 22 марта 2010

У меня есть следующая форма JSF:

<h:form>
    <ui:repeat value="#{list.categories}" var="cat">
        <h:selectOneRadio id="sel1Rad" value="#{list.choose}" layout="pageDirection">
            <f:selectItems value="#{list.names}"/>
        </h:selectOneRadio> 
    </ui:repeat>
    <h:commandButton id="submit" action="#{list.submit}" value="Submit"/>
</h:form>

И компонент с именем list. Переменная cat вводится в компонент, используемый методом list.getNames(). То, что я пытаюсь добиться, - это вызвать 1007 * для каждой радиогруппы. Я не уверен, возможно ли это с JSF. Для каждой группы selectOneRadio или selectOneMenu существует отдельный отдельный метод.

Поскольку у меня есть неизвестное количество категорий, я не могу / не хочу определять метод для каждого возможного выбора.

Когда я отправляю форму, все мои варианты отправляются в POST, я просто не знаю, как правильно указать Seam, как отправить их в мой компонент.

Любая помощь приветствуется!

1 Ответ

3 голосов
/ 22 марта 2010

Сделать #{list.choose} массивом, коллекцией или картой, которая идентифицируется текущей итерированной категорией. Map<String, String>, где ключ представляет категорию, а значение представляет выбранную опцию, вероятно, самый простой.

Вот MCVE , который работает прямо здесь.

package com.stackoverflow.q2493671;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.enterprise.context.RequestScoped;
import javax.faces.model.SelectItem;
import javax.inject.Named;

@Named
@RequestScoped
public class Bean {

    private List<String> categories;
    private List<String> selectItems;
    private Map<String, String> selectedItemsByCategory = new HashMap<>();

    @PostConstruct
    public void init() {
        categories = Arrays.asList("cat1", "cat2", "cat3");
        selectItems = Arrays.asList("item1", "item2", "item3");
    }

    public void submit() {
        for (Entry<String, String> entry : selectedItemsByCategory.entrySet()) {
            String category = entry.getKey();
            String selectedItem = entry.getValue();
            System.out.println(category + "=" + selectedItem);
        }
    }

    public List<String> getCategories() {
        return categories;
    }

    public List<String> getSelectItems() {
        return selectItems;
    }

    public Map<String, String> getSelectedItemsByCategory() {
        return selectedItemsByCategory;
    }

}

в сочетании с

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
>
    <h:head>
        <title>SO question 2493671</title>
    </h:head>
    <h:body>
        <h:form>
            <ui:repeat value="#{bean.categories}" var="category">
                <h:selectOneRadio value="#{bean.selectedItemsByCategory[category]}" layout="pageDirection">
                    <f:selectItems value="#{bean.selectItems}" />
                </h:selectOneRadio>
            </ui:repeat>
            <h:commandButton value="submit" action="#{bean.submit}" />
        </h:form>
    </h:body>
</html>
...