首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Primefaces - commandButton不工作

Primefaces - commandButton不工作
EN

Stack Overflow用户
提问于 2013-11-02 00:41:31
回答 3查看 65.4K关注 0票数 16

我在commandButton上遇到了一个问题,它只在类型提交时才起作用。有人能看看,如果有解决办法,让我知道吗?下面的代码非常简单,并有建议来说明我所需要的。未执行方法test()。方法成功地执行runSubmit。

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

我使用的是PrimeFaces 4.0、JDK 7、Tomcat 6和JSF2.0 (Apache),但是我认为它也发生在Mojarra中。

代码语言:javascript
复制
    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";
}

}
代码语言:javascript
复制
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>

非常感谢安德烈

EN

回答 3

Stack Overflow用户

发布于 2013-11-03 22:32:27

到底怎么回事?

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

按钮用于执行自定义的javascript ,而不引起ajax/non请求。若要创建按钮,请将其设置为“按钮”。 ”

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

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

代码语言:javascript
复制
<p:commandButton id="s" value="submit" action="#{andreBean.runSubmit}" />

你可能想得到什么?

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

代码语言:javascript
复制
<h:form id="test">
    <p:inputText value="#{andreBean.value}"/>
    <p:commandButton id="s" value="submit" action="#{andreBean.runSubmit}" process="@this" />
</h:form>

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

代码语言:javascript
复制
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;
    }

}

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

代码语言:javascript
复制
getValue

setValue: foobar

Submit executed

...and组件仅限于process="@this“,您只能得到:

代码语言:javascript
复制
Submit executed

希望这能有所帮助。

票数 37
EN

Stack Overflow用户

发布于 2014-09-01 11:16:20

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

  • 下面是一篇关于如何和何时使用它的文章:直接属性项目
票数 15
EN

Stack Overflow用户

发布于 2015-02-06 10:18:02

请检查您与bean的绑定。

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

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19737674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档