Sessions und Dynamische Dialoge in PRIMEFACES

DaBe1812

Bekanntes Mitglied
Hi,

ich benutze Primefaces 11 und spiele gerade mit dynamischen Dialogen.

Grundsätzlich soll folgendes passieren: der User hat eine Excel eingelesen und erhält eine Tabelle. Manche Zeilen haben Fehler, die der Nutzer erst noch korrigieren muss.
Für manche von den Fehlern muss sich ein Dialog öffnen, um den Nutzer bei der Behebung zu unterstützen.
Das ist die "Hauptseite":
HTML:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    template="../../layout.xhtml">

    <ui:define name="header">
        Hardwareimport
    </ui:define>

    <ui:define name="main">
        <div class="card">
            <h:form id="hwImportWizardFrm">

                <p:growl id="messages" sticky="false" showDetail="true" />

                <p:panel header="Importdaten" id="tablePanel">
                    <h:panelGrid columns="1" rendered="#{not empty hwimportwiz.hwImport.file}">
                        <p:dataTable id="importFileContent" var="line" value="#{hwimportwiz.hwImport.sheet.tableSheetContent}" scrollable="true"
                                tableStyle="width: auto;" rowStyleClass="#{line.get('error') eq '' ? 'good' : 'bad'}">
                            <p:column headerText="Fehler" field="get('error')" sortable="false" filterable="false" >
                                <p:commandButton icon="pi pi-search" value="TYP ELID" actionListener="#{hwimportwiz.getTypElid(line)}"
                                    styleClass="edit-button rounded-button ui-button-success"
                                    rendered="#{fn:containsIgnoreCase(line.get('error'), 'Typ nicht gefunden')}">
                                    </p:commandButton>
                            
                            </p:column>
                            <p:column headerText="ProIPS_Modell" field="get('ProIPS_Modell')" sortable="false" filterable="false" />
                            <p:columns value="#{hwimportwiz.hwImport.sheet.columns}" var="column" headerText="#{column.header}"
                                    field="get(column.property)" sortable="false" filterable="false"/>
                            <p:column headerText="Typ ELID" field="get('cmd_type_elid')" sortable="false" filterable="false" />
                        </p:dataTable>
                    </h:panelGrid>
                </p:panel>

            </h:form>
        </div>
    </ui:define>
</ui:composition>

Das ist ein Auszug aus der hwimportwiz-Bean:
Java:
package main.java.proips.hwImporter;

import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.poi.EncryptedDocumentException;
import org.primefaces.PrimeFaces;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.FlowEvent;
import org.primefaces.model.file.UploadedFile;

import main.java.proips.persistence.entities.CommandTranslateModel;
import main.java.proips.persistence.interfaces.CommandModellFactory;

@Named("hwimportwiz")
@RequestScoped
public class HwImportWizard implements Serializable {

    private static final long serialVersionUID = 1L;
    
    private boolean hasError = false;

    @Inject    private HwImport hwImport;
    @Inject private CommandModellTranslater modellTranslater;
    @Inject private CommandModellFactory commandModellFactory;
    
    private List<CommandTranslateModel> modelList;
    private String diaBezeichnung;
    private String diaTyp;
    private CommandTranslateModel selectedElid;
    

    @PostConstruct
    public void init() {
        modelList = commandModellFactory.getAllTranslations();
    }
    
    public void getTypElid(Map<String, Object> line) {
        String bezCol = TableSheetHelper.getColumn("bezeichnung", this.hwImport.getSheet().getColumns());
        String typCol = TableSheetHelper.getColumn("typ", this.hwImport.getSheet().getColumns());
        diaBezeichnung = (String) line.get(bezCol);
        diaTyp = (String) line.get(typCol);
        
        Map<String, Object> options = new HashMap<String, Object>();
        options.put("modal", true);
        options.put("resizable", false);
        PrimeFaces.current().dialog().openDynamic("typeelidchooser", options, null);
    }

//GETTER und SETTER
}

Die Funktion getTypElid wird aufgerufen und die Felder diaBezeichnung und diaTyp werden ordentlich befüllt. Wenn jetzt aber die typeelidchooser.xhtml geladen wird:
HTML:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core">

    <h:head>
        <title>Elid wählen</title>
        <style>
            html {
            font-size: 14px;
            }
        </style>
    </h:head>

    <h:body>
        <h:outputText value="Bezeichnung" />
        <p:inputText value="#{hwimportwiz.diaBezeichnung}" required="false" readonly="true" />
        <h:outputText value="Typ" />
        <p:inputText value="#{hwimportwiz.diaTyp}" required="false" readonly="true" />
    </h:body>

</html>
Dann sind die Felder diaBezeichnung und diaTyp null. Ich gehe mal davon aus, dass der Dialog eine neue Instanz von hwimportwiz öffnet. Wie baue ich das jetzt so, dass ich mich grundsätzlich im selben Bean befinde? Ich will ja grundsätzlich auch einen Wert aus dem Dialog an die Bean zurück geben. Das bringt mir ja nix, wenn die Rückgabe an eine andere Instanz passiert.

Danke schon mal für eure Hilfe.
 

DaBe1812

Bekanntes Mitglied
Ich bin endlich al dazu gekommen den Stackoverflow-Artikel zu lesen. Irgendwie klappt das gerade nur in der Freizeit, weil die Deadlines aktuell sehr straff sind.
Da steht ja dann genau das, was bei mir passiert ist, nämlich, dass ein komplett neuer Kontext geöffnet worden ist.
Ich denke, da schwenk ich wieder zurück auf p:dialog. Wobei der andere schöner zu warten ist.
 

DaBe1812

Bekanntes Mitglied
So, an der Baustelle auch mal ein wenig weiter gemacht.
Also der Primefaces Showcase ist an der Stelle richtig grottig, weil die die hälfte der Sourcen vergessen haben dran zu hängen. Aber glücklicherweise ist im GIT alles vollständig. ich habe jetzt eine Methode:
Java:
public void getTypElid(Map<String, Object> line) {
    String bezCol = TableSheetHelper.getColumn("bezeichnung", this.hwImport.getSheet().getColumns());
    String typCol = TableSheetHelper.getColumn("typ", this.hwImport.getSheet().getColumns());
    importBezeichnung = (String) line.get(bezCol);
    importTyp = (String) line.get(typCol);

    Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
    flash.setKeepMessages(true);
    flash.put("bezeichnung", importBezeichnung);
    flash.put("type", importTyp);

    Map<String, Object> options = new HashMap<String, Object>();
    options.put("modal", true);
    options.put("resizable", false);
    PrimeFaces.current().dialog().openDynamic("typeelidchooser", options, null);
}
So steht es in der Doku für die Übertragung via Flash. Leider kommt es auf der anderen Seite nicht an:
Java:
@PostConstruct
public void init() {
    Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
    bezeichnung = (String) flash.get("bezeichnung");
    type = (String) flash.get("type");
}
Die beiden Parameter sind null. Die Rückgabe funktioniert einwandfrei, bringt mir aber für das Problem nur so Semi etwas. Ich hab in der Primefaces Doku gefunden, dass dazu Mojarra mindestens 2.3.17 im Projekt sein soll. Dazu habe ich gefunden, dass Mojarra durch Jakarta-Faces abgelöst worden ist. Dieses habe ich jetzt in Version 4.0.1 in den Klassenpfad aufgenommen, aber die Werte bleiben null.
Ich kann auch in allen Tutorials zu Flash keinen Hinweis auf irgendwelche zu aktivierenden Klassen finden.
 

Ähnliche Java Themen


Oben