Primefaces - commandButton不起作用

时间:2013-11-02 00:41:32

标签: jsf primefaces

我遇到了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>

非常感谢你 安德烈

3 个答案:

答案 0 :(得分:32)

发生了什么事?

你得到的是正确的行为。在PrimeFaces按钮中, type =“button”与基本HTML一样 - 它不会引起任何请求。正如PrimeFaces user's guide所说:

  

按钮用于执行自定义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

希望有所帮助。

答案 1 :(得分:13)

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

答案 2 :(得分:-3)

请检查您与bean的绑定。

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