2009-06-17 10 views
2

J'ai découvert un problème dans mon petit programme, et je me demande si quelqu'un a des conseils ou des conseils sur la façon de résoudre ce problème le mieux possible .Comment faire un formulaire soumettre quand son rendu basé sur une valeur dans une demande bean tronqué

J'ai le bean testBean qui est dans la portée de la requête. Il contient les éléments suivants:

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; 
} 

}

Mon fichier welcomeJSF.jsp contient ceci:

<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> 

Quand je lance l'application Im présenté avec le bouton "Set interne vrai". Je clique dessus et je suis présenté avec le formulaire où j'ai le bouton "Go". En cliquant sur "Go" ne déclenche pas la méthode dans mon bean, probablement parce que le champ n'est plus rendu sur le serveur, et donc il ne va pas exécuter la méthode. Y a-t-il des solutions intelligentes à cela?

En avance, merci pour votre temps.

Répondre

2

Les enfants du groupe ne seront jamais décoder parce que son entrée rendu attribut évalue toujours à faux pendant la phase d'application VALEURS demande. C'est une chose sensée à faire du point de vue de la sécurité.

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


Une chose que vous pourriez faire est profiter du fait que les composants JSF maintiennent un état pour toute la durée de la vue.

Le nouveau haricot:

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; } 

} 

La nouvelle vue liée à la fève:

<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> 

En utilisant l'attribut binding sur la panelGrid fera setPanel à appeler lorsque la vue est créé/restauré.


Notez que vous pouvez avoir quelques tests à faire en fonction de la façon dont votre point de vue de la mise en œuvre et/ou de bibliothèques StateManager magasins entre les demandes (qui peuvent à leur tour être touchés par le javax.faces.STATE_SAVING_METHOD paramètre init) . La vue peut être stockée dans un champ masqué dans le formulaire, dans la session associée à l'ID de vue (pouvant entraîner des collisions avec plusieurs fenêtres de navigateur), dans la session associée à un ID unique créé par une navigation GET ou JSF, ou par un mécanisme complètement personnalisé. La nature connectable du framework le rend polyvalent, mais dans ce cas, cela signifie que vous devez vérifier à nouveau le comportement de votre implémentation.

+0

Merci d'avoir éclairci ça pour moi! Très bonne réponse –

Questions connexes