2009-10-07 2 views
1

En plus de ma question "Creating an “Edit my Item”-page in Java Server Faces with Facelets" Je voudrais couvrir un problème que cela a fourni.Utilisation de la propriété gérée avec CommandButton dans Java Server Faces

Lorsque je presse le commandButton l'ID = 100 est supprimé et la page est actualisée, ce qui est Avant il fonctionne même la méthode, à droite, donc cela signifie que je n'ai pas l'ID quand j'appuie sur le bouton .

Comment résolvez-vous ceci?

En ayant cette Bean Managed

public class BeanWithId implements Serializable { 
    private String id; 
    private String info; 

    private void populateInfo() { 
    info = "Some info from data source for id=" + id; 
    } 

    public String getId() { return id; } 

    public void setId(String id) { 
    this.id = id; 
    populateInfo(); 
    } 

    public String getInfo() { return info; } 
    public void setInfo(String info) { this.info = info; } 

    public String save() { 
    System.out.println("Saving changes to persistence store"); 
    return null; // no navigation 
    } 
} 

et en ajoutant

<p><h:commandButton action="#{beanWithId.save}" value="Save" /></p> 

Pour ma Facelet page. Maintenant, j'ai aussi les informations correctes dans mes visages-config.xml et quand j'accède à ma page en utilisant? ID = 100, je reçois l'article correct retourné.

Répondre

1

Il existe plusieurs façons de conserver l'ID à partir de l'URL GET d'origine. Je ne cherche pas à être complet.

Ajouter un param à un commandLink

<h:commandLink action="#{beanWithId.save}" value="Save"> 
    <f:param name="ID" value="#{param.ID}" /> 
</h:commandLink> 

Chaque fois que le lien est cliqué, l'ID sera réglée de paramètre.

Utilisez un champ caché

<h:form> 
    <h:inputHidden value="#{beanWithId.id}" /> 
    <p>ID: <h:outputText value="#{beanWithId.id}" /></p> 
    <p>Info: <h:inputText value="#{beanWithId.info}" /></p> 
    <p><h:commandButton action="#{beanWithId.save}" value="Save" /></p> 
</h:form> 

Toute fois que le formulaire est affiché, l'ID sera défini à partir du formulaire.


Préserver l'URL

Depuis l'URL du formulaire ne comprend pas la requête initiale, un poste enlèvera l'ID de l'URL dans la barre du navigateur. Cela peut être corrigé en utilisant une redirection côté serveur une fois l'action effectuée.

public String save() { 
    System.out.println("Saving changes to persistence store: id=" + id); 
    redirect(); 
    return null; // no navigation 
    } 

    private void redirect() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ExternalContext ext = context.getExternalContext(); 
    UIViewRoot view = context.getViewRoot(); 
    String actionUrl = context.getApplication().getViewHandler().getActionURL(
     context, view.getViewId()); 
    try { 
     // TODO encode id value 
     actionUrl = ext.encodeActionURL(actionUrl + "?ID=" + id); 
     ext.redirect(actionUrl); 
    } catch (IOException e) { 
     throw new FacesException(e); 
    } 
    } 
+0

Encore une fois, vous êtes un sauveur! Merci pour la réponse supérieure! –

0

Vous pouvez définir la propriété en utilisant f: setPropertyActionListener si vous utilisez JSF 1.2 ou plus récent.

<h:commandButton value="Save" action="#{beanWithId.save}"> 
    <f:setPropertyActionListener target="#{beanWithId.id}" value="100" /> 
</h:commandButton> 

Si vous utilisez JSF 1.1 ou avant que vous pouvez utiliser

<f:param name="reqId" value="100" /> 

mais cette fois vous devez obtenir le paramètre et le régler manuellement dans l'action comme par exemple:

public String save() { 
String idParam 
=FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("reqId"); 
setId(idParam); 
return null; 
} 
0

Cela a résolu mon problème

<h:commandLink action="#{beanWithId.save}" value=""> 
    <f:verbatim><input type="button" value="Save"/></f:verbatim> 
    <f:param name="id" value="#{beanWithId.id}"/> 
</h:commandLink> 

Fonctionne comme un charme, il supprime cependant le paramètre GET visible, mais il est toujours stocké pour que faces-config puisse accéder à param.id.

+0

Si vous voulez un bouton, regardez la solution de champ caché. – McDowell

Questions connexes