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).

InformationsquelleAutor Tiny | 2013-08-27
Schreibe einen Kommentar