接受了JSF的新手,但我已经在线跟踪了一些示例,但没有成功。这似乎是想要做的直截了当的事情。我们在持久层中使用Hibernate,并希望一次性从可编辑的dataTable列表中保存包含详细信息和相关实体记录的页面。
表格上方的页面上有2个命令按钮 - 添加角色和删除角色。 dataTable由PrimeFaces(3.5)SelectableDataModel支持(fyi:我尝试用通用JSF替换所有特定的PrimeFaces。我尝试用简单的集合进行支持)。单击“添加角色”后,后备操作方法将创建一个新对象并添加到该集合中。页面中的表立即反映了这一点,我可以打开行进行编辑和更改默认值。但是,当我单击删除时,后备操作方法将查找所有选定的行,我可以在调试器中看到正确的对象从集合中删除,但随后页面再次加载,我最终再次使用相同的列表。 (我在bean init()中停了一下。最初尝试使用确认对话框,但删除了没有运气,尝试了update =,ajax =等的变化。无法粘贴所有尝试,但此代码来自最后一次传递 -
<h:form id="dataTableForm">
<div class="row marginTop">
....
<div class="btn-toolbar">
<p:commandButton value="#{msgUserSetup['btnAddRole']}"
title="#{msgUserSetup['btnAddRole']}" id="btnAddRole"
icon="envicon-med-plus envicon-white"
styleClass="btn btn-primary"
action="#{userSetupBean.addContext}" update="@form"/>
<p:commandButton value="#{msgUserSetup['btnDeleteRole']}"
title="#{msgUserSetup['btnDeleteRole']}"
icon="envicon-med-trash envicon-white"
styleClass="btn btn-danger"
action="#{userSetupBean.removeContexts}" ajax="true" update="userContexts"/>
</div>
...
<p:dataTable id="userContexts" var="userContext" styleClass="marginTop"
value="#{userSetupBean.contextsEditList}"
editable="true" editmode="row"
paginator="true" rows="5" rowKey="#{userContext.id}"
paginatorTemplate="{PreviousPageLink} {PageLinks} {NextPageLink}"
rowsPerPageTemplate="5" paginatorPosition="bottom">
<p:ajax event="rowSelect" listener="#{userSetupBean.onRowSelect}" />
<p:ajax event="rowEditInit" listener="#{userSetupBean.onEditInit}" />
<p:ajax event="rowEdit" listener="#{userSetupBean.onEdit}" />
<p:ajax event="rowEditCancel" listener="#{userSetupBean.onCancel}" />
<p:column>
<h:selectBooleanCheckbox value="#{userSetupBean.checked[userContext.id]}" />
</p:column>
....
UserSetupBean代码: init()是post构造方法,其中SiteUser selectUser是从会话中提取的,它具有由Hibernate急切加载的UserContext集合。对于每一个,我实例化一个ContextEditObject对象,该对象充当每个放入新List的“编辑缓冲区”。这就是支持dataTable的原因。 addContext()将新的ContextEditObject添加到列表中 onEdit(RowEditEvent事件)将返回到非编辑状态的行,对象中保存更改,而onCancel()将执行一些回滚工作。 removeContext()从集合中删除选定行中表示的对象。
@PostConstruct
public final void init() {
FacesContext fCtx = FacesContext.getCurrentInstance();
selectedUser = (SiteUser) ((HttpSession) fCtx.getExternalContext().getSession(false))
.getAttribute(SessionAttributes.SELECTED_USER.attributeName());
...
List<UserContext> userContexts = selectedUser.getUserContexts();
for (UserContext userContext:userContexts) {
persistentContextsMap.put(userContext.getId(), userContext);
ContextEditObject editObject = new ContextEditObject(userContext);
contextsEditList.add(editObject);
...
public final void addContext() {
try {
UserContext newContext = hierarchyUserBridgeService
.createNewUserContextLockedAtlevel(findViewForLevel(selectedUser.getLevel().getLevelId()),
selectedUser);
int listElement = contextsEditList.size();
newContext.setId("NEW" + listElement);
contextInView = new ContextEditObject(newContext);
contextsEditList.add(listElement, contextInView);
...
public final String removeContexts() {
int size = 0; //selectedContexts.length;
List<String> checkedItems = new ArrayList<String>();
for (ContextEditObject ctx : contextsEditList) {
if (checked.get(ctx.getId())) {
checkedItems.add(ctx.getId());
size++;
}
}
...
for (String ctxId : checkedItems) {
ContextEditObject ctx = contextsEditMap.get(ctxId);
contextsEditMap.remove(ctxId);
contextsEditList.remove(ctx);
if (!ctx.getId().startsWith("NEW")) {
this.deletedContexts.add(ctx);
}
}
...
非常感谢任何帮助。感谢