Java 为什么JSF2(PrimeFaces3)Ajax属性侦听器没有触发?
我有一个数据表,每一行都有编辑和删除按钮。 它几乎类似于datatable 当我单击编辑按钮时,如果我使用Java 为什么JSF2(PrimeFaces3)Ajax属性侦听器没有触发?,java,tomcat,jsf-2,primefaces,Java,Tomcat,Jsf 2,Primefaces,我有一个数据表,每一行都有编辑和删除按钮。 它几乎类似于datatable 当我单击编辑按钮时,如果我使用显示所选行值,则值将正确显示。 但是,如果我想使用在输入文本字段中显示它,就会抛出错误,说selectedUser被解析为null 如果我只使用,那么userCRUDMB.selectedUser()方法将被正确调用。 但是如果在对话框中使用,则根本不会调用setter方法 我使用的是Mojarra 2.1.6、PrimeFaces 3.0、ApacheTomcat7.0.32 知道为什么会
显示所选行值,则值将正确显示。
但是,如果我想使用
在输入文本字段中显示它,就会抛出错误,说selectedUser被解析为null
如果我只使用
,那么userCRUDMB.selectedUser()
方法将被正确调用。
但是如果在对话框中使用
,则根本不会调用setter方法
我使用的是Mojarra 2.1.6、PrimeFaces 3.0、ApacheTomcat7.0.32
知道为什么会这样吗
代码:代码与相同,只是在对话框中,而不是在输入文本框中使用显示文本
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>
公共类用户
{
私有整数用户标识;
私有字符串用户名;
私有字符串密码;
私有字符串名;
私有字符串lastname;
私人字符串电子邮件;
私人约会日期;
私人字符串性别;
//二传手
}
包com.sivalabs.primefacesdemo.managedbeans;
导入java.util.ArrayList;
导入java.util.List;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.RequestScope;
导入com.sivalabs.primefacesdemo.model.User;
导入com.sivalabs.primefacesdemo.model.UserDataModel;
导入com.sivalabs.primefacesdemo.service.SpringContainer;
导入com.sivalabs.primefacesdemo.service.UserService;
@ManagedBean(name=“UserCRUDMB”)
@请求范围
公共类UserCRUDMB
{
私有UserDataModel UserDataModel;
私人用户选择用户;
私人用户[]选择用户;
公共用户crudmb()
{
列表用户=新建ArrayList();
对于(int i=0;i<15;i++){
用户=新用户();
user.setUserId(i);
user.setUserName(“用户名”+i);
用户。添加(用户);
}
this.userDataModel=新的userDataModel(用户);
}
公共UserDataModel getUserDataModel(){
返回userDataModel;
}
public void setUserDataModel(UserDataModel UserDataModel){
this.userDataModel=userDataModel;
}
公共用户[]getSelectedUsers(){
返回所选用户;
}
公共无效设置selectedUsers(用户[]selectedUsers){
this.selectedUsers=selectedUsers;
}
公共用户getSelectedUser(){
System.out.println(“get-->”+selectedUser);
返回所选的用户;
}
公共无效设置selectedUser(用户选择的用户){
System.out.println(“设置--->”+选择的用户);
this.selectedUser=selectedUser;
}
}
用户管理
#{userObj.userId}
#{userObj.userName}
谢谢,
Siva如果您使用的是ajax,那么请求范围不是“理想”范围,因为bean将为每个请求重新创建。这可能是
selectedUser
为空的原因。改为使用视图范围(@ViewScoped
)。发布bean和页面的代码。这样应该更容易帮助您。发布了代码片段。您提供的代码不适合您的问题。请发布您的代码,而不是primefaces showcase中的代码。bean代码和jsf数据表对于查找错误源也很重要。名称有什么大不了的!!!我有一个UserCRUDMB,它和一个TableBean完全一样,而不是我选择的selectedCar。不管怎么说,我改变了我原来的问题和代码,仍然得到了相同的错误。“大不了”的是Primefaces showcase中的代码有效,而您的代码显然无效。因此,从PF showcase复制/粘贴代码毫无意义。