我的问题在于从数据表中删除项目。当我点击按钮删除确认对话框将出现确认从数据库中删除行。如果是这样,数据将被删除,但数据表不会更新,除非我退出并登录,如果我选择另一个项目,它甚至不会被删除。
<h:form id="form">
<p:panel id="panelform" header="Databases" >
<p:dataTable value="#{dataMB.customersDatas}" var="item" id="datas" rowsPerPageTemplate="5,10,15,20,25,30" paginator="true" rows="10" filteredValue="#{dataMB.filteredDatas}" selectionMode="single" rowKey="#{item.id}"selection="#{dataMB.selectedData}">
<p:ajax event="rowSelect" update=":form:dataView, :form:deleteButton, :form:viewButton" listener="#{dataMB.onRowSelect}"/>
</p:dataTable>
<p:panel>
<p:commandButton style="width: 8%;height: 100%" id="viewButton" value="View" oncomplete="dataDialogView.show()" disabled="#{dataMB.disabled}" icon="ui-icon-search" title="data details"/>
<p:commandButton style="width: 8%;height: 100%" id="deleteButton" value="Delete" oncomplete="deleteDialog.show()" disabled="#{dataMB.disabled}" icon="ui-icon-trash"/>
</p:panel>
</p:panel>
</h:form>
<p:confirmDialog style="position: absolute; width: 50px; border-color: blue" id="deleteData" message="Your Database Will be completely removed . Are you sure? " appendToBody="true" header="Delete Data" severity="alert" widgetVar="deleteDialog">
<h:form>
<p:commandButton id="confirm" style="width: 25%;height: 100%" value="Confirm" actionListener="#{dataMB.deleteData()}" update=":form:datas" ajax="true" oncomplete="deleteDialog.hide(); purchase.hide();" >
</p:commandButton>
<p:commandButton id="cancel" style="width: 25%;height: 100%" value="Later" onclick="deleteDialog.hide();" type="button" />
</h:form>
</p:confirmDialog>
我的sessionScoped托管Bean 中的deleteData()方法
public String deleteData() {
logger.log(Level.SEVERE, "*****delete Data***** ");
dataBusinessLocal.deleteData(selectedData);
return "datalist";
}
答案 0 :(得分:0)
JSF是基于会话的。为了同步客户端(浏览器)和服务器之间的状态,JSF使用隐藏字段javax.faces.ViewState
。现在,您在给定页面上使用两个表单:
因此,隐藏的输入字段viewState
不再准确。我可能会尝试两种方式:
确认框是否必须是花哨的JSF或javascript解决方案呢?
<p:commandButton id="deleteButton"
value="Delete"
disabled="#{dataMB.disabled}" icon="ui-icon-trash"
actionListener="#{dataMB.deleteData}"
onclick="if (!confirm('really delete?')) { return false;}" />
可能会做类似的工作。
可能性二:只需重新呈现整个表单或面板panelform
,而不仅仅是数据表。这样,应该呈现新的javax.faces.ViewState
,并且表单再次正常工作。
此外,在某处添加<h:messages />
并在每个步骤中更新它。如果出现意外错误,可能会在UI上显示错误。
希望有帮助...