1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

JSF valueChangeListener

Dieses Thema im Forum "Enterprise Java (JEE, J2EE, Spring & Co.)" wurde erstellt von Raderbe, 22. August 2016.

  1. Raderbe

    Raderbe Grünschnabel

    Hallo *,

    habe eine kleine JSF (JEE) - Anwendung gebaut. Diese hat
    • eine Combobox. Sobald der Anwender einen Wert auswählt, wird ein valueChangeEvent gefeuert. Dieser wird von einem Listener aufgegriffen, der den neuen Wert im Model setzt.
    • einen Button. Sobald der Button geklickt wird, wir das Form submitted und eine Aktion ausgeführt.
    Soweit, so gut. Das Problem ist, dass bei Submit des Formulars über den Button auch ein ValueChangeEvent gefeuert wird. Das kann ich nicht nachvollziehen. Als Folge wird die eigentliche Aktion nie ausgeführt, die Anwendung geht immer in den ValueChangeListener.

    Im Anhang befindet sich ein ear, welches sehr einfach über "mvn clean install" gebaut und direkt z.B. auf einem Wildfly deployed werden kann.
    Code (Text):
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    3.         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    4. <html xmlns="http://www.w3.org/1999/xhtml"
    5.       xmlns:h="http://xmlns.jcp.org/jsf/html"
    6.       xmlns:f="http://xmlns.jcp.org/jsf/core">
    7. <h:body>
    8.     <h:form>
    9.         <h:panelGrid columns="3">
    10.             <h:outputLabel value="Projekt"
    11.                            for="projectSelector"/>
    12.             <h:selectOneMenu id="projectSelector"
    13.                              value="#{timeBean.model.projectSelected}"
    14.                              converter="projectConverter"
    15.                              onchange="submit()"
    16.                              valueChangeListener="#{timeBean.projectChanged}"
    17.                              immediate="true"
    18.                              required="true">
    19.                 <f:selectItems value="#{timeBean.model.allProjects}"
    20.                                var="singleProject"
    21.                                itemValue="#{singleProject}"
    22.                                itemLabel="#{singleProject.name}"/>
    23.             </h:selectOneMenu>
    24.             <h:message for="projectSelector"/>
    25.         </h:panelGrid>
    26.  
    27.         <h:panelGrid columns="1">
    28.             <h:commandButton value="Absenden"
    29.                              action="#{timeBean.myAction}"
    30.                              ajax="false"/>
    31.  
    32.             <h:outputLabel value="#{timeBean.model.resultValue}" rendered="#{not empty timeBean.model.resultValue}"/>
    33.         </h:panelGrid>
    34.     </h:form>
    35. </h:body>
    36. </html>
    Code (Java):
    1. @Named
    2. @ViewScoped
    3. public class TimeBean implements Serializable {
    4.  
    5.     @Inject
    6.     private ValueProvider valueProvider;
    7.  
    8.     @Inject
    9.     private Logger log;
    10.  
    11.     private TimeModel model;
    12.  
    13.     @PostConstruct
    14.     public void init() {
    15.         model = new TimeModel();
    16.         final List<ProjectEntity> allProjects = valueProvider.getAllProjects();
    17.         model.setAllProjects(allProjects);
    18.         model.setProjectSelected(allProjects.get(0));
    19.     }
    20.  
    21.     public String myAction() {
    22.         log.info("myAction called");
    23.         model.setResultValue("action was called");
    24.         return null;
    25.     }
    26.  
    27.     public void projectChanged(final ValueChangeEvent event) {
    28.         final ProjectEntity projectSelected = (ProjectEntity) event.getNewValue();
    29.         log.info("value changed from " + model.getProjectSelected().getId() + " to " + projectSelected.getId());
    30.         model.setProjectSelected(projectSelected);
    31.         final FacesContext context = FacesContext.getCurrentInstance();
    32.         context.renderResponse();
    33.     }
    34.  
    35.     public TimeModel getModel() {
    36.         return model;
    37.     }
    38.  
    39.     public void setModel(TimeModel model) {
    40.         this.model = model;
    41.     }
    42.  
    43. }
    Code (Java):
    1. public class ProjectEntity {
    2.     private Long id;
    3.     private String name;
    4.     [...getter und setter...]
    5.  
    6.     @Override
    7.     public boolean equals(final Object o) {
    8.         if (this == o)
    9.             return true;
    10.         if (o == null || getClass() != o.getClass())
    11.             return false;
    12.  
    13.         final ProjectEntity that = (ProjectEntity) o;
    14.         System.out.println("equals comparing this " + this.getId() + " to that " + that.getId());
    15.  
    16.         return id != null ? id.equals(that.id) : that.id == null;
    17.     }
    18.  
    19.     @Override
    20.     public int hashCode() {
    21.         return id != null ? id.hashCode() : 0;
    22.     }
    23.  
    24.     @Override
    25.     public String toString() {
    26.         return "ProjectEntity{" + "id=" + id + ", name='" + name + "'}";
    27.     }
    28.  
    29. }
     

    Anhänge:

  2. djadjabing

    djadjabing Grünschnabel

  3. Raderbe

    Raderbe Grünschnabel

    Besten Dank für den Link. Hat leider nicht geklappt. Ich komme beim Ausprobieren in einen "projectSelector: Validation Error: Value is not valid" (siehe auch https://stackoverflow.com/questions/9069379/validation-error-value-is-not-valid), den ich mir auch nicht erklären kann. Wenn Du vielleicht doch mal reinschauen könntest (oder jemand anders), wäre das super!!! Ich komm an der Stelle einfach nicht weiter.
     
Die Seite wird geladen...