2009-06-11 12 views
0

J'ajoute (UIInput) aux colonnes de pied de page (UIColumn) d'une datatable (UIData) créée dynamiquement. L'UIData est lié à une balise datatable dans le jsp. Dans le datatable, j'ai juste des en-têtes et pieds de page avec l'en-tête ayant les étiquettes et le pied de page ayant la valeur correspondante dans la zone de texte éditable. Lorsque je modifie la valeur et soumets le formulaire en utilisant un bouton de commande et j'essaie d'accéder à la valeur UIInput en utilisant .getValue() dans la méthode d'action, je récupère simplement les anciennes valeurs et non les valeurs mises à jour dans la page. J'ai essayé de le lier à un attribut du backing bean et vérifié les valeurs définies dans le setter. Je remarque que les anciennes valeurs sont définies et les valeurs que j'ai mises à jour dans la page ne reflètent pas dans la méthode d'action ou le setter. J'ai essayé d'utiliser .getValue, .getLocalValue, .getSubmittedValue. Aucun de ceux-ci ne me donne les nouvelles valeurs. Toutes les suggestions que je pourrais faire porter? J'ai réussi à contourner le problème en extrayant les valeurs de requestParameterMap. S'il y a un correctif pour le problème s'il vous plaît faites le moi savoir. McDowell - merci pour vos contributions.JSF UIInput dans le pied de page DataTable

+0

Pourriez-vous fournir une page très simple et un bean reproduisant le problème? Cela aiderait à affiner le problème. – McDowell

Répondre

0

Le code actuel effectue plusieurs autres traitements, mais le code ci-dessous devrait aider à répliquer le problème. Dans le code ci-dessous, je m'attends à ce que TestString affiche les valeurs modifiées de la page. Mais cela ne fait que retourner les anciennes valeurs. Ci-dessous le jsp:

<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> 
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> 
<html> 
<head> 
</head> 
<f:view> 
    <body> 
     <h:form styleClass="form" id="form1"> 
      <h:commandButton value="Save" action="#{TestPageBackingBean.save}" styleClass="commandExButton"/> 
      <h:outputText styleClass="label" value="Header Table"/> 
      <h:dataTable binding="#{TestPageBackingBean.headerDataTable}"></h:dataTable> 
     </h:form> 
    </body> 
</f:view> 
</html> 

Ci-dessous le visage config:

<managed-bean> 
    <managed-bean-name>TestPageBackingBean</managed-bean-name> 
    <managed-bean-class>test.jsf.TestPageBackingBean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
</managed-bean> 

Ci-dessous le code backing bean:

package test.jsf; 

import java.io.IOException; 

import javax.faces.component.UIColumn; 
import javax.faces.component.UIData; 
import javax.faces.component.UIInput; 
import javax.faces.component.UIOutput; 
import javax.faces.context.FacesContext; 

public class TestPageBackingBean { 

    private UIData headerDataTable = new UIData(); 

    public TestPageBackingBean() { 

    } 

    public UIData getHeaderDataTable() 
    {  
      return getHeaderTable(headerDataTable); 
    }  

    public UIData getHeaderTable(UIData dataTable) 
    {  
     for (int i=0;i<10;++i) 
     { 
      dataTable.getChildren().add(getColumn(i)); 
     } 
     return dataTable; 
    } 

    private UIColumn getColumn(int i) 
    { 
    UIOutput outputLabelText = new UIOutput(); 
     UIInput inputFieldText = new UIInput(); 
     UIColumn column = new UIColumn(); 

     outputLabelText.setValue("Label" + i); 
     inputFieldText.setValue("test input" + i); 

     column.setHeader(outputLabelText); 
     column.setFooter(inputFieldText); 
     return column; 
    } 

    public String save() throws IOException { 
      String TestString = ""; 
      FacesContext ctx = FacesContext.getCurrentInstance(); 
      if (!ctx.getResponseComplete()) { 
       for (int i=0; i<headerDataTable.getChildren().size();++i) 
       { 
        TestString = TestString + (String)((UIInput)((UIColumn) headerDataTable.getChildren().get(i)).getFooter()).getValue(); 
       } 
      System.out.println(TestString); 
      } 
      return "save"; 
     } 

    public void setHeaderDataTable(UIData headerDataTable) { 
     this.headerDataTable = headerDataTable; 
    } 
} 
1

J'ai essayé d'exécuter du code your demo code sous MyFaces 1.2.3 sur Tomcat et Mojarra 2.0.0 Beta sur Glassfish, mais n'a pas pu reproduire le problème - la méthode save() a imprimé les valeurs que j'ai entrées dans les champs.

(Pour utiliser MyFaces, je devais changer nouveau UIData()-nouvelle HtmlDataTable(), probablement en raison de la façon dont ils mettent en œuvre la table renderer, mais qui est un changement mineur.)

Je noterai quelques choses sur la fève:

  • le getter de table va continuer à ajouter des colonnes à chaque fois qu'il est appelé - comme sur une actualisation de la page avec l'état côté serveur économie
  • maintien une référence à un composant UIComponent dans un bean session n'est généralement pas une bonne idée; vous seriez mieux d'utiliser la portée de la demande pour les liaisons composant
    • haricots de session sont censés mettre en œuvre Serializable (bien que je me rends compte pas tout le monde le fait) et UIComponents ne peut pas être sérialisé
    • votre composant pourrait se retrouver dans plusieurs vues si la l'utilisateur ouvre la page deux fois - problèmes de simultanéité
    • selon le spec: lorsque JSF crée la vue, il utilisera le composant lié via le getter; mais, quand il restaure la vue (sur soumettre), il établira le composant via le dispositif de réglage, gardant ainsi une référence est (au mieux) redondant

Vous pouvez changer le getter à quelque chose comme ceci:

private UIData headerDataTable; 

public UIData getHeaderDataTable() { 
    if (headerDataTable == null) { 
     headerDataTable = new UIData(); 
     getHeaderTable(headerDataTable); 
    } 
    return headerDataTable; 
} 

Je ne suis pas convaincu que ces changements résoudre votre problème, bien que - si vous rencontrez toujours des problèmes, essayez à nouveau avec plus de détails - l'implémentation de JSF, la version, et la valeur de la javax.faces.STATE_SAVING_METHOD paramètre dans web.xml (le cas échéant).

0

Le problème n'est pas encore entièrement résolu.

J'utilise RSA 7, avec IBM JSF - Base Faces Support 7.0 et Enhanced Faces Components 7.0 sur WAS 6.0 Le fichier javax.faces.STATE_SAVING_METHOD était 'server' par défaut.

J'ai essayé de changer STATE_SAVING_METHOD en 'client'. Il a imprimé la valeur modifiée dans la sortie mais dans label4 au lieu de label0 que j'ai modifié. Au prochain soumettre la valeur déplacée de label4 à label8. Semblait inconsistant.

Questions connexes