【问题标题】:h:selectBooleanCheckbox is not passing the result to a Maph:selectBooleanCheckbox 没有将结果传递给 Map
【发布时间】:2012-08-31 09:00:45
【问题描述】:

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

<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>

action 方法应该打印出检查的值。但它只是空的。

@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 在 form 传递值时未初始化这一点有关。因为如果我在构造函数(或 @PostConstruct)中初始化 postTest.values,则检查的项目将正确传递。

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

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

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

谢谢!

提姆

【问题讨论】:

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

标签: jsf cdi


【解决方案1】:

如果您不想使用 @ConversationScoped 以及 start() 和 end() 方法,也可以使用 Myfaces CODI @ViewAccessScoped 注释。它是一种 CDI 扩展,相当于 JSF 托管 bean 的 @ViewScoped。我没有检查这个注解的实现,但是我看到很多开发者说它甚至比@ViewScoped注解更好。

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

【讨论】:

  • MyFaces CODI 允许将 @ViewAccessScoped 和 @ViewScoped 用于您的 CDI bean。不同之处在 WIKI 中有所提及。
猜你喜欢
  • 1970-01-01
  • 2016-04-27
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多