Question

I'm using a SessionScoped bean for storing my Client object that i retreive from a ClientService thats using JPA. When my webpage is loaded i pass a GET Id parameter for retreiving the correct Client object. Everything goes fine but when i try too edit the Client object properties, it doesn't change for some reason.

Here is my code:

View :

<?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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui">


        <body>

            <ui:composition template="./../../WEB-INF/templates/master.xhtml">

                <ui:define name="functions">
                    <li><h:link outcome="clients/overview"><i class="icon-chevron-right"></i> <h:outputText value="#{trans['sidebar.links.overview']}" /> </h:link></li> 
                </ui:define>

                <ui:define name="page-header">
                    Edit - Clients
                </ui:define>

                <ui:define name="content">

                    <f:metadata>
                        <f:viewParam name="id" value="#{editClientBean.id}" required="false"/>
                        <f:event type="preRenderComponent" listener="#{editClientBean.findClient()}"/>
                    </f:metadata>


                    <h:form class="form-horizontal">
                        <div class="control-group">
                            <label class="control-label" for="inputEmail">Firstname</label>
                            <div class="controls">
                                <h:inputText  value="#{editClientBean.client.firstname}" />
                            </div>
                        </div>
                        <div class="control-group">
                            <label class="control-label" for="inputPassword">Lastname</label>
                            <div class="controls">
                                <h:inputText value ="#{editClientBean.client.lastname}" />
                            </div>
                        </div>
                        <div class="control-group">
                            <label class="control-label" for="inputPassword">Birthdate</label>
                            <div class="controls">
                                <h:inputText value ="#{editClientBean.client.dateToString()}" />
                            </div>
                        </div>
                        <div class="control-group">
                            <label class="control-label" for="inputPassword">City</label>
                            <div class="controls">
                                <h:inputText value ="#{editClientBean.client.city}" />
                            </div>
                        </div>
                        <div class="control-group">
                            <label class="control-label" for="inputPassword">Address</label>
                            <div class="controls">
                                <h:inputText value ="#{editClientBean.client.address}" />
                            </div>
                        </div>
                        <div class="control-group">
                            <label class="control-label" for="inputPassword">Zip</label>
                            <div class="controls">
                                <h:inputText value ="#{editClientBean.client.zipcode}" />
                            </div>
                        </div>
                        <div class="control-group">
                            <label class="control-label" for="inputPassword">Info</label>
                            <div class="controls">
                                <h:inputText value ="#{editClientBean.client.info}" />
                            </div>
                        </div>
                        <div class="control-group">
                            <label class="control-label" for="inputPassword">Info</label>
                            <div class="controls">
                                <h:inputText value ="#{editClientBean.client.info}" />
                            </div>
                        </div>
                        <div class="control-group">
                            <label class="control-label" for="inputPassword">Email</label>
                            <div class="controls">
                                <h:inputText value ="#{editClientBean.client.email}" />
                            </div>
                        </div>
                        <div class="control-group">
                            <label class="control-label" for="inputPassword">Password</label>
                            <div class="controls">
                                <h:inputSecret value="#{editClientBean.client.password}" />
                            </div>
                        </div>
                        <div class="control-group">
                            <label class="control-label" for="inputPassword">Cartrack ID(s)</label>
                            <div class="controls">

                            </div>
                        </div>

                        <div class="control-group">
                            <div class="controls">

                                <h:commandButton  value="Change" >
                                    <f:ajax listener="#{editClientBean.edit}" />
                                </h:commandButton>
                            </div>
                        </div>

                    </h:form>

                </ui:define>

            </ui:composition>

        </body>
    </html>

Bean :

package Beans;

import Entities.Cartrack;
import Entities.Client;
import Services.CarTrackService;
import Services.ClientService;
import java.io.Serializable;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;

/**
 *
 * @author Roel
 */
@Named
@SessionScoped
public class EditClientBean implements Serializable {

    @Inject
    private ClientService clientService;
    @Inject 
    private CarTrackService cartrackService;
    private Client client;
    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void findClient(){
        this.client = this.clientService.Find(this.id);
    }

    /**
     * @return the client
     */
    public Client getClient() {
        return client;
    }

    /**
     * @param client the client to set
     */
    public void setClient(Client client) {
        this.client = client;
    }

    public List<Cartrack> getCarTracks(){
        return this.cartrackService.FindAll();
    }

    public void edit(){
        System.out.println(this.client.getFirstname());
        System.out.println(this.client.getCartracks().size());


        //this.clientService.Edit(this.client);
    }
}
Était-ce utile?

La solution

Edited form values do not get submitted on an Ajax enabled commandButton unless they are explicity named in the execute attribute. Try adding this:

<h:commandButton  value="Change" >
  <f:ajax execute="@form" render="@form" listener="#{editClientBean.edit}" />
</h:commandButton>

The @form is a reserved keyword in the execute and render properties to instruct an Ajax form submission to include the form naming container and all children within that form. You are specifying to submit all form values to be applied to the model and then in the render attribute you are instructing to re render all of the form elements after server side processing.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top