2012-08-31 61 views
1

我想将复选框传递给后备CDI-Bean。 postTest.values只是一个Longs列表。h:selectBooleanCheckbox未将结果传递给映射

<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,因为我想在初始化之前将值传递给它(我尝试了侦听器,但他们似乎没有解决这个问题)。

谢谢!

+0

我怀疑你的问题是范围是两个短。请求范围仅计入页面呈现 - 您第一次访问该页面时。在表单提交(回发)时,将创建一个新的bean并且需要重新初始化这些值。尝试将范围扩大到更大的范围 - 比如Session。 –

回答

0

您还可以使用的MyFaces CODI @ViewAccessScoped注释,如果你不想@ConversationScopedstart()end()方法玩。它是一种CDI扩展,与JSF托管bean的@ViewScoped相当。我没有检查这个注释的实现,但我看到许多开发人员说它甚至比@ViewScoped注释更好。

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

+0

MyFaces CODI允许为您的CDI bean使用'@ ViewAccessScoped'和'@ ViewScoped'。 WIKI提到了这种差异。 –