2009-06-11 9 views
0

Ich füge (UIInput) zu den Fußzeilenspalten (UIColumn) einer Datentabelle (UIData) hinzu, die dynamisch erstellt wird. Das UIData ist an ein Datentag im jsp gebunden. In der Datentabelle habe ich nur Kopf- und Fußzeilen mit der Kopfzeile mit den Beschriftungen und Fußzeile mit dem entsprechenden Wert in bearbeitbaren Textfeld. Wenn ich den Wert ändern und das Formular mit einem commandButton senden und ich versuche, den UIInput-Wert mit .getValue() in der Aktionsmethode zuzugreifen, bekomme ich nur die alten Werte und nicht die Werte auf der Seite aktualisiert. Ich habe versucht, es an ein Attribut in der Backing-Bean zu binden und überprüft die Werte im Setter gesetzt. Ich merke, dass die alten Werte gesetzt werden und die Werte, die ich auf der Seite aktualisiert habe, spiegeln sich nicht in der Aktionsmethode oder dem Setzer wider. Ich versuchte mit .getValue, .getLocalValue, .getSubmittedValue. Keiner von diesen gibt mir die neuen Werte. Irgendwelche Vorschläge, was ich tun könnte worng?JSF UIInput in DataTable Fußzeile


Ich schaffte es, Abhilfe zu schaffen, indem Sie die Werte von requestParameterMap ziehen. Wenn es eine Lösung für das Problem gibt, lassen Sie es mich bitte wissen. McDowell - danke für Ihre Eingaben.

+0

Konnten Sie eine sehr einfache Seite und Bohne zur Verfügung stellen, die das Problem reproduziert? Es würde helfen, das Problem einzugrenzen. – McDowell

Antwort

0

Der eigentliche Code macht mehrere andere Verarbeitung, aber unter Code sollte bei der Replikation des Problems helfen. Im folgenden Code erwarte ich, dass der TestString die geänderten Werte von der Seite ausgibt. Aber es gibt nur alte Werte zurück. Unten finden Sie die 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> 

Unten ist die Gesichter 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> 

Unten ist die Backing Bean Code:

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

Ich versuchte your demo code Code unter MyFaces 1.2.3 läuft auf Tomcat und Mojarra 2.0.0 Beta auf Glassfish, konnte aber das Problem nicht reproduzieren - die save() - Methode druckte die Werte, die ich in die Felder eingegeben habe.

(MyFaces verwenden zu können, musste ich neue UIData()-neue HtmlDataTable(), wahrscheinlich darauf zurückzuführen, wie sie implementieren die Tabelle Renderer ändern, aber das ist eine geringfügige Änderung.)

ich ein paar Dinge über die Bohne beachten werden:

  • die Tabelle Getter wird es jedes Mal, Spalten heißt hält das Hinzufügen - wie auf einer Aktualisierung der Seite mit serverseitigen Sparzustand
  • keeping Ein Verweis auf eine UIComponent in einer Session-Bean ist normalerweise keine gute Idee. wäre es besser, soll mit Hilfe Anfrage Umfang für die Komponente Bindungen
    • Session Beans Serializable implementieren (obwohl ich nicht jeder tut dies zu realisieren) und UIComponents nicht serialisiert werden kann
    • Ihre Komponente in mehreren Ansichten, wenn die am Ende vielleicht Benutzer öffnet die Seite zweimal - Gleichzeitigkeitsprobleme
    • nach der spec: wenn JSF die Ansicht erstellt, wird es die Komponente über den Getter gebunden verwenden; aber, wenn sie der Ansicht wieder her (auf abschicken), wird die Komponente über die Setter gesetzt, so dass eine Referenz zu halten ist (bestenfalls) redundante

Vielleicht möchten Sie den Getter, um etwas zu ändern, wie dies:

private UIData headerDataTable; 

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

ich bin nicht davon überzeugt, dass diese Änderungen das Problem zu beheben, obwohl - wenn Sie immer noch Probleme haben, versuchen Sie es mit mehr Details - Ihre JSF Implementierung, die Version und den Wert des javax.faces.STATE_SAVING_METHOD Parameter in web.xml (falls vorhanden).

0

Das Problem ist noch nicht vollständig gelöst.

Ich benutze RSA 7, mit IBM JSF - Base Faces Support 7.0 und Enhanced Faces Components 7.0 auf WAS 6.0 Der javax.faces.STATE_SAVING_METHOD war standardmäßig 'server'.

Ich versuchte, STATE_SAVING_METHOD zu "Client" zu ändern. Es hat den geänderten Wert in der Ausgabe aber in Label4 anstelle von Label0, das ich änderte, gedruckt. Beim nächsten Senden wurde der Wert von label4 nach label8 verschoben. Schien inkonsistent.

Verwandte Themen