Wie man eine Form machen einreichen, wenn sein basierend auf einem Wert übertrug in einer Anfrage Bohne scoped

StackOverflow https://stackoverflow.com/questions/1008727

  •  06-07-2019
  •  | 
  •  

Frage

entdeckte ich ein Problem in meinem kleinen Programm, und ich bin mich gefragt, ob jemand irgendwelche Tipps oder Ratschläge haben, wie dieses Problem so gut wie möglich zu lösen.

Ich habe die Bohne testBean die Anfrage Anwendungsbereich ist. Es enthält folgende Möglichkeiten:

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 ausführen Im mit der Taste präsentiert „Set interner true“. Ich klicke es und ich bin mit der Form dargestellt, wo ich den Knopf haben „Go“. „Go“ Ein Klick löst nicht die Methode in meiner Bohne, wahrscheinlich wegen des Feldes tatsächlich auf dem Server nicht mehr gemacht zu werden, und so läuft, es wird nicht die Methode. Gibt es eine intelligente Lösungen für das?

Im Voraus vielen Dank für Ihre Zeit.

War es hilfreich?

Lösung

Die Kinder des Panels wird niemals Eingang dekodieren, weil seine gemacht Attribut immer auswertet false während der GILT REQUEST Phasenwerte. Dies ist eine vernünftige Sache, von einem Standpunkt der Sicherheit zu tun.


(Quelle: ibm.com )


Eine Sache, die Sie tun können, ist die Vorteile der Tatsache, 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 der Bindung auf Attribut die panelGrid verursacht setPanel aufgerufen werden, wenn die Sicht erstellt wird / wiederhergestellt.


Beachten Sie, dass einige Tests abhängig zu tun haben, wie Sie Ihre Implementierung und / oder Bibliotheken State speichert Ansichten zwischen Anforderungen (die wiederum durch die javax.faces.STATE_SAVING_METHOD init Parameter beeinflusst werden). Die Ansicht kann in der Form, in einem versteckten Feld gespeichert werden, in der Sitzung der Ansicht ID eingegeben durch eine GET oder JSF Navigation erstellt eine eindeutige ID eingegeben hat, in der Sitzung (die Kollisionen mit mehreren Browsern-Fenstern führen kann) oder durch einige ganz individuelle Mechanismus. Die steckbare Art des Rahmens macht es vielseitig, aber in diesem Fall bedeutet dies, müssen Sie nochmals überprüfen, wie Ihre Implementierung verhält.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top