Сопоставить несколько представленных значений динамической формы с одним свойством компонента
У меня есть следующая форма 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()
, То, что я пытаюсь добиться - это иметь list.choose()
быть вызванным для каждой радиогруппы. Я не уверен, возможно ли это с JSF. Существует отдельный метод для каждого selectOneRadio
или же selectOneMenu
группа.
Поскольку у меня есть неизвестное количество категорий, я не могу / не хочу определять метод для каждого возможного выбора.
Когда я отправляю форму, все мои варианты отправляются в POST, я просто не знаю, как правильно указать Seam, как отправить их в мой компонент.
Любая помощь приветствуется!
1 ответ
Делать #{list.choose}
массив, коллекция или карта, которая идентифицируется текущей итерированной категорией. Map<String, String>
где ключ представляет категорию, а значение представляет выбранный вариант, вероятно, самый простой.
Вот MCVE, который работает прямо здесь.
package com.stackru.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>