Jsf primefaces行编辑中的event.getObject()将旧值发送到bean
我正在尝试使用prime faces的功能,该功能允许用户编辑表本身中的行数据。我通过以下链接实现了该功能: 当我说编辑用户时,输入的新值不会发送到bean,它仍然只显示旧值 我在JSF中的代码:Jsf primefaces行编辑中的event.getObject()将旧值发送到bean,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,我正在尝试使用prime faces的功能,该功能允许用户编辑表本身中的行数据。我通过以下链接实现了该功能: 当我说编辑用户时,输入的新值不会发送到bean,它仍然只显示旧值 我在JSF中的代码: <p:dataTable value="#{mybean.userList}" var="item" id="dataTab" widgetVar="usersTable" tableStyleClass="data" pagi
<p:dataTable value="#{mybean.userList}"
var="item"
id="dataTab"
widgetVar="usersTable"
tableStyleClass="data" paginator="true" rows="5"
filteredValue="#{userController.filteredUsers}"
editable="true"
rowKey="#{item}">
<p:ajax event="rowEdit" listener="#{mybean.onEdit}" update=":userForm:growl" />
<p:ajax event="rowEditCancel" listener="#{mybean.onCancel}" update=":userForm:growl" />
<f:facet name="header">
<p:outputPanel>
<h:outputText value="Search all fields:" />
<p:inputText id="globalFilter" onkeyup="('usersTable').filter()" style="width:150px" />
</p:outputPanel>
</f:facet>
<p:column sortBy="#{item.firstName}" filterBy="#{item.firstName}"
filterMatchMode="startsWith">
<p:cellEditor>
<f:facet name="header">
<h:outputText value="First Name" />
</f:facet>
<f:facet name="output">
<h:outputText value="#{item.firstName}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{item.firstName}" style="width:100%"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column sortBy="#{item.lastName}" filterBy="#{item.lastName}" filterMatchMode="startsWith">
<p:cellEditor>
<f:facet name="header">
<h:outputText value="Last Name" />
</f:facet>
<p:column headerText="Update" style="width:6%">
<p:rowEditor />
</p:column>
</p:dataTable>
bean中用于在ui中获取列表的代码:
public List<UserBean> getUsersList(){
List<UserBean> retval = new ArrayList<>();
for (Object[] tuple : myFacade.getUserList()) {
UserBean ub = new UserBean();
ub.setFirstName((String) tuple[0]);
ub.setLastName((String)tuple[1]);
ub.setEmailAddress((String)tuple[2]);
ub.setOfficeNumber((String)tuple[3]);
ub.setRole((String)tuple[4]);
retval.add(ub);
}
return retval;
}
公共列表getUsersList(){
List retval=new ArrayList();
对于(对象[]元组:myFacade.getUserList()){
UserBean ub=newuserbean();
ub.setFirstName((字符串)元组[0]);
ub.setLastName((字符串)元组[1]);
ub.setEmailAddress((字符串)元组[2]);
ub.setOfficeNumber((字符串)元组[3]);
ub.setRole((字符串)元组[4]);
返回。添加(ub);
}
返回返回;
}
我尝试了一些帖子中给出的建议,但都不起作用。有人能告诉我如何获得新值吗?我正在使用glassfish 4.0,primefaces 3.5。我能够解决问题。每次在getter方法中获取列表时,我都会调用数据库来加载数据。但只有当列表为空时,才应执行此操作。以下代码为您提供了一个清晰的图像:
public List<UserBean> getUsersList(){
if(retval == null)
{
retval = new ArrayList<>();
for (Object[] tuple : myFacade.getUserList()) {
UserBean ub = new UserBean();
ub.setFirstName((String) tuple[0]);
ub.setLastName((String)tuple[1]);
ub.setEmailAddress((String)tuple[2]);
ub.setOfficeNumber((String)tuple[3]);
ub.setRole((String)tuple[4]);
retval.add(ub);
}
}
return retval;
}
公共列表getUsersList(){
if(retval==null)
{
retval=newarraylist();
对于(对象[]元组:myFacade.getUserList()){
UserBean ub=newuserbean();
ub.setFirstName((字符串)元组[0]);
ub.setLastName((字符串)元组[1]);
ub.setEmailAddress((字符串)元组[2]);
ub.setOfficeNumber((字符串)元组[3]);
ub.setRole((字符串)元组[4]);
返回。添加(ub);
}
}
返回返回;
}
因此getUsersList是我在p:datatable中的var值,现在当我调用OneEdit时,它将检查列表是否为null,它执行数据库调用或不调用数据库。在其他可能的问题中,您的代码没有正确关闭JSF标记。这是复制粘贴问题吗?听起来转换/验证失败了。你能在表单中添加一个消息组件来验证吗?@patstuart是的,这只是一个复制粘贴错误,在我的jsf页面中没有问题。@kolossus我添加了消息组件p:growl,它没有显示任何验证/转换错误。我只是将名字从“abc”改为“abcd”。老实说,这几乎是不可能的,因为你发布的代码有各种各样的问题。您正在getter中执行一个复杂的操作,这是您永远不应该做的(PrimeFaces将抛出各种fit)。您完全忽略了泛型,因此不可能知道传递了什么。您发布了usersList而不是userList的代码,它返回的似乎是UserBean的列表,而不是User。试着用你的代码修复一些基本的问题,也许你会在修复过程中发现错误。我也有同样的问题,这是正确的答案。谢谢在getter中执行业务逻辑是不可取的。相反,使用一些方法初始化bean,比如
f:viewAction
。
public List<UserBean> getUsersList(){
if(retval == null)
{
retval = new ArrayList<>();
for (Object[] tuple : myFacade.getUserList()) {
UserBean ub = new UserBean();
ub.setFirstName((String) tuple[0]);
ub.setLastName((String)tuple[1]);
ub.setEmailAddress((String)tuple[2]);
ub.setOfficeNumber((String)tuple[3]);
ub.setRole((String)tuple[4]);
retval.add(ub);
}
}
return retval;
}