2010-09-21 11 views
0

J'ai une page JSP (page1.jsp) montrant une table de données. Il y a aussi des boutons dans la table comme ceci:JSF déplacer/rediriger vers une autre page avec des données

<h:column> 
    <f:facet name="header" > 
     <h:outputText value=""/> 
    </f:facet> 
    <h:commandButton value="Show items" action="#{firstBean.displayItems}" immediate="true" /> 
</h:column> 

Le haricot:

public void displayItems() throws IOException { 
    MyClass theClass = (MyClass) dataTable.getRowData(); 
    String theId = theClass.getIdentityNumber(); 
    // ... 
} 

Lorsque l'on clique sur le bouton, je veux passer à une autre page JSP (de page2.jsp). À la page 2, il y a aussi une table de données. Cette table est créée via un appel à un bean appelé "facade" et un paramètre (String-id). -À-dire lorsque le bouton est pressé, je veux être déplacé vers JSP page 2, et cette page affiche un datatable basé sur un appel comme celui-ci:

myList = facade.getDeliveriesById(theId); 

donc la page 2 dépend des choses de la page 1, soit un identifiant de chaîne, ou si l'on peut en quelque sorte définir une liste?

Je suppose que la question est:

  • Si je dans "firstBean.displayItems" faire une redirection vers la page jsp 2 avec un "get" paramater, après l'extraction de cet ID (voir ci-dessus)?
  • Existe-t-il un moyen de définir la liste à utiliser à la page 2 dans "firstBean.displayItems"?

Quelle est la manière normale de passer d'une page à une autre dans JSF (avec des données)?

Répondre

2

Dans JSF 1.x, la méthode normale consiste à renvoyer String comme résultat de navigation.

public String displayItems() throws IOException { 
    MyClass theClass = (MyClass) dataTable.getRowData(); 
    String theId = theClass.getIdentityNumber(); 
    return "page2"; 
} 

en combinaison avec l'entrée suivante dans faces-config.xml:

<navigation-rule> 
    <navigation-case> 
     <from-outcome>page2</from-outcome> 
     <to-view-id>/page2.jsf</to-view-id> 
    </navigation-case> 
</navigation-rule> 

Il se rendra ensuite à page2.jsf.

Sur JSF 2.x, vous n'avez pas besoin de faces-config.xml. Renvoyez juste le nom de fichier exact sans extension, par ex. "page2" et JSF localiseront automatiquement la bonne vue. C'est ce qu'on appelle implicit navigation.


Mise à jour: haricots vous semblez avoir un « contrôleur » unique par page et vous souhaitez partager les données entre les haricots sans faire référence à l'autre haricot dans la page. Très raisonnable. Ceci est réalisable en divisant les données en un autre bean géré qui doit être injecté en tant que propriété gérée dans les deux beans "controller".

Par ex

public class ControllerBean1 { 
    private DataBean dataBean; 

    public String submit() { 
     MyClass theClass = (MyClass) dataTable.getRowData(); 
     String theId = theClass.getIdentityNumber(); 
     dataBean.setTheId(theId); 
     return "page2"; 
    } 

    // ... 
} 

Et

public class ControllerBean2 { 
    private DataBean dataBean; 

    // ... 
} 

Vous pouvez y accéder en page2 like suit:

<h:outputText value="#{controllerBean2.dataBean.theId}" /> 

Dans 1.x JSF vous devez injecter par <managed-property> dans les faces-config. Vous pouvez trouver un exemple dans this article. En JSF 2.x vous pouvez simplement annoter la propriété gérée en utilisant @ManagedProperty. Dans les prochaines questions, veuillez mentionner la version JSF que vous utilisez. De cette façon, nous pouvons donner des réponses plus détaillées sans bruit. JSF 2.x a beaucoup de différences (améliorations) dans la façon dont les choses doivent être abordées.

+0

Et comment la page 2 peut-elle obtenir "theId"? – Jojje

+0

En accédant simplement à la propriété bean, la méthode JSF habituelle est la suivante: # # {bean.theId} '. – BalusC

+0

C'est juste que page2 utilise un différent "ManagedBean" (ou contrôleur), ce qui pourrait être difficile, je pense. – Jojje

Questions connexes