【问题标题】:h:commandButton action method not called on request scoped beanh:commandButton 操作方法未在请求范围的 bean 上调用
【发布时间】:2013-01-30 21:00:26
【问题描述】:

我在 jsf 页面上有一个 h:commandButton。并且需要根据条件进行渲染。条件上的属性是页面的隐藏输入。指定渲染条件时不调用按钮上的动作方法。

有什么想法吗?

这里是示例代码:

<h:commandButton value="Button" 
action="#{bean.method}"
rendered="#{bean.conditon}"
type="submit"/>

<h:inputHidden value="#{bean.condition}" />

【问题讨论】:

    标签: jsf


    【解决方案1】:

    我知道您的 bean 是请求范围的,否则您不会遇到这个问题。这是一个时间问题。

    rendered 属性也在 JSF 生命周期的“应用请求值”阶段确定。但是,提交的值仅在 JSF 生命周期的“更新模型值”阶段(更晚)在模型中设置。因此,在评估rendered 属性时,它不会从隐藏的输入中获取提交的值,而是获取属性的默认值。

    如果无法将请求范围更改为view scope,那么您需要以不同的方式解决此问题。将&lt;h:inputHidden&gt; 更改为&lt;f:param&gt; 并通过@ManagedProperty#{param} 映射上注入值的最简单方法之一:

    <h:commandButton value="Button" 
        action="#{bean.method}"
        rendered="#{bean.conditon}"
    >
        <f:param name="condition" value="#{bean.condition}" />
    </h:commandButton>
    

    (注意我省略了type="submit",因为它已经是默认值了)

    @ManagedProperty("#{param.condition}")
    private boolean condition;
    

    另见:

    【讨论】:

    • 它似乎也不是这样工作的。我不知道我错过了什么。
    • 如果没有看到 SSCCE 或问题的详细描述(您在跟踪从 A 到 Z 的整个过程时自己得出的结论,但现在您正在像最终用户一样进行观察),就很难回答作为开发人员,所以这部分对您来说可能很难,因此 SSCCE 应该对我们双方都有帮助)。
    • 非常感谢。我让它工作。使用了@Value("#request.getParameter('condition')}"。我不确定@ManagedProperty("#{param.condition}") 做错了什么。
    • 显然您的 bean 不是由 JSF 的 @ManagedBean 管理的。 JSF 的@ManagedProperty 仅适用于由JSF 的@ManagedBean 管理的bean。除非另有明确说明,否则我们将始终假定您是通过 JSF 自己的注释来管理 bean。如果您正在使用例如CDI 的 @Named 或 Spring 的 @Controller,那么您应该明确提及,因为这些不是标准方式。
    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2013-06-26
    • 1970-01-01
    • 2013-01-21
    • 2011-11-11
    • 2013-07-18
    相关资源
    最近更新 更多