【问题标题】:Unable to retrieve the value of <h:selectBooleanCheckbox> inside my managed bean's action method无法在我的托管 bean 的操作方法中检索 <h:selectBooleanCheckbox> 的值
【发布时间】:2010-11-04 18:38:05
【问题描述】:

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 属于请求范围。我提供的确实是简化的代码 sn-p。我的页面有几个用户输入控件以及一个命令按钮。在提交命令按钮时,我调用支持 bean 的操作方法,在其中我进行数据验证(在这种情况下,我查找数据库并查看输入是否已经注册。)如果已经注册,我回到同一页面,这个当我显示 singleBooleanCheckBox 供用户选择并再次点击命令按钮时。 我正在根据 managedbean 属性(在数据验证期间设置的布尔标志)切换复选框的显示。

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

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

我已经为此苦苦挣扎了将近 6 个小时。感谢您的经验丰富的见解。

谢谢。

【问题讨论】:

  • 托管bean的范围是什么?
  • 到目前为止您发布的代码非常好。问题出在其他地方。可能您将代码 sn-p 过分简化了。请发布一个完整的SSCCE。第一个猜测:您在数据表中使用它并且模型没有正确保存。 @Nick:你能举例说明范围在这个特定问题中的重要性吗?
  • Nick/BalusC,我的托管 bean 是请求范围。我尝试过的一些其他更新。

标签: jsf


【解决方案1】:

所以,您实际上在复选框上有一个rendered 属性(在您的初始问题中不存在),并且 bean 是请求范围的(当它是会话范围时它会起作用)。提交的复选框值不会在应用请求值阶段收集,此时此属性评估 false

您基本上还需要在后续请求中保留负责渲染属性的条件。这可以通过多种方式完成:将 bean 放入会话范围,使用 Tomahawk 的 t:saveStateh:inputHidden 和 bean binding。每个都在this answer 中进行了详细概述。

【讨论】:

  • Balusc,感谢您的快速回复。感谢您提供的链接。当我阅读您的评论时,指定了 3 个选项。我正在使用战斧。从阅读中我的理解是我需要添加 这应该可以解决问题。我还需要隐藏字段吗?
  • 不,只需将&lt;t:saveState value="#{myManagedBean.displayRerun}" /&gt; 放在视图中的某个位置就可以了。
  • 非常感谢您。是的,它奏效了。感谢您所做的所有帮助。
  • BaluSc,我遇到了这种方法的另一个问题。使用 ,当我点击新显示的按钮时,我可以将表单数据提交给操作方法。(为了更加用户友好,我将设计更改为使用命令按钮而不是复选框)。一切皆好。但是当我点击刷新页面或显示原始页面的菜单链接时,我仍然会显示“DisplayReRun”按钮。目前,我正在我的操作方法中切换 displayReRun 标志。但上述情况是当,动作没有被执行。重置标志的其他选择是什么?谢谢!!
  • 使用 Filter 禁用 JSF 页面的浏览器缓存。您可以在this answer 中找到示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多