【问题标题】:Primefaces - commandButton does not workPrimefaces - commandButton 不起作用
【发布时间】:2013-11-02 00:41:31
【问题描述】:

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

非常感谢 安德烈

【问题讨论】:

  • 尝试使用 actionListener="#{andreBean.test()}" process="@this :test" ..
  • 感谢您的回复,刚刚试了,还是不行,结果和以前一样。但是,在测试方法中使用括号时出现解析错误,仅适用于“andreBean.test”。我读到了一些与 EL 相关的限制,我需要在这个项目中使用 Tomcat 版本 6,因此可用的 EL 最高为 2.1。提前感谢您提供更多信息。
  • 如果您不想提交完整的表单,则必须使用 AJAX...
  • 我认为我有一个限制,因为我需要使用 Tomcat 6。当我在我的方法 (andreBean.test()) 中使用括号时,我得到一个解析错误,当我删除括号时,我收到一个消息说“andreBean”中不存在属性“test”...死锁:(我在commandButton中使用了ajax,如下所示,使用括号而不使用: 其他建议?
  • 您不需要 f:ajax。您可以在 p:commandButton 上设置 ajax="true" (这是默认值),然后使用 actionListener="#{andreBean.test}"

标签: jsf primefaces


【解决方案1】:

发生了什么事?

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

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

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

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

因此只有你的第二个按钮会执行 beans 的方法:

<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

希望对您有所帮助。

【讨论】:

  • 您好,感谢您的评论。我已经使用此链接 [link] (forum.primefaces.org/viewtopic.php?f=3&t=34788) 上的建议解决了我的问题,其中
  • 我遇到了类似的问题,并且进程标签有效。它最初设置为@this,但后来我添加了我所有的组件 id,所以它看起来像这样,process=@this,componentId1,componentId2 这个更改对我有用,我没有添加 immediate=true 标志 t00
【解决方案2】:

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

【讨论】:

  • 它之所以有效,是因为您遇到了一些您看不到的验证,只要您没有看到,而是代码中的任何 p:messages。现在,当您添加 immediate=true 时,您正在绕过验证并提交.
【解决方案3】:

请检查您与 bean 的绑定。

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

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多