2009-06-17 4 views
2

Ich habe ein Problem in meinem kleinen Programm entdeckt, und ich frage mich, ob jemand irgendwelche Tipps oder Ratschläge hat, wie man dieses Problem bestmöglich löst .Wie man ein Formular übergibt, wenn es basierend auf einem Wert in einer Beantragten Bean gerendert wird

Ich habe die Bohne testBean, die im Anforderungsbereich ist. Es enthält folgende Komponenten:

public class testBean { 

private boolean internal = false; 
private String input = ""; 

public String internalTrue() { 
    System.out.println("Set internal true"); 
    setInternal(true); 
    return null; 
} 
public String submitForm() { 
    System.out.println(""); 
    return null; 
} 
public boolean isInternal() { 
    return internal; 
} 
public void setInternal(boolean internal) { 
    this.internal = internal; 
} 
public String getInput() { 
    return input; 
} 
public void setInput(String input) { 
    this.input = input; 
} 

}

Meine Datei welcomeJSF.jsp enthält diese:

<f:view> 
     <h:form> 
      <h:commandButton value="Set internal true" action="#{testBean.internalTrue}" /> 
     </h:form> 
     <h:panelGrid columns="1" rendered="#{testBean.internal}"> 
      <h:form> 
       <h:outputText value="JavaServer Faces" /><h:inputText value="#{testBean.input}" /> 
       <h:commandButton value="Go" action="#{testBean.submitForm}" /> 
      </h:form> 
     </h:panelGrid> 
    </f:view> 

Wenn ich die Anwendung Im präsentiert mit der Taste "Set interne true" laufen. Ich klicke es an und ich präsentiere das Formular wo ich den Knopf "Go" habe. Wenn Sie auf "Go" klicken, wird die Methode in meiner Bean nicht ausgelöst, wahrscheinlich weil das Feld nicht mehr auf dem Server gerendert wird und die Methode nicht ausgeführt wird. Gibt es dafür clevere Lösungen?

Im Voraus, danke für Ihre Zeit.

Antwort

2

Die Kinder des Panels wird niemals Eingang dekodieren, weil seine gemacht Attribut falsch wertet immer in der Phase REQUEST Werte gelten. Dies ist aus Sicherheitsgründen sinnvoll.

alt text http://www.ibm.com/developerworks/java/library/j-jsf2/basic-lifecycle.gif


Eine Sache, die Sie sich die Tatsache zunutze nehmen tun könnten, dass JSF-Komponenten-Zustand für die gesamte Lebensdauer der Ansicht beibehalten.

Die neue Bean:

public class TestBean { 

    private String input = null; 
    private UIComponent panel; 

    public String internalTrue() { 
    panel.setRendered(true); 
    return null; 
    } 

    public String submitForm() { 
    panel.setRendered(false); 
    System.out.println("submitForm"); 
    return null; 
    } 

    public UIComponent getPanel() { return panel; } 
    public void setPanel(UIComponent panel) { this.panel = panel; } 

    public String getInput() { return input; } 
    public void setInput(String input) { this.input = input; } 

} 

Die neue Sicht auf die Bohne gebunden:

<f:view> 
    <h:form> 
     <h:commandButton value="Set internal true" 
     action="#{testBean.internalTrue}" /> 
    </h:form> 
    <h:panelGrid binding="#{testBean.panel}" columns="1" 
     rendered="false"> 
     <h:form> 
     <h:outputText value="JavaServer Faces" /> 
     <h:inputText value="#{testBean.input}" /> 
     <h:commandButton value="Go" action="#{testBean.submitForm}" /> 
     </h:form> 
    </h:panelGrid> 
    </f:view> 

Mit dem binding Attribute auf dem panelGridsetPanel verursacht, wenn die Ansicht aufgerufen werden wird erstellt/wiederhergestellt.


Beachten Sie, dass einige Tests auf zu tun haben können, je nachdem wie die Implementierung der und/oder StateManager speichern Ansichten zwischen den Anforderungen der Bibliotheken (die wiederum durch den javax.faces.STATE_SAVING_METHOD Init-Parameter beeinflusst werden) . Die Ansicht kann in einem versteckten Feld im Formular gespeichert werden, in der Sitzung, die mit der Ansichts-ID verschlüsselt ist (was zu Kollisionen mit mehreren Browserfenstern führen kann), in der Sitzung mit einer eindeutigen ID, die von einer GET- oder JSF-Navigation erstellt wurde einige komplett benutzerdefinierte Mechanismus. Die Pluggable-Struktur des Frameworks macht es vielseitig, aber in diesem Fall müssen Sie überprüfen, wie sich Ihre Implementierung verhält.

+0

Vielen Dank für die Klärung für mich! Sehr gute Antwort –