按钮不提交PrimeFaces 3.5

时间:2013-09-07 21:09:05

标签: jsf jsf-2 primefaces

我正在使用jsf + primefaces 3.5。我的按钮不是在我的托管bean中调用一个方法。

我有这个xhtml:

 <h:form>
      <p:inputText id="name" value="#{userMB.userSelected.name}" />  
      <p:commandButton id="btnSave" value="Salvar" actionListener="#{userMB.save}"/>  
 </h:form>

我的托管bean是:

@ManagedBean
@SessionScoped
public class UsuarioMB implements  Serializable{
 User userSelected; 

 public void save(){
     System.out.println(userSelected.getName());
     //call my daos and persist in database


    }
}

最奇怪的是,如果我删除了,该方法被调用!

如果我在p:commandButton“imediate = true”中放置一个属性,则调用该方法,但是,信息(userSelected.name)为空!

非常感谢:)

2 个答案:

答案 0 :(得分:1)

它失败了,因为它投了NullPointerException因为你从未初始化userSelected

将此添加到您的bean:

@PostConstruct
public void init() {
    userSelected = new User();
}

如果您已经注意了服务器日志,那么您应该已经看过了。至于在webbrowser中完全没有关于异常的反馈,而在正常的同步(非ajax)中,你会看到一个HTTP 500错误页面,这是因为你发送的ajax请求显然没有ExceptionHandler配置。

当您在按钮上设置immediate="true"时,它的工作原理只是因为它会绕过所有未设置immediate="true"的输入组件的处理。

另见:

答案 1 :(得分:0)

您尚未为managedbean UsuarioMB指定名称。作为suche,它将被命名为usuarioMB

  

@ManagedBean - 将此bean标记为具有名称的托管bean   在name属性中指定。如果@ManagedBean中的name属性是   未指定,则托管bean名称将默认为类名   完全限定类名的一部分。

在此博客中详细了解它:http://mkblog.exadel.com/2009/08/learning-jsf2-managed-beans/

其次,如果您的上述代码已完成,则您缺少userSelected的公共getter和setter。

第三,由于您已声明无参数动作侦测器,因此缺少ActionEvent,请参阅Differences between action and actionListener

为了让您的代码正常工作,您需要将xhtml更改为

<h:form>
  <p:inputText id="name" value="#{usuarioMB.userSelected.name}" />  
  <p:commandButton id="btnSave" value="Salvar" actionListener="#{usuarioMB.save}"/>  
</h:form>

您的托管bean如下

import javax.faces.event.ActionEvent;
// ...

@ManagedBean
@SessionScoped
public class UsuarioMB implements  Serializable{
  private User userSelected; 

  public void save(ActionEvent event){
     System.out.println(userSelected.getName());
  }

  public User getUserSelected() {
    return userSelected;
  }

  public void setUserSelected(User userSelected) {
    this.userSelected = userSelected;
  }

}