【问题标题】:Why my action listener isn't called为什么我的动作监听器没有被调用
【发布时间】:2012-11-07 07:35:46
【问题描述】:

我有一个 PrimeFaces 对话框,我在其中询问用户详细信息。我将其简化为只有一个输入文本,如下所示。

<p:dialog>
        <h:form  prependId="false">
            <p:growl showDetail="false" autoUpdate="true"  life="4000"/>
            <p:panelGrid columns="2">
                <h:outputText value="First Name" />
                <p:inputTextarea  required="true" requiredMessage="First Name is required!" />
                <p:commandButton value="Add" actionListener="#{myBean.addUser}"/>
            </p:panelGrid>
        </h:form>
</p:dialog>

我注意到当我不输入我的名字时,我的动作监听器没有被调用,我认为这是正常的,因为 required="true" 验证已经发生。

有没有办法配置这个,我的动作监听器仍然会被调用? 还是我必须删除 required="true" 检查并将所有验证放在我的动作侦听器方法中?

【问题讨论】:

  • 所以基本上你在问是否有可能“配置”required="true" 表现得像required="false"?

标签: java jsf-2 primefaces


【解决方案1】:

您不应将验证逻辑放入操作方法中。

如果您需要进行比所需检查更多的验证,请为此使用自定义验证器。 action 方法应该简单地添加用户并且应该依赖于 jsf 验证阶段。

更多信息请参见this link on the different validation options。

【讨论】:

    【解决方案2】:

    如果您想调用 actionListener 方法而不管 &lt;p:inputTextarea/&gt; 的值如何,只需删除 required="true" 并在您的操作方法中进行验证:

       public void addUser() {
    
           if(StringUtils.isBlank(user.firstName)) {
               FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error! ",
                    "First Name is required!"));
               return;
           }
       }
    

    isBlank from import org.apache.commons.lang3.StringUtils;

    无关的:

    在我看来,这种方法似乎是个坏主意。

    【讨论】:

    • action 方法是一个不好的地方进行验证。在这个阶段,模型值已经更新,并且将它们重置为之前/初始值是一件麻烦事(如果您在 JSF 流程验证阶段进行验证,则可以避免这种情况)。
    • 你是绝对正确的,我从不在我的操作方法中放置验证。您的评论完全掩盖了我的回答中的“坏主意”一词,感谢您的澄清!
    • 从未想过好的做法...我将开始阅读验证部分。现在,我所有的验证都是在动作监听器方法中完成的。感谢您的领导...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 2019-06-06
    相关资源
    最近更新 更多