16

我遇到了 commandButton 的问题,它仅在提交类型时才起作用。有人可以看看并让我知道是否有解决方案吗?下面的代码非常简单,并且确实有说明我需要什么的建议。方法 test() 未执行。方法 runSubmit 执行成功。

我需要在没有提交的情况下执行测试方法,因为原始页面确实具有在提交期间执行的验证,test() 方法必须在没有提交的情况下执行,因为它是提交之前的初步操作。

我正在使用 PrimeFaces 4.0、JDK 7、Tomcat 6 和 JSF 2.0 (Apache),但我认为它也在 Mojarra 中发生。

    SESSION:

package com.andre.bean;

public class AndreBean {

public void runSubmit() {
System.out.println("Submit executed");
}

public String test() {
System.out.println("Not submit executed");
return "true";
}

}

XHTML

<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:p="http://primefaces.org/ui">

<h:head> 
</h:head>

<h:form id="test">
<p:commandButton id="ns" value="not submit" type="button" action="#{andreBean.test}" ajax="false"></p:commandButton>
<p:commandButton id="s" value="submit" action="#{andreBean.runSubmit}"></p:commandButton>

</h:form> 

</html>

非常感谢安德烈

4

3 回答 3

36

这是怎么回事?

你得到的是正确的行为。在带有type="button"的PrimeFaces 按钮中,其工作方式与在基本 HTML 中一样 - 它不会引起任何请求。正如PrimeFaces 用户指南所说:

按钮用于执行自定义 javascript而不会导致 ajax/non-ajax 请求。创建一个按钮集类型为“按钮”。

<p:commandButton type="button" value="Alert" onclick="alert('Prime')" />

如果你想与 bean “交谈”,你需要使用type="submit"(这是 p:commandButton 中的默认值)。但是...与 HTML 中的提交按钮行为相反,在 PrimeFaces 中,此类提交不会强制重定向到新页面,但所有通信都将由底层 AJAX 请求处理。

因此,只有您的第二个按钮将执行 bean 的方法:

<p:commandButton id="s" value="submit" action="#{andreBean.runSubmit}" />

你可能想得到什么?

如果您不想将所有表单发送到 bean,您可以限制使用 p:commandButton 的“process”属性处理的组件的范围:

<h:form id="test">
    <p:inputText value="#{andreBean.value}"/>
    <p:commandButton id="s" value="submit" action="#{andreBean.runSubmit}" process="@this" />
</h:form>

使用以下 bean,您将看到不同之处:

public class AndreBean {

    private String value;

    public void runSubmit() {
        System.out.println("Submit executed");
    }

    public String getValue() {
        System.out.println("getValue");
        return value;
    }

    public void setValue(String value) {
        System.out.println("setValue: " + value);
        this.value = value;
    }

}

如果您不限制控制台中执行的组件,您将获得:

getValue

setValue: foobar

Submit executed

...并且组件仅限于process="@this"你只得到:

Submit executed

希望有帮助。

于 2013-11-03T22:32:27.620 回答
14

有时,解决方案只是简单地添加immediate="true",它改变了 JSF 生命周期中触发 bean 动作的点。

于 2014-09-01T11:16:20.257 回答
-4

请检查您与 bean 的绑定。

bean 字段应该是字符串或非原始的。

于 2015-02-06T10:18:02.823 回答