Tabelle wird nicht aktualisiert

Diskutiere Tabelle wird nicht aktualisiert im Web Tier Forum; Hallo Leute, ich bin neu hier und brauche eure Hilfe. Ich weiß nicht mehr weiter! Also ich habe eine JSF-Seite, bei der man Personen (Vorname,...

  1. world90
    world90 Neues Mitglied
    Hallo Leute,

    ich bin neu hier und brauche eure Hilfe. Ich weiß nicht mehr weiter!

    Also ich habe eine JSF-Seite, bei der man Personen (Vorname, Nachname, Spitzname) einer DB hinzufügen kann.
    Auf dieser Seite wird auch eine Tabelle mit allen Personen angezeigt.

    Wenn ich nun jemand hinzufüge, navigiere ich direkt zur selben Seite. Diese sollte sich eigentlich die Liste der Personen erneut laden und nun aktualisiert ausgeben. Passiert aber nicht!

    Bean:
    Code (Java):
    package net.gerwald.strabu.bean;

    import java.io.IOException;
    import java.util.List;


    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ViewScoped;


    import net.gerwald.strabu.db.DarstellerDao;
    import net.gerwald.strabu.entity.Darsteller;




    @ManagedBean
    @ViewScoped
    public class DarstellerBean {
         
        private String vorname;
        private String nachname;
        private String spitzname;
       
        List<Darsteller> darsteller;
        private DarstellerDao dDao;
       
        public DarstellerBean(){
            dDao = new DarstellerDao();
            darsteller = dDao.getAlleDarsteller();
        }
         
        public String hinzu() throws IOException {
           
            Darsteller darsteller = new Darsteller();
            darsteller.setNachname(nachname);
            darsteller.setVorname(vorname);
            darsteller.setSpitzname(spitzname);
           
            dDao.saveDarsteller(darsteller);
           
            return "darsteller.xhtml";
        }


        public String getVorname() {
            return vorname;
        }


        public void setVorname(String vorname) {
            this.vorname = vorname;
        }


        public String getNachname() {
            return nachname;
        }


        public void setNachname(String nachname) {
            this.nachname = nachname;
        }


        public String getSpitzname() {
            return spitzname;
        }


        public void setSpitzname(String spitzname) {
            this.spitzname = spitzname;
        }


        public List<Darsteller> getDarsteller() {
            return darsteller;
        }


        public void setDarsteller(List<Darsteller> darsteller) {
            this.darsteller = darsteller;
        }
       
    }
    Face:
    Code (Java):
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
    <h:outputStylesheet library="css" name="table-style.css"/>
    <title>Darsteller</title>
    </h:head>
    <h:body>
    <h:form>
    Straußbu hinzufügen<br/><br/><br/>


    Bitte vorher GENAU prüfen, ob die hinzuzufügende Person in der Liste schon vorhanden ist!!!<br/><br/>


    <h:dataTable value="#{darstellerBean.darsteller}" var="d"
        styleClass="order-table"
        headerClass="order-table-header"
        rowClasses="order-table-odd-row,order-table-even-row">
       
        <h:column>
            <f:facet name="header">Nachname</f:facet>
            <h:outputText value="#{d.nachname}" />
        </h:column>
        <h:column>
            <f:facet name="header">Vorname</f:facet>
            <h:outputText value="#{d.vorname}" />
        </h:column>
        <h:column>
            <f:facet name="header">Spitzname</f:facet>
            <h:outputText value="#{d.spitzname}" />
        </h:column>
    </h:dataTable>
    <br/><br/>


    <h:panelGrid columns="3">


    Vorname:<br />
    <h:inputText value="#{darstellerBean.vorname}" required="true" requiredMessage="Vorname erforderlich!" label="Vorname" id="vorname">
    </h:inputText>
    <h:message for="vorname" style="color:red" />
           
    Nachname:<br/>
    <h:inputText value="#{darstellerBean.nachname}" required="true" requiredMessage="Nachname erforderlich!" label="Nachname" id="nachname">
    </h:inputText>
    <h:message for="nachname" style="color:red" />


    Spitzname:<br/>
    <h:inputText value="#{darstellerBean.spitzname}" required="true" requiredMessage="Spitzname erforderlich - im Zweifel bitte Vorname" label="Spitzname" id="spitzname">
    </h:inputText>
    <h:message for="spitzname" style="color:red" />


    <h:commandButton value="Hinzufügen" action="#{darstellerBean.hinzu}"/>
    <h:button outcome="upload" value="Fertig"/>


    </h:panelGrid>


    </h:form>


    </h:body>
    </html>

    Danke für eure Hilfe!
     
  2. Vielleicht hilft dir dieser Java-Kurs hier weiter --> (hier klicken)
  3. AntiMuffin
    AntiMuffin Mitglied
    Hallo,
    dein Problem ist das du auf der gleichen Seite bleibst (im gleichen View), aus diesem Grund überlebt das Bean, da es Viewscoped ist. Du solltest also @RequestScoped benutzen, wenn mich nicht alles irrt.

    Gruß,
    AntiMuffin
     
    Zuletzt bearbeitet: 25. Apr. 2015
  4. AntiMuffin
    AntiMuffin Mitglied
    Noch ein Nachtrag:
    Es wäre Effektiver wenn du einfach die Daten mit "darsteller = dDao.getAlleDarsteller();" neu laden würdest und null zurück geben würdest. Da der Server dann nur die Daten neu laden muss und nicht das Bean komplett neu erstellen muss (und dabei die Daten neu läd).
     
  5. world90
    world90 Neues Mitglied
    Hallo AntiMuffin,

    vielen Dank für deine schnelle Antwort.
    Ich habe es gerade mit @RequestScope versucht und leider funktioniert es trotzdem nicht.

    Deinen Nachtrag habe ich jetzt auf Anhieb nicht verstanden, sorry; Wenn ich für die Liste null ist, geht doch garnichts?

    Gruß
    Mathias
     
  6. AntiMuffin
    AntiMuffin Mitglied
    Nein ich meinte:
    Code (Java):

    package net.gerwald.strabu.bean;
     
    import java.io.IOException;
    import java.util.List;
     
     
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ViewScoped;
     
     
    import net.gerwald.strabu.db.DarstellerDao;
    import net.gerwald.strabu.entity.Darsteller;
     
     
     
     
    @ManagedBean
    @ViewScoped
    public class DarstellerBean {
     
        private String vorname;
        private String nachname;
        private String spitzname;
     
        List<Darsteller> darsteller;
        private DarstellerDao dDao;
     
        public DarstellerBean(){
            dDao = new DarstellerDao();
            darsteller = dDao.getAlleDarsteller();
        }
     
        public String hinzu() throws IOException {
     
            Darsteller darsteller = new Darsteller();
            darsteller.setNachname(nachname);
            darsteller.setVorname(vorname);
            darsteller.setSpitzname(spitzname);
     
            dDao.saveDarsteller(darsteller);
            darsteller = dDao.getAlleDarsteller(); // Daten neu laden
            return null; // Auf dieser Seite bleiben
        }
     
     
        public String getVorname() {
            return vorname;
        }
     
     
        public void setVorname(String vorname) {
            this.vorname = vorname;
        }
     
     
        public String getNachname() {
            return nachname;
        }
     
     
        public void setNachname(String nachname) {
            this.nachname = nachname;
        }
     
     
        public String getSpitzname() {
            return spitzname;
        }
     
     
        public void setSpitzname(String spitzname) {
            this.spitzname = spitzname;
        }
     
     
        public List<Darsteller> getDarsteller() {
            return darsteller;
        }
     
     
        public void setDarsteller(List<Darsteller> darsteller) {
            this.darsteller = darsteller;
        }
     
    }
     
    P.S. Dein DarstellerDao ist doch ein Service zum Anlegen, bekommen der Darsteller, usw. Für einen solchen Service solltest du EJB's verwenden und JPA zum für den Datenbankzugriff.
     
    Zuletzt bearbeitet: 25. Apr. 2015
  7. world90
    world90 Neues Mitglied
    Danke für die Erklärung!

    Ich habe auch das eben probiert und es funktioniert leider nicht - ich verzweifele gerade ;(

    Allerdings kann ich nicht noch einmal mehr in die hinzu()-Methode hinein debuggen.

    EJB werde ich auch noch nutzen. Für den DB-Zugriff verwende ich Hibernate.
     
  8. AntiMuffin
    AntiMuffin Mitglied
    Naja wenn das nicht Funktioniert:
    - Werden denn die Daten überhaupt in die Datenbank geschrieben?
    - Wie sieht deine DarstellerDao Klasse aus ?
    - Wird hinzu () überhaupt aufgerufen?
    - Müssen im onAction im EL die 2 Klammern sein ?
    - Wieso kein JPA ? :O

    Stell mal das Logging Level auf FINE, dann siehst du im Server Protokoll was genau passiert, auch wann er daten schreibt und liest, in JPA geht das so (folgendes in die PU):
    <property name="eclipselink.logging.level" value="FINE">
    Bezweifle das das mit Hibernate funktioniert, aber evtl gibt es etwas wie:
    <property name="hibernate.logging.level" value="FINE">
     
    Zuletzt bearbeitet: 25. Apr. 2015
  9. world90
    world90 Neues Mitglied
    - Ja, die Daten werden definitiv in die DB geschrieben
    - DarstellerDao siehe unten
    - Vermutlich wird die Methode aufgerufen, da nur in ihr die Daten in die DB geschrieben werden durch die DarstellerDao
    - Ich weiß nicht, welche Klammern du meinst und weiß nicht, was EL sein soll
    - Die machen doch im Endeffekt das Gleiche, nur Hibernate habe ich schon oft verwendet und nie Probleme mit gehabt.

    Ich werde gleich mal wg. des Logging-Levels schauen.

    DarstellerDao:
    Code (Java):
    package net.gerwald.strabu.db;

    import java.util.List;


    import net.gerwald.strabu.entity.Darsteller;


    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.Transaction;


    public class DarstellerDao {


        public Darsteller getDarstellerById(Integer id) {
            Session session = InitSessionFactory.getInstance().getCurrentSession();
            Transaction tx = session.beginTransaction();


            String hql = "SELECT d FROM Darsteller as d WHERE d.id = :darsteller_id";
            Query query = session.createQuery(hql);
            query.setParameter("darsteller_id", id);
            Darsteller darsteller = (Darsteller) query.uniqueResult();
           
            tx.commit();
           
            return darsteller;
        }
       
        public void updateDarsteller(Darsteller darsteller){
            Session session = InitSessionFactory.getInstance().getCurrentSession();
            Transaction tx = session.beginTransaction();


            session.update(darsteller);
           
            tx.commit();
        }
       
        public List<Darsteller> getAlleDarsteller() {
           
            Session session = InitSessionFactory.getInstance().getCurrentSession();
            Transaction tx = session.beginTransaction();


            @SuppressWarnings("unchecked")
            List<Darsteller> darsteller = session.createQuery("SELECT d FROM Darsteller as d ORDER BY d.nachname").list();
           
            tx.commit();
           
            return darsteller;
        }
       
        public void saveDarsteller(Darsteller darsteller){
            Session session = InitSessionFactory.getInstance().getCurrentSession();
            Transaction tx = session.beginTransaction();
           
            session.save(darsteller);
           
            tx.commit();
        }


    }


     
    PS: Glaube nicht, dass es an dem DB-Zugriff liegt. Eher an der Bean?!
     
    Zuletzt bearbeitet: 26. Apr. 2015
  10. AntiMuffin
    AntiMuffin Mitglied
    Also EL ist in der xhtml Datei immer das #{}, aber da die Methode aufgerufen wird ist das egal.
    Naja ich wüste nicht wieso es an der Bean liegen sollte o_O
    Du lädst ja die Daten neu in die Liste rein danach sollten die neuen Daten da sein :O

    Also ich würde als erstes den Server neu starten und danach versuchen zu debuggen oder das Logging auf fein zu stellen :)
     
Die Seite wird geladen...

Tabelle wird nicht aktualisiert - Ähnliche Themen

Tabelle wird bei Betätigung des Button nicht befüllt
Tabelle wird bei Betätigung des Button nicht befüllt im Forum AWT, Swing, JavaFX & SWT
Gui - Löschbutton in Tabelle anzeigen, die mittels MySQL Abfrage gefüllt wird
Gui - Löschbutton in Tabelle anzeigen, die mittels MySQL Abfrage gefüllt wird im Forum AWT, Swing, JavaFX & SWT
Tabelle wird nicht richtig dargestellt
Tabelle wird nicht richtig dargestellt im Forum Allgemeine Java-Themen
Nur der letzte Datensatz wird in Tabelle geschrieben
Nur der letzte Datensatz wird in Tabelle geschrieben im Forum Datenbankprogrammierung
JTable- Meine Tabelle der Klasse JTable wird nur bedingt angezeigt
JTable- Meine Tabelle der Klasse JTable wird nur bedingt angezeigt im Forum AWT, Swing, JavaFX & SWT
Thema: Tabelle wird nicht aktualisiert