JSF ActionListener wird ausgeführt, aber ändert den Wert nicht.

Headhunter_X

Mitglied
Hallo,

ich versuche mich gerade an ActionListenern (JSF 1.2).
Dazu habe ich folgenden Listener programmiert:

Wenn ich auf den Button Klicke, soll er den Text für das OutputLabel ändern und ausgeben.
Sobald ich den Button geklickt habe, springt er auch in die Methode und findet auch die korrekte
Komponente. Nur leider wird der Wert nicht geändert.



Java:
import java.util.Iterator;
import java.util.List;
import javax.faces.component.UIComponent;
import javax.faces.component.html.*;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;


public class ActionListener1 implements ActionListener
{
    public void processAction(ActionEvent event) throws AbortProcessingException
    {

        System.out.println("########## ActionListener betreten.");

        HtmlOutputLabel text = null;

        List components = event.getComponent().getParent().getChildren();
        for(Iterator iter = components.iterator(); iter.hasNext();)
        {
            UIComponent element = (UIComponent)iter.next();
            if(element.getId().equals("outme"))
            {
                System.out.println("TextArea gefunden!");
                text = (HtmlOutputLabel)element;
            }
        }
        text.setValue("Funzt.");
    }
}

JSP-Seite:

HTML:
<h:form id="form1">
          <h:outputLabel value="" id="outme"></h:outputLabel>
          <p><h:commandButton styleClass="button"  value="Antrag absenden" id="save" action="success">
             <f:actionListener type="ActionListener1"></f:actionListener>
              </h:commandButton></p>
</h:form>
 
Du meinst, wenn man value ganz raus lässt? Hab ich versucht, geht aber nicht.
Dann hab ich den value einfach mal standardmäßig mit dem Wert "neu" gefüllt, wenn die Seite
aufgerufen wird. Wenn ich dann den Button drücke ändert er den Wert auch dann nicht. ;(
 
ich rede leider einmal mehr zu einem Thema in dem ich gerade gar nicht drin bin, nicht testen kann,
aber kann es sein, dass ein 'h😱utputLabel' überhaupt keine gesteuerte Kompnente ist?
deine UIComponent-Schleife ist ja auch reichlich fragwürdig,

wie sieht es mit Code a la
<h😱utputLabel id="usernameLabel" for="username" value="#{bundle.usernameLabel}" />
JSF HTML Tag Reference - Output Label
aus?
was auch immer alles dazugehört, in diesem Beispiel ist vielleicht gar von einem eher unveränderlichen Ressource-Bundle die Rede, aber allgemein kann man mit #{} doch sicher auch andere Variablen ansprechen,
dann musst du 'nur' irgendwo ein Feld mit dem richtigen Wert befüllen und dass im JSF berücksichtigen

------

dass es HtmlOutputLabel mit setValue() direkt als Quellcode gibt und "outme" wirklich gefunden wird,
spricht ein wenig dafür, dass deine Variante doch gehen könnte,
anderseits habe ich bisher keinen Internet-Link zu HtmlOutputLabel mit setValue() gefunden,
du versuchst da etwas rein ins Blaue, richtig?
 
Ich hab das Beispiel aus einem Buch und im Netz hab ich solche Beispiele auch gefunden.
Er erkennt ja im ActionListener die Komponenten nur ohne den Wert zu ändern.
Ich hab das auch schon mit einem CommandButton versucht und hab das gleiche Resultat.
 
Hallo,

ja ich hab das Projekt nochmal redeployed usw. Jetzt funktioniert es auch.

Aber ich hab eine weitere Frage, wenn ich beim CommandButton dem Action-Attribut eine Methode (speichern) verpasse:

HTML:
<h:form id="form1">
          <h:outputLabel value="" id="outme"></h:outputLabel>
          <p><h:commandButton styleClass="button"  value="Antrag absenden" id="save" action="#{Controller.speichern}">
             <f:actionListener type="ActionListener1"></f:actionListener>
              </h:commandButton></p>
</h:form>

Da wird der Wert dann nicht mehr geändert. Obwohl die Methode als Rückgabewert ebenfalls success
zurück gibt und das so auch in der faces-config eingetragen ist.

Controller:
Java:
......
public String speichern()
{
    //Andere Operationen
    ....

    return "success";
}
 

Zurück
Oben