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

fiesematente

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
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
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
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;
    }
}
 

stg

Top Contributor
The execute attribute defines the component or components to be executed on the server.

Gemeint ist eine "JSF Komponente", also "irgendetwas, was von UIComponent erbt".

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

Code:
<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.
 

fiesematente

Mitglied
Ist das nicht eher ein Job für einen setPropertyActionListener?
Gemeint ist eine "JSF Komponente", also "irgendetwas, was von UIComponent erbt".

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

Code:
<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.

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 :-(
 

mihe7

Top Contributor
Du vermischst JSF-Managed Beans mit CDI Scopes, da kommt es ggf. zu Problemen.
Verwende @Named statt @ManagedBean.
 

stg

Top Contributor
...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.
 

Flown

Administrator
Mitarbeiter
Die Navigation in der Form würde ich mal so anlegen:
HTML:
<h:form id="myform">
und der ajax-call:
HTML:
<h:commandButton value="#{films.id}" action="#{ManagedBean.setFavorite(films.id)}">
    <f:ajax event="click" render = "myform:meineFilmID" />
</h:commandButton>
 

Flown

Administrator
Mitarbeiter
Oder wenn du der Form keine Id geben möchtest ginge das auch über den NamingContainer:
HTML:
<h:commandButton value="#{films.id}" action="#{ManagedBean.setFavorite(films.id)}">
    <f:ajax event="click" render=":#{component.namingContainer.parent.namingContainer.clientId}:meineFilmID"/>
</h:commandButton>
 

fiesematente

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>
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
pkm Frage wegen AJAX-Zugriff auf ein Servlet Allgemeines EE 1
S a4j:ajax Event wird 2 Mal gefeuert. Allgemeines EE 0
H Suche dynamische Ajax-Tabelle Allgemeines EE 2
MQue Ajax - Servlet Allgemeines EE 2
D AJAX oder Servlets Allgemeines EE 6
M "Auto Client-Request" oder Server-Push oder Ajax – Allgemeines EE 2
N JSP: Collection im Servlet überwachen (mit AJAX)? Allgemeines EE 5
W "Wie" nutzt ihr AjAx in euren Projekten? Allgemeines EE 4
N selectOneMenu - items über ajax Allgemeines EE 3
N Collection überwachen (Servlet + AJAX) Allgemeines EE 3
N JSF und AJAX - managedBean ist nicht im ServletContext Allgemeines EE 5
P AJAX Datei Upload Allgemeines EE 4
DStrohma Innerhalb eines Webservices die reine SOAP Nachricht ausgaben Allgemeines EE 2
T Methodenaufruf (der HTML erzeugt) innerhalb von JSP Allgemeines EE 5
M Wie zeige ich Attribute eines Objekts innerhalb einer JSP an Allgemeines EE 2
isowiz Positionierung innerhalb eines <h:commandLink> Allgemeines EE 7
clemson [Struts] Innerhalb Action auf form zugreifen Allgemeines EE 4
B eine vom Admin hochgeladene csv -Datei in der Datatable auch von jedem User sichtbar Allgemeines EE 0
G Primefaces Zeile in DataTable auswählen Allgemeines EE 1
G JSF Datenstruktur für DataTable Allgemeines EE 2
S Primefaces DataTable und Vererbung Allgemeines EE 1
Raidri [SEAM] rich:dataTable sortBy Problem Allgemeines EE 6
W PrimeFaces datatable zentrieren Allgemeines EE 15
J JSF2.0 / Doppelklick DataTable / Richfaces Allgemeines EE 4
P <h:dataTable> doppelte ausgabe Allgemeines EE 8
D Liste für dataTable (JSF) manuell füllen Allgemeines EE 2
M h:datatable und Info auf leere Liste Allgemeines EE 2
M JSF datatable ineinander schachteln Allgemeines EE 6
N JSF - Frage zu Managed Beans und DataTable Allgemeines EE 4
J JSF: dataTable nebeneinander anordnen Allgemeines EE 5
N JSF + Facelets: Datatable wird nicht angezeigt Allgemeines EE 1
F DataTable mit Checkboxen Allgemeines EE 2
K probleme mit <h:dataTable> Allgemeines EE 2
O Anzeigen mehrerer columns in einer DataTable Allgemeines EE 4
K Datatable Löschen Fehler Allgemeines EE 6
S JSF datatable mit buttons Werte übergeben Allgemeines EE 5
smitty Farbe der Tabellenzellen in "<t:dataTable>" Allgemeines EE 5
F Index im Datatable Allgemeines EE 4
P JSF Datatable und löschen Allgemeines EE 2
C Seltsames Verhalten von JSF DataTable Allgemeines EE 2

Ähnliche Java Themen

Neue Themen


Oben