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
Répondre
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;
}
}
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).
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.
- 1. JSF, datable dans datatable
- 2. Lignes de pied de page multiples dans un tableau de données JSF
- 3. Comment contourner la validation dans dataTable? JSF
- 4. Page vierge dans JSF
- 5. Pied de page flottant CSS
- 6. Problème avec le pied de page dans IE8
- 7. Comment ajouter 2 lignes dans le pied de page Gridview
- 8. Affichage des données en utilisant JSF dataTable
- 9. css pour le texte de pied de page
- 10. ie 6 pied de page flottant vers le haut numéro
- 11. ajouter un pied de page à FlowDocumentsdocuments
- 12. ASP.net mvc données communes pour le pied de page
- 13. iTextSharp Création d'un pied de page Page # de #
- 14. le contenu dynamique chevauche le pied de page mais reste dans le flux de contenu?
- 15. Pied de page sur la dernière page imprimée
- 16. Placer UITextView dans un pied de page UITableView
- 17. Comment insérer l'en-tête et le pied de page dans le fichier .vm
- 18. Comment limiter l'affichage du paginateur uniquement dans l'en-tête ou le pied de page dans YUI?
- 19. Est-il possible d'avoir plusieurs lignes avec jsf h: datatable
- 20. DataTable contenant inputText: est-ce possible avec JSF Custom Component
- 21. Comment puis-je obtenir le flux de l'en-tête/pied de page dans un document Wordprocessing
- 22. Afficher la section détail sous la section Pied de page
- 23. Quelle est la bonne façon d'avoir une case à cocher booléenne dans un JSF/RichFaces `dataTable`?
- 24. Ajoutez dynamiquement un pied de page à ASP.NET GridView
- 25. Pied de page fixe obscure firefox search match
- 26. Astuce css pied de page avec IE6 ne fonctionne pas
- 27. Glassfish se connecte sur JSF Page
- 28. Enlever l'en-tête et pied de page en utilisant C#
- 29. Navigation JSF rediriger vers la page précédente
- 30. Ajouter macro en-tête et pied de page
Pourriez-vous fournir une page très simple et un bean reproduisant le problème? Cela aiderait à affiner le problème. – McDowell