我有以下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如何将它们发送到我的组件的正确方法.
任何帮助表示赞赏!
解决方法
使#{list.choose}成为由当前迭代类别标识的数组,集合或映射.地图< 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>