无法在托管bean的操作方法中检索<h:selectbooleancheckbox>的值</h:selectbooleancheckbox>

时间:2010-11-04 18:38:06

标签: jsf

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>

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());
    }

}

无论是否选中该复选框,都会始终打印false

  

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

Nick / BalusC,我的托管bean是请求范围。这确实是我提出的简化代码片段。我的页面有几个用户输入控件和一个命令按钮。在提交命令按钮时,我调用了支持bean的动作方法,我在其中进行数据验证(在这种情况下我查找数据库并查看输入是否已经注册。)如果已经注册,我会回到同一页面,这个是当我显示singleBooleanCheckBox供用户选择并再次点击命令按钮时。 我正在根据managedbean属性(在数据验证期间设置的布尔标志)切换复选框的显示。

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

为了进一步验证,我用一个具有类似行为的命令按钮替换了selectBooleanCheckbox(基本上不是最初渲染它,而是仅在数据验证时显示它)。我将其@action映射到我的managedbean的action方法。令我惊讶的是,当我点击按钮时,不执行操作方法。相反,页面会像“立即”方案或重定向一样刷新。

我在这方面已经挣扎了近6个小时。欣赏您经验丰富的见解。

感谢。

1 个答案:

答案 0 :(得分:1)

所以,你实际上在复选框上有一个rendered属性(在你的初始问题中没有),而bean是请求作用域的(当它是会话作用域时它会起作用)。当此属性在此时评估false时,将不会在应用请求值阶段期间收集提交的复选框值。

您基本上还需要在后续请求中保留对呈现属性负责的条件。这可以通过以下几种方式完成:将bean放入会话范围,使用Tomahawk的t:saveStateh:inputHidden使用bean binding。每个都在this answer中详细列出。