Mit <w:view> auf der template-Seite in JSF
Ich habe eine DataTable (Primefaces 3.5, JSF 2.0) die ist aufgefüllt, die aus einer Datenbank. In der ersten Spalte dieser Tabelle, Kontrollkästchen angezeigt werden (mehrfache zeilenmarkierung).
Nach Auswahl der Zeile(N), wenn eine Taste (<p:commandButton>
) gedrückt wird, werden die ausgewählten Zeilen werden erwartet, um aus der Datenbank gelöscht werden.
Vor löschen der Zeile(N), eine bestätigen-Nachricht über die Löschung der ausgewählten Zeile(N) dargestellt <p:confirmDialog>
mit zwei Knöpfen ja und Keine etwas wie das folgende.
Test.xhtml:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition template="template/Template.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<ui:define name="title">Test</ui:define>
<ui:define name="content">
<h:form id="form">
<p:dataTable id="dataTable" var="row" value="#{testManagedBean.list}"
selection="#{testManagedBean.selectedValues}"
rowKey="#{row.id}"
rowIndexVar="rowIndex">
<p:column selectionMode="multiple" style="width:5%; text-align: center;">
<f:facet name="footer">
----------------> <p:commandButton actionListener="#{testManagedBean.deleteMultipleActionListener}" oncomplete="confirmDeleteMultiple.show()" update=":form:confirmDialogDeleteMultiple" process=":form:dataTable" icon="ui-icon ui-icon-close"/>
</f:facet>
</p:column>
<p:column headerText="Index">
<h:outputText value="#{rowIndex+1}"/>
</p:column>
<p:column id="id" headerText="Id">
<h:outputText value="#{row.id}"/>
</p:column>
<p:column id="countryName" headerText="Description">
<h:outputText value="#{row.description}"/>
</p:column>
</p:dataTable>
---------------><p:confirmDialog id="confirmDialogDeleteMultiple" widgetVar="confirmDeleteMultiple" appendToBody="true" message="Delete row(s)?" showEffect="true" hideEffect="true" header="Deletion of row." severity="alert" closeOnEscape="true" closable="true">
<p:commandButton id="confirmDeleteMultiple" value="Yes" oncomplete="confirmDeleteMultiple.hide()" actionListener="#{testManagedBean.deleteMultiple}" process="@this dataTable" update="dataTable"/>
<p:commandButton id="declineDeleteMultiple" value="No" onclick="confirmDeleteMultiple.hide()" type="button" />
</p:confirmDialog>
</h:form>
</ui:define>
</ui:composition>
Den verwalteten bean:
@ManagedBean
@ViewScoped
public final class TestManagedBean implements Serializable
{
@EJB(mappedName="ejb/JNDI")
private TestService testService;
private List<Test> list;
private List<Test>selectedValues;
public TestManagedBean(){}
@PostConstruct
public void init()
{
list=testService.getList();
}
public List<Test> getList() {
return list;
}
public List<Test> getSelectedValues() {
return selectedValues;
}
public void setSelectedValues(List<Test> selectedValues) {
this.selectedValues = selectedValues;
}
public void deleteMultipleActionListener(ActionEvent actionEvent)
{
//Just show a warning message, when the delete button is pressed.
for(Test test:selectedValues)
{
System.out.println(test.getId()+" : "+test.getDescription());
}//Displays the list.
}
public void deleteMultiple(ActionEvent actionEvent)
{
System.out.println("multiple");
for(Test test:selectedValues)
{
System.out.println(test.getId()+" : "+test.getDescription());
}//The list is not null and empty.
}
}
Wenn Sie die Taste (gekennzeichnet durch einen Pfeil in XHTML) gedrückt wird, wird der deleteMultipleActionListener()
Methode in der managed bean aufgerufen wird, wo es zeigt einfach die Liste, die ist bevölkert von die ausgewählten Zeilen und der confirm-dialog, wie gezeigt, in XHTML danach angezeigt wird. (Dies ist nur um zu zeigen, eine Warnung vor dem löschen. Die Schleife in dieser Methode ist nur für die demonstration).
Wenn die ja - Taste auf der confirm-dialog gedrückt wird, wird der deleteMultiple()
Methode aufgerufen wird, die verantwortlich ist für die tatsächliche Löschung der Zeilen (actionListioner
im <p:commandButton>
innen <p:confirmDialog>
) und das löschen von Zeilen durchgeführt werden sollte, aber hier ist die Liste der ausgewählten Zeilen abgerufen, die hier ist leer (nicht null).
Die resultierende Liste innerhalb des deleteMultiple()
Methode ist leer, da der <f:view>
auf der Seite " Vorlage. Die template-Seite ist unten dargestellt.
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="#{localeBean.language}"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
--------->
<f:view locale="#{localeBean.locale}" encoding="UTF-8" contentType="text/html">
<f:loadBundle basename="messages.ResourceBundle" var="messages"/>
<h:head><title><ui:insert name="title">Default Title</ui:insert></title></h:head>
<h:body>
<p:layout fullPage="true">
<p:layoutUnit position="north" size="135" collapsed="false" resizable="false" closable="false" collapsible="false" gutter="6">
<h:form>
<h:selectOneMenu id="languages" value="#{localeBean.language}" onchange="submit();" style="position: absolute; right: 0; top: 50px;">
<f:selectItem itemValue="en" itemLabel="English" />
<f:selectItem itemValue="hi" itemLabel="Hindi" />
</h:selectOneMenu>
</h:form>
</p:layoutUnit>
<p:layoutUnit position="west" id="leftPanel" size="225" header="Menu Item" resizable="false" closable="false" collapsible="true" gutter="6">
</p:layoutUnit>
<p:layoutUnit position="center" size="2500" maxSize="2500">
<ui:insert name="content">Put default content here, if any.</ui:insert>
</p:layoutUnit>
</p:layout>
</h:body>
</f:view>
</html>
Wenn ich entfernen Sie diese Vorlage aus dem oben Test.xhtml
Seite und verwenden Sie diese <f:view>
tag auf der Test.xhtml
Seite selbst, alles funktioniert einwandfrei und die Liste der ausgewählten Zeilen in die deleteMultiple()
Verfahren erhalten wird, richtig.
So, was mache ich falsch? Warum die Liste leer geworden, wenn die ja - Taste gedrückt wird, wenn die template-Seite ist umschlossen von <f:view>
? Ist es falsch? Wie dies zu erreichen? (<f:view>
wird verwendet, für die Lokalisierung der Anwendung, wie es gedacht werden kann).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein problem ist gelöst, wenn Sie ersetzen die
process="@this datatable"
in IhremconfirmDeleteMultiple
durchprocess="@this"
, die macht der button-Komponente verarbeitet werden. In der Tat brauchen Sie nicht, das Ajax-Prozess Ihre datatable, wenn Sie senden Sie die Bestätigung der Löschung, da die Werte für die Löschung bereits gespeichert sind in der bean-seit dem letzten Schritt (das ist der Hauptvorteil der view scope).Machen Ihre datatable an verarbeitet werden in deinem Ajax-request startet erneut die
setSelectedValues
setter, also der ursprüngliche Wert wird immer überschrieben durch die neue (leere) Auswahl.<f:view>
beteiligt ist?datatable
kann dann nicht gefunden werden und wird schlicht ignoriert. Nur halten<f:view>
im master-template als Sie hatte. Durch die Art und Weise, die<h:head>
im template-client ist fehl am Platz und dietransient
auf EJB-ist alarmierend. Loswerden von beiden.h:head
wie @BalusC sagt, befindet sich in der Vorlage. Ich kommentierte Vorlage Clients für Testzwecke. Meinst du @BalusC, dass, wennf:view
wird in der template-clientdatatable
kann nicht gefunden werden und es funktioniert, weil der das?