2013-05-06 3 views
0

J'ai cette page, j'ai deux formulaires sur. La deuxième forme est chargée (rendue) par ajax. Le problème est que lorsque le bouton du formulaire suivant est pressé, la page se recharge tout seul, n'appelant pas réellement la méthode spécifiée dans 'action'.jsf bouton de commande action ne fonctionne pas ajax

XHTML

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" 
       template="./../WEB-INF/employeeTemplate.xhtml" 
       xmlns:h="http://java.sun.com/jsf/html" 
       xmlns:f="http://java.sun.com/jsf/core" 
       xmlns="http://www.w3.org/1999/xhtml"> 

    <ui:define name="content"> 
     finding user ... 
     <h:form id="mainForm"> 
      <h:inputText id="userId" value="#{eFindUser.userId}" /> 
      <h:commandButton value="Render!" action="#{eFindUser.findUser}" > 
       <f:ajax event="action" execute="userId" render="@all" /> 
      </h:commandButton> 
     </h:form>   

     <h:panelGroup id="result"> 
      <h:panelGroup layout="block" rendered="#{eFindUser.notFound}" style="color:red"> 
       User not found 
      </h:panelGroup> 

      <h:form> 
       <h:panelGroup layout="block" rendered="#{eFindUser.responseRendered}" > 

        <h:inputHidden value="#{eFindUser.user}" /> 
        <table> 
         <tr> 
          <td>Name</td> <td>#{eFindUser.user.name}</td> 
         </tr> 
         <tr> 
          <td>Balance:</td> <td>#{eFindUser.user.account.balance}</td> 
         </tr> 

         <tr> 
          <td><h:commandButton value="update balance" action="#{eFindUser.process()}" /></td> 
         </tr> 
        </table> 


       </h:panelGroup> 
      </h:form>       
     </h:panelGroup> 



    </ui:define> 

</ui:composition> 

de haricots Sauvegarde

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package backingbeans; 

import entities.User; 
import java.io.Serializable; 
import java.util.Random; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 
import javax.inject.Inject; 
import javax.validation.constraints.NotNull; 
import stateless.EmployeeFacade; 

/** 
* 
* @author Martin 
*/ 
    @ManagedBean(name="eFindUser") 
    @ViewScoped 
    public class EFindUserManagedBean implements Serializable{ 
     private static final long serialVersionUID = -7106162864352727534L; 
     private boolean responseRendered = false; 
     private boolean notFound = false; 
     @NotNull 
     private Long userId; 
     private User user; 

     @Inject 
     private EUpdateBalanceManagedBean updateBalance; 

     @Inject 
     private EmployeeFacade employeeFacade; 

     /** 
     * Creates a new instance of EFindUserManagedBean 
     */ 

     public EFindUserManagedBean() { 
     } 

     public void findUser() { 
      if(new Random().nextDouble() < 0.3) { 
       notFound = true; 
       responseRendered = false; 
      } else { 
       notFound = false; 
       responseRendered = true; 
       user = employeeFacade.getUserById(3L); 
      } 

     } 
     public boolean isResponseRendered() { 
      return responseRendered; 
     } 

     public void setResponseRendered(boolean responseRendered) { 
      this.responseRendered = responseRendered; 
     } 

    public boolean isNotFound() { 
     return notFound; 
    } 

    public void setNotFound(boolean notFound) { 
     this.notFound = notFound; 
    } 

    public Long getUserId() { 
     return userId; 
    } 

    public void setUserId(Long userId) { 
     System.out.println("blah"); 
     this.userId = userId; 
    } 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     System.out.println("setting user"); 
     this.user = user; 
    } 


    public String process() { 
     updateBalance.setUser(user); 
     System.out.println("process"); 
     return "/employee/updateBalance.xhtml?faces-redirect=true"; 
    } 

    } 

Lorsque je clique sur le premier 'Render! - bouton étiqueté, il fonctionne comme un charme. La deuxième forme est chargée et prête à fonctionner. Lorsque je clique sur le bouton "Mettre à jour la balance", la page recharge juste ce qu'elle ne devrait pas, bien sûr. Il devrait rediriger vers "/ employee/updateBalance". Ou il devrait au moins appeler la méthode de processus.

Merci beaucoup

EDIT: @BalusC est droite, la réponse est question précédente

+0

spécifiant id du formulaire ne résout pas –

Répondre

0

Le coupable se trouve dans <h:inputHidden> étiquette de la seconde forme:

<h:form> 
    <h:panelGroup layout="block" rendered="#{eFindUser.responseRendered}" > 
     <h:inputHidden value="#{eFindUser.user}" /> 
    </h:panelGroup> 
</h:form> 

Très probablement sa valeur liée, eFindUser.user est de type User et lorsque vous soumettez ce formulaire, JSF ne sait pas comment affecter une représentation sous forme de chaîne de l'utilisateur avec un objet User.

Par conséquent, il existe une erreur de conversion, auquel cas la méthode d'action n'est pas appelée, en fonction du cycle de vie JSF. En outre, vous auriez su que si vous aviez <h:messages> dans votre vue.

Que peut-on faire est la suivante:

  1. convertisseur attribuons à votre entrée comme <h:inputHidden value="#{eFindUser.user}" converter="userConverter"/> avec un @FacesConverter mis en œuvre. Plus de détails peuvent être trouvés here.
  2. Liez <h:inputHidden> à un String, de sorte qu'aucun convertisseur ne soit nécessaire: <h:inputHidden value="#{eFindUser.user.userNickname}"> ou Integer d'une manière similaire.
+0

J'ai supprimé le ' 'parce que ce n'était pas obligatoire. Étant donné que le bean backing est défini sur View, il n'est pas nécessaire de le rafraîchir. Il n'a pas résolu le problème, bien que –

+0

Essayez de placer '' pour savoir s'il y a des erreurs de conversion/validation là-bas. – skuntsel

+0

aucun message de quelque type que ce soit –

0

modifier <h:commandButton value="update balance" action="#{eFindUser.process()}" /> à <h:commandButton value="update balance" action="#{eFindUser.process}" /> el expression ne peut pas contenir «() »