2012-03-01 62 views
0

我有一个数据表,每行有编辑和删除按钮。 它与http://www.primefaces.org/showcase-labs/ui/datatableRowSelectionByColumn.jsf数据表几乎相似。为什么JSF2(PrimeFaces3)Ajax属性侦听器未触发?

当我点击编辑按钮,如果我显示使用<h:outputText>的值所选择的行值被正确显示。 但是如果我想使用它<h:inputText value="#{userCRUDMB.selectedUser.userName}"/>是抛出错误说selectedUser is resolved as null一个输入文本字段,以显示它。

如果我只用<h:outputText ...>然后userCRUDMB.selectedUser()方法得到正确调用。 但是,如果我在对话框中使用<h:inputText ...>,setter方法根本就没有被调用。

我使用钻嘴鱼科2.1.6,PrimeFaces 3.0,Apache的Tomcat7.0.32。

任何想法,为什么这是怎么回事?

代码:代码是一样http://www.primefaces.org/showcase-labs/ui/datatableRowSelectionByColumn.jsf,除了在对话框中,而不是使用我想使用文本框输入来显示显示的文字。

public class User 
{ 
    private Integer userId; 
    private String userName; 
    private String password; 
    private String firstname; 
    private String lastname; 
    private String email; 
    private Date dob; 
    private String gender; 

    //setters/getters 
} 



package com.sivalabs.primefacesdemo.managedbeans; 

import java.util.ArrayList; 
import java.util.List; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 

import com.sivalabs.primefacesdemo.model.User; 
import com.sivalabs.primefacesdemo.model.UserDataModel; 
import com.sivalabs.primefacesdemo.service.SpringContainer; 
import com.sivalabs.primefacesdemo.service.UserService; 


@ManagedBean(name="UserCRUDMB") 
@RequestScoped 
public class UserCRUDMB 
{ 

    private UserDataModel userDataModel; 
    private User selectedUser; 
    private User[] selectedUsers; 

    public UserCRUDMB() 
    { 
     List<User> users = new ArrayList<User>(); 
     for (int i = 0; i < 15; i++) { 
      User user = new User(); 
      user.setUserId(i); 
      user.setUserName("userName"+i); 
      users.add(user); 
     } 
     this.userDataModel = new UserDataModel(users);  
    } 

    public UserDataModel getUserDataModel() { 
     return userDataModel; 
    } 

    public void setUserDataModel(UserDataModel userDataModel) { 
     this.userDataModel = userDataModel; 
    } 

    public User[] getSelectedUsers() { 
     return selectedUsers; 
    } 

    public void setSelectedUsers(User[] selectedUsers) { 
     this.selectedUsers = selectedUsers; 
    } 

    public User getSelectedUser() { 
     System.out.println("get-->"+selectedUser); 
     return selectedUser; 
    } 

    public void setSelectedUser(User selectedUser) { 
     System.out.println("set--->"+selectedUser); 
     this.selectedUser = selectedUser; 
    } 
} 



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<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:ui="http://java.sun.com/jsf/facelets" 
     xmlns:c="http://java.sun.com/jsp/jstl/core" 
     xmlns:p="http://primefaces.org/ui"> 

<h:head> 
</h:head> 
<body> 
    <h:form id="form"> 
     <h:outputText value="PrimeFaces Demo - ShowUsers" /> 

     <p:dataTable value="#{UserCRUDMB.userDataModel}" var="userObj" 
        selection="#{UserCRUDMB.selectedUsers}" 
        widgetVar="usersTbl"> 

      <f:facet name="header">UserManagement</f:facet> 
      <p:column selectionMode="multiple"></p:column> 
      <p:column headerText="UserId">#{userObj.userId}</p:column> 
      <p:column headerText="UserName">#{userObj.userName}</p:column> 

      <p:column> 
       <p:commandButton value="Edit" 
           oncomplete="userEditDlg.show()" 
           update="form:userEditTbl"> 
        <f:setPropertyActionListener target="#{UserCRUDMB.selectedUser}" value="#{userObj}"></f:setPropertyActionListener> 
       </p:commandButton> 

      </p:column> 
      <p:column> 
       <p:commandButton value="Delete" action="#{UserCRUDMB.deleteUser}" 
           update="usersTbl" 
           ajax="true"> 
        <f:setPropertyActionListener target="#{UserCRUDMB.selectedUser}" value="#{userObj}"></f:setPropertyActionListener> 
       </p:commandButton> 

      </p:column> 

      <f:facet name="footer"> 
       <p:commandButton value="Delete Selected" action="#{UserCRUDMB.deleteUsers}" 
           update="usersTbl" 
           ajax="true"> 
       </p:commandButton> 
      </f:facet> 
     </p:dataTable> 
     <p:dialog widgetVar="userEditDlg" header="User Edit Form" hideEffect="explode" 
           minHeight="200" minWidth="300"> 
      <h:panelGrid columns="2" id="userEditTbl" > 
       <h:outputLabel value="UserId" /> 
       <h:outputText value="#{UserCRUDMB.selectedUser.userId}"/> 

       <h:outputLabel value="UserName" /> 
       <h:inutText value="#{UserCRUDMB.selectedUser.userName}"/> 

      </h:panelGrid> 

     </p:dialog>  
    </h:form> 

</body> 
</html> 

感谢, 西瓦

+0

发布你的bean和页面的代码。这应该会更容易帮助你。 – Andre 2012-03-01 03:33:07

+0

同意Andre – 2012-03-01 04:35:39

+0

发布了代码片段。 – 2012-03-01 07:03:09

回答

1

如果您正在使用AJAX,请求范围北京时间不是“理想”的范围,因为bean将被重新创建为每个请求。这可以selectedUser为空的原因。改为使用视图范围(@ViewScoped)。

+0

谢谢马特。它解决了这个问题。 – 2012-04-04 05:12:02

+0

不客气! – 2012-04-04 05:53:16

相关问题