2

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

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

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

4

1 回答 1

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>组件进行模拟。

也可以看看:

于 2011-12-13T20:31:07.257 回答