h:selectBooleanCheckbox没有将结果传递给Map

时间:2012-08-31 09:00:46

标签: jsf cdi

我想将复选框传递给支持CDI-Bean。 postTest.values 只是一个Longs列表。

<h:form>
    <h:dataTable value="#{postTest.values}" var="val">
        <h:column>
            <h:outputLabel value="#{val}"/>
        </h:column>
        <h:column>
            <h:selectBooleanCheckbox value="#{postTest.checked[val]}"/>
        </h:column>
    </h:dataTable>
    <h:commandButton action="#{postTest.process}"/>
</h:form>

操作方法应打印出选中的值。但它只是空洞。

@Named
@RequestScoped
public class PostTest {

    List<Long> values;
    Map<Long, Boolean> checked;

    ... 
    public String process() {
        logger.info(this.toString() + "Processing");
        for (Long l : checked.keySet()) {
            logger.info(this.toString() + "\t" + l + ". checked: " + checked.get(l));
        }

        return "index2";
    }
    ...
}

当我将记录添加到 getChecked()方法时,我可以看到,每列只检索一次,其内容根本不会更改。

问题似乎与表单传递值时 postTest.values 未初始化有关。因为如果我在构造函数(或@PostConstruct)中初始化 postTest.values ,则会正确传递选中的项目。

为什么在POST请求执行后我需要初始化 postTest.values

有没有办法防止这种情况?

或者我还有其他选择吗?例如。确保 postTest.values 未正确初始化而不使用构造函数或@PostConstruct,因为我想在初始化之前将值传递给它(我尝试了侦听器,但它们似乎没有解决这个问题) )。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您不想使用@ViewAccessScoped以及@ConversationScopedstart()方法,也可以使用Myfaces CODI end()注释。它是一个CDI扩展,相当于JSF托管bean的@ViewScoped。我没有检查这个注释的实现,但我看到许多开发人员告诉它它比@ViewScoped注释更好。

只需下载Myfaces CODI并将其放入类路径中并使用注释。