ValueChangeListener не работает - PullRequest
       39

ValueChangeListener не работает

2 голосов
/ 29 августа 2010

Это мой код в моем управляемом бине: -

<?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://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <center>
            <h:form>
                <h2> <u>Select Fruit(s). </u> </h2>

                <!-- Value Change Listener is entirely superflous. You can make a full blown project without requiring the need to ever use this...This is
                just for demo purpose..-->

                <h:selectManyMenu onchange="document.forms[0].submit();" style="height: 200px;font-size: 1.5em;width: 200px;"   >
                    <f:selectItems value="#{actionValueLisBean.fruitsList}" var="fruit" itemLabel="#{fruit}" itemValue="#{fruit}"/>

                    <f:valueChangeListener type="beans.ActionValueLisBean"/>
                </h:selectManyMenu>

                <h3> Your previous selection is :<h:outputText value="#{actionValueLisBean.prevSel}"/></h3>
                <h3>Your current selection is :<h:outputText value="#{actionValueLisBean.currSel}"/></h3>

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

Это мой боб: -

package beans;

import com.sun.jmx.remote.internal.ArrayQueue;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ValueChangeEvent;
import javax.faces.event.ValueChangeListener;

@ManagedBean
@RequestScoped
public class ActionValueLisBean implements ValueChangeListener {


    private List<String> fruitsList;
    private String currSel;
    private String prevSel;

    public String getCurrSel() {
        return currSel;
    }

    public void setCurrSel(String currSel) {
        this.currSel = currSel;
    }

    public String getPrevSel() {
        return prevSel;
    }

    public void setPrevSel(String prevSel) {
        this.prevSel = prevSel;
    }



    public List<String> getFruitsList() {
        return fruitsList;
    }

    public void setFruitsList(List<String> fruitsList) {
        this.fruitsList = fruitsList;
    }



    public ActionValueLisBean() {
        fruitsList = new ArrayQueue<String>(5);

        fruitsList.add("Apple");
        fruitsList.add("Mango");
        fruitsList.add("Banana");
        fruitsList.add("Peach");
        fruitsList.add("Plum");

    }

    @Override
    public void processValueChange(ValueChangeEvent event) throws AbortProcessingException {

            if(event.getOldValue() != null)
                prevSel = event.getOldValue().toString();
            if(event.getNewValue() != null)
                currSel  = "abc";

    }


}

И тогда у меня есть prevSel, а currSel привязан к h:outputText. Но значение не получается, даже если processValueChange запущен правильно и System.out.println(event.getNewValue()); также работает нормально. Я тоже пытался установить разные области действия бобов, но безрезультатно. Я знаю, ValueChangeListener совершенно бесполезен. Тем не менее я хочу знать, как это работает.

Заранее спасибо:)

1 Ответ

2 голосов
/ 29 августа 2010

Я не уверен, что вы имеете в виду под "значение не получается". Вы должны уточнить это немного больше.

По крайней мере, его единственная цель состоит в том, чтобы прослушивать изменение значения, чтобы вы могли выполнять некоторые деловые операции на основе этого изменения, такие как ведение журнала или предварительная загрузка некоторых материалов, связанных с новым значением. Когда начальное значение равно представленному значению, этот метод не будет вызываться.

Вот фрагмент кода, чтобы поиграть с ним самостоятельно:

<h:form>
    <p>Input value: <h:inputText value="#{bean.value}" valueChangeListener="#{bean.change}"/></p>
    <p>Old value: <h:outputText value="#{bean.oldValue}" /></p>
    <p>New value: <h:outputText value="#{bean.newValue}" /></p>
    <p><h:commandButton value="submit" action="#{bean.submit}" /></p>
</h:form>

Bean:

package com.example;

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

@ManagedBean
@ViewScoped
public class Bean {

    private String value;
    private String oldValue;
    private String newValue;

    public void submit() {
        System.out.println("Submit: " + value);
    }

    public void change(ValueChangeEvent event) {
        oldValue = (String) event.getOldValue();
        newValue = (String) event.getNewValue();
        System.out.println("Change: " + oldValue + " to " + newValue);
    }

    public String getValue() {
        return value;
    }

    public String getOldValue() {
        return oldValue;
    }

    public String getNewValue() {
        return newValue;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

Обновление : согласно вашему обновлению: вы используете два разных экземпляра компонента. Вы на самом деле отображаете значения управляемого компонента, а не компонента, недавно созданного f:valueChangeListener.

...