Comment passez-vous les paramètres d'affichage lors de la navigation d'une action en JSF2?

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

  •  25-09-2019
  •  | 
  •  

Question

De l'action dans mon haricot, j'essaie de rediriger vers une autre page attendant un paramètre de vue. Quelle est la méthode recommandée pour faire en JSF2?

.

par exemple, dire ma page source est: http: //localhost/page1.xhtml

il a un bouton de commande qui appelle une action:

<h:commandButton value="submit" action="#{myBean.submit}" />

où mon haricot ressemble à:

@ManagedBean
@RequestScoped
public class MyBean {

private int id;

public String submit() {
    //Does stuff
    id = setID();
    return "success";
}

Et maintenant, je veux le retour de l'action « submit » pour naviguer http: //localhost/page2.xhtml id = 2

J'ai essayé de le faire avec une vue dans mon cas param de navigation, mais avec des résultats bizarres. L'extrait des visages-config se présente comme suit:

<navigation-rule>
    <from-view-id>/page1.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/page2.xhtml</to-view-id>
        <redirect>
            <view-param>
                <name>id</name>
                <value>#{myBean.id}</value>
            </view-param>
        </redirect>
    </navigation-case>
</navigation-rule>

Le comportement bizarre étant, même si monBean est réglé sur INV scope, il appelle seulement myBean.getId () la première fois que je charge ma demande, et réutilise la même valeur pour tous les appels, produisant les paramètres d'affichage incorrects pour page2.

Je suis à la recherche soit une meilleure façon de faire, ou une raison / solution pour laquelle la vue-PARAM est pas demandé de mon grain à chaque fois.

Était-ce utile?

La solution

La chose unintuitive sur les paramètres passant JSF est que vous ne décidez pas quoi envoyer (dans l'action), mais plutôt ce que vous souhaitez recevoir (dans la page cible).

Quand vous faites une action qui se termine par une redirection, les métadonnées de la page cible est chargée et tous les paramètres requis sont lus et ajoutés à l'URL comme params.

Notez que ceci est exactement le même mécanisme que pour tout autre liant JSF: vous ne pouvez pas lire la valeur de inputText d'un endroit et avoir écrit un autre. L 'expression de la valeur définie dans viewParam est utilisé à la fois pour la lecture (avant la redirection) et pour écrire (après la redirection).

Avec votre haricot vous faites juste:

@ManagedBean
@RequestScoped
public class MyBean {

private int id;

public String submit() {
    //Does stuff
    id = setID();
    return "success?faces-redirect=true&includeViewParams=true";
}

// setter and getter for id

Si le côté de la réception a:

    <f:metadata>
        <f:viewParam name="id" value="#{myBean.id}" />
    </f:metadata>

Il va faire exactement ce que vous voulez.

Autres conseils

Sans une solution plus agréable, ce que je trouvais au travail est tout simplement la construction de ma chaîne de requête dans le retour de haricot:

public String submit() {
    // Do something
    return "/page2.xhtml?faces-redirect=true&id=" + id;
}

Pas le plus flexible des solutions, mais semble fonctionner comme je veux.

En utilisant également cette approche pour nettoyer le processus de construction de la chaîne de requête: http://www.warski.org/blog/?p=185

Consultez ces:

Tu vas besoin de quelque chose comme:

<h:link outcome="success">
  <f:param name="foo" value="bar"/>
</h:link>

... et ...

<f:metadata>
  <f:viewParam name="foo" value="#{bean.foo}"/>
</f:metadata>

A en juger par cette page , quelque chose comme cela pourrait être plus facile:

 <managed-bean>
   <managed-bean-name>blog</managed-bean-name>
   <managed-bean-class>com.acme.Blog</managed-bean-class>
   <managed-property>
      <property-name>entryId</property-name>
      <value>#{param['id']}</value>
   </managed-property>
 </managed-bean>

Vous pouvez le faire en utilisant Primefaces comme ceci:

<p:button 
      outcome="/page2.xhtml?faces-redirect=true&amp;id=#{myBean.id}">
</p:button>

Il suffit d'ajouter l'attribut vu rediriger balise comme suit:

<redirect include-view-params="true">
    <view-param>
        <name>id</name>
        <value>#{myBean.id}</value>
    </view-param>
</redirect>

sont quelques exemples de navigation.

Une solution sans référence à un Bean:

<h:button value="login" 
        outcome="content/configuration.xhtml?i=1" />

Dans mon projet, je avais besoin de cette approche:

<h:commandButton value="login" 
        action="content/configuration.xhtml?faces-redirect=true&amp;i=1"  />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top