Jsf 无法在我的托管bean的操作方法中检索的值

Jsf 无法在我的托管bean的操作方法中检索的值,jsf,Jsf,JSF视图代码: <f:view> <h:form> <h:panelGrid> <h:inputText id="key" value="#{myManagedBean.key}"/> <h:selectBooleanCheckbox id="rerun" value="#{myManagedBean.rerun}" rendered="#{myManagedBean.

JSF视图代码:

<f:view>
    <h:form>
        <h:panelGrid>
            <h:inputText id="key" value="#{myManagedBean.key}"/>
            <h:selectBooleanCheckbox id="rerun" value="#{myManagedBean.rerun}" rendered="#{myManagedBean.displayRerun}"/>
            <h:commandButton id="check" action="#{myManagedBean.check}"/>
        </h:panelGrid>
    </h:form>
<f:view>
无论复选框是否选中,都会打印false

关于我的要求的其他信息:


Nick/BalusC,我的托管bean属于请求范围。这确实是我介绍的简化代码片段。我的页面有两个用户输入控件和一个命令按钮。在提交命令按钮时,我调用backingbean的action方法,在这个方法中我进行数据验证,在本例中我查找数据库并查看输入是否已经注册。如果已经注册,我会返回到同一页面,此时我会显示singleBooleanCheckBox供用户选择并再次点击command按钮。 我根据managedbean属性和数据验证期间设置的布尔标志切换复选框的显示

当我选中复选框重新提交页面时,我不会收到此数据

为了进一步验证,我将selectBooleanCheckbox替换为一个具有类似行为的命令按钮,该按钮最初基本上不呈现它,而只是在数据验证时显示它。我将其@action映射到我的managedbean的action方法。令我惊讶的是,当我按下按钮时,动作方法没有被执行。相反,页面会像在即时场景或重定向中一样刷新

我为此奋斗了将近6个小时。感谢您经验丰富的见解

谢谢。

因此,您实际上在复选框上有一个呈现属性,而该属性在您的初始问题中不存在,并且bean是请求范围的,当它是会话范围时,它会工作。当此属性在该点计算为false时,在应用请求值阶段不会收集提交的复选框值


基本上,您还需要在后续请求中保留负责呈现属性的条件。这可以通过几种方式完成:将bean放入会话范围,使用Tomahawk的t:saveState或带有bean绑定的h:inpurthidden。每一个都在中进行了详细概述。

托管bean的范围是什么?您发布的代码非常好。问题出在别的地方。很可能您将代码片段过于简化了。请贴一张全票。第一个猜测:您在一个数据表中使用了它,并且模型没有被正确地保存@尼克:你能举个例子说明范围在这个特定问题中的重要性吗?尼克/巴卢斯克,我的托管bean是请求范围。关于我尝试过的东西的一些额外更新。巴卢斯克,谢谢你的快速回复。感谢您提供的链接。当我阅读您的评论时,指定了3个选项。我用的是战斧。从阅读中我的理解是,我需要补充哪些应该起作用。我还需要隐藏场吗?不,只要把它放在视野的某个地方就可以了。非常感谢。是的,它起作用了。谢谢你的帮助。巴卢斯克,我在这个方法上遇到了另一个问题。使用,当我点击新显示的按钮时,我可以将formdata提交给action方法。一切都很好。但当我点击刷新页面或显示原始页面的菜单链接时,仍然会显示DisplayReRun按钮。目前,我正在操作方法中切换displayReRun标志。但在上述情况下,不执行操作。重置标志的其他选项有哪些?谢谢使用过滤器禁用JSF页面的浏览器缓存。你可以在中找到一个例子。
public class MyManagedBean {

    private boolean displayRerun;


    public void setDisplayRerun(boolean aDisplayRerun) {
       this.displayRerun = aDisplayRerun        }

    public boolean getDisplayRerun() {
       return this.displayRerun;
    }

   private String key;


    public void setKey(String aKey) {
       this.key = aKey
    }

    public String getKey() {
       return this.key;
    }
    private boolean rerun;


    public void setRerun(boolean arerun) {
       this.rerun = arerun
    }

    public boolean getRerun() {
       return this.rerun;
    }

    public String check() {
        //do data validation
        setDisplayRerun(true);
        System.out.println(getRerun());
    }

}