gpt4 book ai didi

jsf-2 - 添加在带有对话的 PrimeFaces ver 3.4.2 dataTable 中无法正常工作

转载 作者:行者123 更新时间:2023-12-01 11:14:19 54 4
gpt4 key购买 nike

我想制作具有添加、过滤、编辑、删除、分页功能的 CRUD PrimeFaces 数据表。我正在尝试使用 PrimeFaces 3.4.2 数据表、JSF 2.1 在对话(即模态弹出窗口)中“添加”一条新记录。

所有其他操作都运行良好,但 dataTable 在添加操作后未正确更新。它在第一次添加操作后正确更新。之后我添加第二行,dataTable 被更新,但首先添加的行被第二次添加的行替换。之后我添加了第 3 行,第 1 行已替换为第 3 行。在所有情况下,数据库表都得到完美更新。

jsf 和托管 bean 的代码片段:

JSF 代码:

<h:body>
<h:form id="form1">

<h:messages id="messages1"/>
<br/>

<p:commandButton id="Addbtn" value="Add" oncomplete="AddDialog.show()" update=":addform"/>
<br/>

<p:dataTable id="dtusers" value="#{userdataController.retrieveData()}" var="item"
rows="8" paginator="true" emptyMessage="No Records Found"
paginatorAlwaysVisible="false">

<p:column style="width:150px" filterMatchMode="contains" filterBy ="#{item.id}">
<f:facet name="header"> Id </f:facet>
<h:outputText value="#{item.id}"/>
</p:column>

<p:column style="width:150px" filterMatchMode="contains" filterBy="#{item.name}">
<f:facet name="header"> Name </f:facet>
<h:outputText value="#{item.name}"/>
</p:column>

<p:column style="width:150px">
<p:commandButton id="editButton" update=":editform" oncomplete="EditDialog.show()" value="Edit">
<f:setPropertyActionListener value="#{item}" target="#{userdataController.selectedUser}"/>
</p:commandButton>
</p:column>

<p:column style="width:150px">
<p:commandButton id="deleteButton" update=":deleteform" oncomplete="UserDialog.show()" value="Delete">
<f:setPropertyActionListener value="#{item}" target="#{userdataController.selectedUser}"/>
</p:commandButton>
</p:column>

</p:dataTable>
</h:form>

<p:dialog header="Add User Data" resizable="false" id="AddDialog" widgetVar="AddDialog" modal="true" showEffect="fade" hideEffect="fade" position="center" dynamic="true">
<h:form id="addform">
<p:outputPanel id="AddDisplay">

<p:panelGrid columns="2" >

<f:facet name="header">
Add Userdata
</f:facet>

<h:outputLabel for="Id" value="Enter Id:"/>
<p:inputText id="Id" value="#{userdataController.selected.id}" />

<h:outputLabel for="Name" value="Enter Name:"/>
<p:inputText id="Name" value="#{userdataController.selected.name}"/>

<p:commandButton actionListener="#{userdataController.create}" update=":form1:dtusers :form1:messages1" value="Save" oncomplete="AddDialog.hide()" style="margin:0"/>

</p:panelGrid>
</p:outputPanel>
</h:form>
</p:dialog>
</h:body>

Manaed Bean 代码片段:

@ManagedBean(name = "userdataController")
@SessionScoped
public class UserdataController implements Serializable {

private Userdata current;
private DataModel items = null;
@EJB
private PrimeFacesDb.session.UserdataFacade ejbFacade;
private int id;
private String name;
private Userdata SelectedUser;

public UserdataController() {
}
//getters setters for id,name and SelectedUser

private UserdataFacade getFacade() {
return ejbFacade;
}
public List retrieveData() {
List result = getFacade().findAll();
return result;
}

public void create() {
try {
getFacade().create(current);
JsfUtil.addSuccessMessage("Userdata created successfully");
} catch (Exception e) {
JsfUtil.addErrorMessage(e, "Persistence Error occured");
}
}
}

PrimeFaces 论坛、NetBeans 示例代码和可编辑数据示例(mastertheboss.com/primefaces/datatables-with-primefaces/…;) 中提供的信息帮助我创建了一个更好的可演示的 CRUD 数据表,包括创建、过滤、编辑和删除特征。不提 Mr.BalusC 是不完整的,因为他对 JSF 2.x 帖子的评论和解决方案对我很有值(value)。

最佳答案

您似乎遗漏/误解了 Java 的面向对象特性。您每次都在添加表单中重复使用相同对象实例/引用。

基本上,您的流程如下:

List<Userdata> users = new ArrayList<Userdata>();
Userdata current = new Userdata();
current.setName("foo");
users.add(current);
current.setName("bar"); // Look, it's still the same instance! So the one in the list is also changed!
users.add(current); // It now contains 2 references of exactly the same instance!
current.setName("baz"); // Still the same reference!
users.add(current); // It now contains 3 references of exactly the same instance!
// ...

虽然你实际上应该这样做

List<Userdata> users = new ArrayList<Userdata>();
Userdata current = new Userdata();
current.setName("foo");
users.add(current);
current = new Userdata(); // New instance!
current.setName("bar");
users.add(current);
current = new Userdata(); // Another new instance!
current.setName("baz");
users.add(current);
// ...

因此,相应地修复您的 create() 方法:

getFacade().create(current);
current = new Userdata();

(请注意,您的 View 和模型彼此不完全匹配......selectedcurrent 不一样,我假设你只是使用了与 getter 不同的属性名称)

关于jsf-2 - 添加在带有对话的 PrimeFaces ver 3.4.2 dataTable 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14142257/

54 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com