JSF ajax innerhalb DataTable und verschachtelte EL (Brauch dringend hilfe)

Diskutiere ajax innerhalb DataTable und verschachtelte EL (Brauch dringend hilfe) im Allgemeines EE Forum; Hallo zusammen. Ich bin neu hier, und verzweifel an folgendem Problem. Ich erzeuge einen <h:commandButton>, welcher sich innerhalb einer...

  1. fiesematente
    fiesematente Neues Mitglied
    Hallo zusammen.
    Ich bin neu hier, und verzweifel an folgendem Problem. Ich erzeuge einen <h:commandButton>, welcher sich innerhalb einer <h:dataTable> befindet.
    in der jeweiligen Celle, befindet sich die eine ID welche automatisiert mitgegeben wird.
    Wenn ich jedoch auf diesen Button drücke wird nicht wie gewollt die Methode "setFavourite()" mit dem Parameter der ID aufgerufen.

    Hab schon im Debugger geguckt und es wird einfach nicht ausgegeben. Hab das Internet durchsucht und schon verschiedene andere Arten versucht, aber ich bin mit meinem Latein am Ende.

    Ich arbeite mit der NetBeans IDE 8.2 und dem GlassFish Server 4.1.1.

    Hier der Teil welcher nicht funktioniert:
    HTML:
                <h:outputText value="#{ManagedBean.favorite}" id="meineFilmID"/>
                <h:dataTable value="#{ManagedBean.filmList}" id="filmeTabelle" var="films"
                       styleClass="table-css"
                       headerClass="table-header-css"
                       rowClasses="order-table-odd-row,order-table-even-row"
               >

                    <!-- column -->
                    <h:column>
                        <!-- column header -->
                        <f:facet name="header">Title</f:facet>
                        <!-- row content -->
                        #{films.title}
                     </h:column>

                    <h:column>
                        <f:facet name="header">Date</f:facet>
                        #{films.date}
                    </h:column>

                    <h:column>
                        <f:facet name="header">Genre</f:facet>
                        #{films.genre}
                    </h:column>

                    <h:column>
                        <f:facet name="header">Director</f:facet>
                        #{films.director}
                    </h:column>

                    <h:column>
                        <f:facet name="header">Actor</f:facet>
                        #{films.actor}
                    </h:column>

                    <h:column>
                        <f:facet name="header">ID/Favorite</f:facet>
                        <h:commandButton value="#{films.id}">
                            <f:ajax event="click" execute="#{ManagedBean.SetFavorite(films.id)}" render = "meineFilmID" />
                        </h:commandButton>
                    </h:column>

                </h:dataTable>
    --------------------------------------------------------------------------------------

    Falls Bedarf da ist, hier nochmal alles:
    index.xhtml
    HTML:
    <?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 xmlns="http://www.w3.org/1999/xhtml"
         xmlns:h="http://xmlns.jcp.org/jsf/html"
         xmlns:f="http://xmlns.jcp.org/jsf/core"
    >
         
        <h:head>
            <title>Facelet Title</title>
            <style>
                table, th, td{
                    border-collapse:collapse;
                    border:1px solid #000000;
                }
               
                .order-table{
                }

                .order-table-header{
                    text-align:center;
                    color: #ffffff;
                    background:none repeat scroll 0 0 #000000;
                    padding:16px;
                }

                .order-table-odd-row{
                    text-align:center;
                    background:none repeat scroll 0 0 #FFFFFFF;
                }

                .order-table-even-row{
                    text-align:center;
                    background:none repeat scroll 0 0 #F9F9F9;
                }
            </style>
        </h:head>
        <h:body>
            <!-- formular -->
            <h:form>
                <!-- Radio Button -->
                <h:selectOneMenu id="fiterAttribute" value="#{ManagedBean.filterAttribut}">
                    <f:selectItem itemValue="title" itemLabel="Title" />
                    <f:selectItem itemValue="date" itemLabel="Date" />
                    <f:selectItem itemValue="genre" itemLabel="Genre" />
                    <f:selectItem itemValue="director" itemLabel="Director" />
                    <f:selectItem itemValue="actor" itemLabel="Actor" />
                </h:selectOneMenu>
                <h:outputText value="#{ManagedBean.filterValue}" id="meinText"/>
                <br />
                <!--  -->
                <h:inputText id="filterValue" value="#{ManagedBean.filterValue}"></h:inputText>
                <br />
                <h:commandButton value="filtern" action="#{ManagedBean.showMovies()}">
                    <f:ajax execute = "fiterAttribute filterValue" render = "filmeTabelle meinText" />
                </h:commandButton>
                <!-- Table -->
                <h:outputText value="#{ManagedBean.favorite}" id="meineFilmID"/>
                <h:dataTable value="#{ManagedBean.filmList}" id="filmeTabelle" var="films"
                       styleClass="table-css"
                       headerClass="table-header-css"
                       rowClasses="order-table-odd-row,order-table-even-row"
               >

                    <!-- column -->
                    <h:column>
                        <!-- column header -->
                        <f:facet name="header">Title</f:facet>
                        <!-- row content -->
                        #{films.title}
                     </h:column>

                    <h:column>
                        <f:facet name="header">Date</f:facet>
                        #{films.date}
                    </h:column>

                    <h:column>
                        <f:facet name="header">Genre</f:facet>
                        #{films.genre}
                    </h:column>

                    <h:column>
                        <f:facet name="header">Director</f:facet>
                        #{films.director}
                    </h:column>

                    <h:column>
                        <f:facet name="header">Actor</f:facet>
                        #{films.actor}
                    </h:column>

                    <h:column>
                        <f:facet name="header">ID/Favorite</f:facet>
                        <h:commandButton value="#{films.id}">
                            <f:ajax event="click" execute="#{ManagedBean.setFavorite(films.id)}" render = "meineFilmID" />
                        </h:commandButton>
                    </h:column>

                </h:dataTable>
                <h:inputText id="favoriteInput" value="#{ManagedBean.favorite}"></h:inputText>
                <h:commandButton value="TestSubmit">
                    <f:ajax execute = "favoriteInput" render = "testText" />
                </h:commandButton>
                <h:outputText value="#{ManagedBean.favorite}" id="testText"/>

            </h:form>
           
        </h:body>
    </html>

     
    ManagedBean
    Code (Java):
    /*
    * WebTechnologien Übung2
    */

    package jsfBackend;

    import TestFassade.TestBackground;
    import java.io.Serializable;
    import javax.enterprise.context.SessionScoped;
    import javax.faces.bean.ManagedBean;

    /**
    * @author Mustermann
    */

    @ManagedBean(name="ManagedBean", eager = true)
    @SessionScoped
    public class NewJSFManagedBean implements Serializable{

        private static final long serialVersionUID = 1L;
       
        private Films[] filmList;
        private String filterAttribut;
        private String filterValue;
        private String favorite;

        public String getFilterAttribut(){
            System.out.println("ausgabe (getFilterAttribut): "+filterAttribut);
            return filterAttribut;
        }
        public void setFilterAttribut(String filterAttribut){
            System.out.println("ausgabe (setFilterAttribut)(vorher): "+filterAttribut);
            this.filterAttribut = filterAttribut;
            System.out.println("ausgabe (setFilterAttribut)(nachher): "+filterAttribut);
        }
        public String getFilterValue(){
            System.out.println("ausgabe (getFilterValue): "+filterValue);
            return filterValue;
        }
        public void setFilterValue(String filterValue){
            System.out.println("ausgabe (setFilterValue)(vorher): "+filterValue);
            this.filterValue = filterValue;
            System.out.println("ausgabe (setFilterValue)(nachher): "+filterValue);
        }
        public Films[] getFilmList(){
            System.out.println("ausgabe (setFilmList): "+filmList);
            return filmList;
        }
        public void setFilmList(String[][] filmArray){
            System.out.println("ausgabe (setFilmList)(vorher):  "+filmList);
            this.filmList = arrayToFilms(filmArray);
            System.out.println("ausgabe (setFilmList)(nachher):  "+filmList);
        }
        public String getFavorite(){
            //TODO Favoriten Setten
            System.out.println("ausgabe (getFavorite):  "+favorite);
            return favorite;
        }
        public void setFavorite(String filmId){
            //TODO Favoriten Setten
            System.out.println("ausgabe (setFavorite)(vorher):  "+favorite);
            this.favorite = filmId;
            System.out.println("ausgabe (setFavorite)(nachher):  "+favorite);
        }
        public void external_setFavorite(){
            //setFavorite("hallo Weltos");
        }

       
       
        public void showMovies(){
            System.out.println("ausgabe_METHODE (showMovies): filterAttribut: \""+filterAttribut+"\"filterValue: \""+filterValue+"\"");
            setFilmList(TestBackground.getList(filterAttribut, filterValue));

        }
           
        public Films[] arrayToFilms(String[][] filmListTest){
            System.out.println("ausgabe_METHODE (arrayToFilms(--->)):  "+filmListTest);
            Films[] Liste= new Films[filmListTest.length];
            for(int i=0; i<filmListTest.length; i++){
                Liste[i] = new Films(filmListTest[i][0],filmListTest[i][1],filmListTest[i][2],filmListTest[i][3],filmListTest[i][4],filmListTest[i][5]);
            }
            return Liste;
        }
     
       
    }
     
    Films.java
    Code (Java):
    /*
    * To change this license header, choose License Headers in Project Properties.
    * To change this template file, choose Tools | Templates
    * and open the template in the editor.
    */

    package jsfBackend;

    /**
    *
    * @author Mustermann
    */

    public class Films{
        String title;
        String date;
        String genre;
        String director;
        String actor;
        String id;

        public Films(String title, String date,
                        String genre, String director, String actor, String id){

                this.title = title;
                this.date = date;
                this.genre = genre;
                this.director = director;
                this.actor = actor;
                this.id = id;
        }

        public String getTitle(){
            return this.title;
        }
        public String getDate(){
            return this.date;
        }
        public String getGenre(){
            return this.genre;
        }
        public String getDirector(){
            return this.director;
        }
        public String getActor(){
            return this.actor;
        }
        public String getId(){
            return this.id;
        }

        public void setTitle(String x){
            this.title = x;
        }
        public void setDate(String x){
            this.date = x;
        }
        public void setGenre(String x){
            this.genre = x;
        }
        public void setDirector(String x){
            this.director = x;
        }
        public void setActor(String x){
            this.actor = x;
        }
        public void setId(String x){
            this.id = x;
        }
    }
     
    TestBackground.java
    Code (Java):
    /*
    * To change this license header, choose License Headers in Project Properties.
    * To change this template file, choose Tools | Templates
    * and open the template in the editor.
    */

    package TestFassade;

    /**
    *
    * @author Mustermann
    */

    public class TestBackground {
        static String filterAttribut = "";
        static String[][] FILM_LIST_TEST = {{"Terminator", "01.01.1990", filterAttribut, "Arnold", "Schwarzenegger", "1"}, {"Eis am Stiel", "01.01.1970", filterAttribut, "Tommy", "Thompson", "2"}};
        static String[][] FILM_LIST_TEST2 = {{"TitleMan", "01", filterAttribut, "Arnold", "Schwarzenegger", "3"}, {"B", "02", filterAttribut, "Tommy", "Thompson", "4"}};
        static String[][] FILM_LIST_TEST3 = {{"DateMan", "01", filterAttribut, "Arnold", "Schwarzenegger", "5"}, {"B", "02", filterAttribut, "Tommy", "Thompson", "6"}};
        static String[][] FILM_LIST_TEST4 = {{"GenreMan", "01", filterAttribut, "Arnold", "Schwarzenegger", "7"}, {"B", "02", filterAttribut, "Tommy", "Thompson", "8"}};
        static String[][] FILM_LIST_TEST5 = {{"DirectorMan", "01", filterAttribut, "Arnold", "Schwarzenegger", "9"}, {"B", "02", filterAttribut, "Tommy", "Thompson", "10"}};
        static String[][] FILM_LIST_TEST6 = {{"ActorMan", "01", filterAttribut, "Arnold", "Schwarzenegger", "11"}, {"B", "02", filterAttribut, "Tommy", "Thompson", "12"}};
       
        public static String[][] getList(String filter_Attribut, String filterValue){
            filterAttribut = filter_Attribut;
            String[][] filmList;
            switch(filterAttribut){
                case "title":
                    filmList = FILM_LIST_TEST2;
                    break;
                case "date":
                    filmList = FILM_LIST_TEST3;
                    break;
                case "genre":
                    filmList = FILM_LIST_TEST4;
                    break;
                case "director":
                    filmList = FILM_LIST_TEST5;
                    break;
                case "actor":
                    filmList = FILM_LIST_TEST6;
                    break;
                default:
                    filmList = FILM_LIST_TEST;
            }
            return filmList;
        }
    }
     
     
  2. Flown
    Flown Administrator Mitarbeiter
    Ist das nicht eher ein Job für einen setPropertyActionListener?
     
  3. stg
    stg Bekanntes Mitglied
    Gemeint ist eine "JSF Komponente", also "irgendetwas, was von UIComponent erbt".

    Demnach sollte es statt
    Code (Text):

    <h:commandButton value="#{films.id}">
       <f:ajax event="click" execute="#{ManagedBean.setFavorite(films.id)}" render = "meineFilmID" />
    </h:commandButton>
     
    vermutlich eher so aussehen:

    Code (Text):

    <h:commandButton value="#{films.id}" action="#{ManagedBean.setFavorite(films.id)}">
      <f:ajax event="click" execute="@this" render="meineFilmID" />
    </h:commandButton>
     
    Möglicherweise sind noch weitere Anpassungen notwendig (habe das nun frei Hand getippt und keine Möglichkeit irgendwas zu testen), aber das sticht mir hier als erstes ins Auge.
     
  4. fiesematente
    fiesematente Neues Mitglied
    Das hat leider beides nicht funktioniert.
    Dazu kommt, das egal wie ich's versuche, 15 mal die Methode getFilmList() aufgerufen wird (aus "filmList" bezieht auch die <h:dataTable> ihre Daten).
    Hab nun auch einen <h:CommandButton> sammt <f:ajax> von ausserhalb des <h:dataTable>s genommen und da rein gesetzt, aber selbst dann macht er nichts anderes als 15 mal getFilmList aufzurufen.

    Ich bin am verzweifeln :-(
     
  5. mihe7
    mihe7 Aktives Mitglied
    Du vermischst JSF-Managed Beans mit CDI Scopes, da kommt es ggf. zu Problemen.
    Verwende @Named statt @ManagedBean.
     
  6. stg
    stg Bekanntes Mitglied
    ...oder, falls es besondere Gründe geben sollte, dass du eine JSF ManagedBean haben musst (was aber eher unwahrscheinlich ist), kannst du natürlich auch die entsprechende JSF SessionScoped Annotation verwenden.

    Seit JSF 2.3 ist @ManagedBean sogar als deprecated markiert, glaube ich.
     
  7. Flown
    Flown Administrator Mitarbeiter
    Die Navigation in der Form würde ich mal so anlegen:
    Code (HTML5):
    <h:form id="myform">
    und der ajax-call:
    Code (HTML5):
    <h:commandButton value="#{films.id}" action="#{ManagedBean.setFavorite(films.id)}">
        <f:ajax event="click" render = "myform:meineFilmID" />
    </h:commandButton>
     
  8. Flown
    Flown Administrator Mitarbeiter
    Oder wenn du der Form keine Id geben möchtest ginge das auch über den NamingContainer:
    Code (HTML5):
    <h:commandButton value="#{films.id}" action="#{ManagedBean.setFavorite(films.id)}">
        <f:ajax event="click" render=":#{component.namingContainer.parent.namingContainer.clientId}:meineFilmID"/>
    </h:commandButton>
     
  9. fiesematente
    fiesematente Neues Mitglied
    Hab es geschafft :).
    Die action im commandButton war der richtige Tipp (Danke nochmals an @stp und auch @Flown ).
    Das problem war aber das event-Attribut. Damit funkitioniert es aus irgendeinem Grund nicht.
    jetzt sieht es wie folgt aus:

    HTML:
                <h:commandButton value="#{films.id}" action="#{ManagedBean.saveFavorite(films.id)}">
                    <f:ajax render="testText" />
                </h:commandButton>
     

Die Seite wird geladen...

ajax innerhalb DataTable und verschachtelte EL (Brauch dringend hilfe) - Ähnliche Themen

Externer API & Ajax & Google Script
Externer API & Ajax & Google Script im Forum HTML / CSS / JScript / AJAX
Aufgabe JScript und AJAX (Schüler)
Aufgabe JScript und AJAX (Schüler) im Forum Private Stellangebote und Stellensuche von Usern
JavaScript, AJAX Aufgabe
JavaScript, AJAX Aufgabe im Forum Private Stellangebote und Stellensuche von Usern
HTTP-Stream auf Ajax umbauen
HTTP-Stream auf Ajax umbauen im Forum Java Basics - Anfänger-Themen
JSF/JEE6 asynchronie Statusmeldungen per ajax
JSF/JEE6 asynchronie Statusmeldungen per ajax im Forum Web Tier
Thema: ajax innerhalb DataTable und verschachtelte EL (Brauch dringend hilfe)