我想将复选框传递给支持CDIBean。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正确初始化,因为我想在初始化之前将值传递给它(我尝试了侦听器,但它们似乎无法解决这个问题)。
谢谢!
Tim
如果您不想使用@ConversationScoped
以及start()
和end()
方法,也可以使用Myfaces CODI @ViewAccessScoped
注释。它是一个CDI扩展,相当于JSF托管bean的@ViewScoped
。我没有检查这个注释的实现,但我看到许多开发人员说它甚至比@ViewScoped
注释更好。
只需下载Myfaces CODI并将其放入类路径中,然后使用注释即可。