【问题标题】:When is a f:param actually sent?何时实际发送 f:param?
【发布时间】:2011-11-22 12:21:15
【问题描述】:

我有以下h:commandButton

<h:commandButton action="#{myBean.myAction}" value="Send">
    <f:param name="myFlag" value="true" />
</h:commandButton>

我想访问myFlag insinde a Validator,它与f:validator 连接到另一个元素。

不幸的是,当我想通过FacesContext检索参数时,我只返回了null

是不是只有在所有验证器都被调用后才发送参数?

【问题讨论】:

    标签: jsf parameters jsf-1.2


    【解决方案1】:

    &lt;h:commandButton&gt; 中的 &lt;f:param&gt; 仅从 JSF 2.0 起受支持,但您使用的是 JSF 1.2。然后,&lt;f:param&gt; 仅在 &lt;h:commandLink&gt; 中受支持。

    <h:commandLink action="#{myBean.myAction}" value="Send">
        <f:param name="myFlag" value="true" />
    </h:commandLink>
    

    还有其他选择,例如 &lt;h:inputHidden&gt;&lt;f:setPropertyActionListener&gt;&lt;f:attribute&gt; 或者在这种情况下可能只是简单的 &lt;input type="hidden"&gt; (隐藏的输入组件和动作侦听器只会在更新模型值期间设置它们的值比验证阶段晚;属性标签最好设置在调用验证器的组件上)。由于功能要求不明确,因此无法提出最佳替代方案。


    更新 根据 cmets,显然您只需要知道特定按钮是否被按下;在这种情况下,只需给它和父窗体一个固定的 ID

    <h:form id="form">
        <h:commandButton id="send" ...>
    

    这样它将有一个固定的请求参数名称form:send,您可以在验证器中检查它:

    if (externalContext.getRequestParameterMap().containsKey("form:send")) {
        // Send button is pressed.
    }
    

    您也可以在required 验证器中检查,如下所示:

    <h:inputText ... required="#{not empty param['form:send']}" />
    

    另见:

    【讨论】:

    • 好的,谢谢您的提示。但是当我使用其中一种替代方法时,在调用验证器时我是否已经有了参数的值?
    • &lt;input type="hidden"&gt; 很可能是您的最佳选择。
    • 但我需要一个仅在调用h:commandButton 时设置的值。它应该已经存在于验证阶段。正如您所写的那样,隐藏的input 无法做到这一点。有没有办法做到这一点?
    • 啊哈,在这种特殊情况下,只需通过检查其参数名称来检查按钮是否被按下。我会更新答案。
    • 嗯嗯。作为替代方案,您可以考虑使用 h:commandLink 并添加一些 CSS 使其看起来像一个按钮。或者您可以在点击时使用 JavaScript 来设置隐藏的输入字段值。
    猜你喜欢
    • 2012-01-03
    • 2014-07-20
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多