我遇到了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>
非常感谢你 安德烈
答案 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或非原始的。