使用条件呈现时,请求范围bean中未处理的输入值

时间:2011-12-13 20:17:23

标签: jsf jsf-1.2 conditional-rendering

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

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的范围是session时,都会执行setter和复选框的监听器,但不会在请求范围内执行。不幸的是,我无法找到除此之外的任何线索。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

规范的JSF 2.0修复方法是将bean放在JSF 1.2中不可用的视图范围中,但可以使用Tomahawk的<t:saveState>组件进行模拟。

另见: