Seam和JSF:如何发布多个值而不是单个值

时间:2010-12-23 10:06:15

标签: jsf seam facelets

我们有这个ui:重复:

<ui:repeat value="#{notAssigned}" var="pair">
   #{pair.data.processName}<br/>
   <s:button value="assign" action="#{mypage.assign}">
        <f:param name="taskId" value="#{pair.task.id}"/>
   </s:button>
</ui:repeat>

现在我可以分配一个和一个元素但按下分配按钮。但我想重构一下并添加一个复选框,以便您可以选择要分配的所有内容,然后按一个将分配所有内容的按钮。

如何修改此代码以支持包含checkbox(长整数)和一个要提交的按钮的taskId

更新

我尝试更改代码以使用<h:selectManyCheckbox>

<h:selectManyCheckbox value="#{mypage.notAssignedTaskIds}">
    <f:selectItem itemValue="#{pair.task.id}" itemLabel="#{messages['choose']}" />
</h:selectManyCheckbox>
#{pair.data.processName}


<h:commandButton action="#{mypage.test}" value="Assign"/>

在我的豆子里:

@Setter @Getter
List<String> notAssignedTaskIds = new ArrayList<String>();

public void test() {
    log.info("Inside test, size of list #0", notAssignedTaskIds.size());
    for(String id : notAssignedTaskIds) {
        log.info("TaskId's chosen #0", id);
    }
}

但notAssignedTaskids总是空的

3 个答案:

答案 0 :(得分:1)

我的建议是,在pair对象中创建一个布尔标志。然后

<a:region>

    <ui:repeat value="#{notAssigned}" var="pair">
        <h:selectBooleanCheckbox value="#{pair.booleanFlag}">

        #{pair.data.processName}
    </ui:repeat>

    <a:commandLink action="#{yourBean.assignAll()}" value="assignAll">
    </a:commandLink>

</a:region>

在你的bean中,遍历notAssigned列表。

public void assignAll() {
.
.
.
    for (Pair pair : notAssigned) {
        if (pair.booleanFlag) {
            mypage.assign(pair);
        }
    }


}

修改你的assign方法以获得一个对象。顺便说一句,你可以在没有ajax支持的情况下完成它。只需删除 区域并将a:commandLink转换为h:commandLink。

答案 1 :(得分:1)

如果您不想更改模型,请在您的bean中添加Map<Long, Boolean>

private Map<Long, Boolean> selectedIds = new HashMap<Long, Boolean>();

将任务ID作为密钥绑定到<h:selectBooleanCheckbox>值。

<ui:repeat value="#{bean.notAssigned}" var="pair">
    <h:selectBooleanCheckbok value="#{bean.selectedIds[pair.task.id]}" />
    #{pair.data.processName}
</ui:repeat>
<s:button value="assign" action="#{bean.assign}" />

assign()方法收集选定的值。

List<Pair> selectedPairs = new ArrayList<Pair>();
for (Pair pair : notAssigned) {
    if (selectedIds.get(pair.getTask().getId())) {
        selectedPairs.add(pair);
    }
}    

答案 2 :(得分:0)

我估计你想要一个h:selectManyCheckbox元素。查看文档here