【问题标题】:Input value not processed in request scoped bean when using conditional rendering使用条件渲染时,请求范围 bean 中未处理输入值
【发布时间】:2012-01-19 16:51:36
【问题描述】:

我知道这类问题已经在这里被问过百万次了,但我在相关帖子中找不到我的问题的解决方案。

JSF 1.2

我有一个请求范围的 bean,其方法用作 valueChangeListener:

class DoStuff{
    ...
    public void step1ChkStuffIncluded_CheckedChanged(ValueChangeEvent event){
        StuffDocument cd = (StuffDocument)getInfo("StuffDocument");
        if(cd == null){
            Logger.Error("DoStuff", "step1ChkStuffIncluded_CheckedChanged", "No stuff document (null)");
            return;
        }

        if (step1ChkStuffIncludedChecked){
            cd.handleChecked();
        }
        else{
            cd.handleUnchecked();
        }
    }
    ...
}

通过selectBooleanCheckbox组件如下(.jspx):

    ...
    </h:panelGroup> 
    <h:panelGroup rendered="#{DoStuff.pnlStep1}">
        <p>
        <label for="step1ChkStuffIncluded">#{DoStuff.step1ChkStuffIncludedText}</label>

        <h:selectBooleanCheckbox
            id="step1ChkStuffIncluded"
            onchange="submit();"
            value="#{DoStuff.step1ChkStuffIncludedChecked}"
            valueChangeListener="#{DoStuff.step1ChkStuffIncluded_CheckedChanged}">
        </h:selectBooleanCheckbox></p>
    </h:panelGroup>
    <div id="someDiv">
    ...

在哪里

xmlns:h="http://java.sun.com/jsf/html"

只要 bean 的范围是会话,复选框的设置器和侦听器都会执行,但不在请求范围内。不幸的是,我找不到除此之外的任何线索。

非常感谢任何建议。欢迎要求进一步澄清。

【问题讨论】:

    标签: jsf jsf-1.2 conditional-rendering


    【解决方案1】:

    您在父组件上有一个rendered="#{DoStuff.pnlStep1}"。在处理表单提交期间,JSF 将作为攻击防护的一部分确定输入组件(及其所有父组件)是否根据服务器端条件呈现。如果它没有被渲染,那么它会在处理过程中被完全跳过。

    它在会话范围的 bean 中工作但在请求范围的 bean 中失败表明 rendered="#{DoStuff.pnlStep1}" 后面的值是根据在显示表单的请求期间存在但不存在的一些基于请求的变量/条件确定的在处理表单提交的请求期间。

    要解决此问题,您需要确保在处理表单提交的请求期间为 rendered="#{DoStuff.pnlStep1}" 后面的值保留完全相同的变量/条件。有几种方法可以实现这一点,具体取决于条件的性质和您提交表单的方式。其中一种方法是通过&lt;f:param&gt; 或&lt;h:inputHidden&gt; 将基于请求的变量/条件作为请求参数传回。

    规范的 JSF 2.0 修复方法是将 bean 置于 JSF 1.2 中不可用的视图范围内,但可以使用 Tomahawk 的 &lt;t:saveState&gt; 组件进行模拟。

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-11
      • 2017-09-06
      • 1970-01-01
      • 2013-01-21
      • 2013-08-26
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      相关资源
      最近更新 更多