2009-12-15 7 views
0

Je vais essayer d'expliquer mon problème. J'utilise l'implémentation JSF 1.2 d'IBM dans un environnement très très rigide (couche entreprise, et contraintes strictes -n'ajoutez pas de bibliothèque etc.-).JSF - créer une page de confirmation générique (navigation dynamique)

Je veux créer une page simple pour la confirmation qui peut être réutilisée (genre de générique). Par exemple: 1-page1.jsp> cliquez sur le bouton 2-pageConfirmation.jsp> 2 boutons Oui ou Non 3-cliquez sur Non> revenir en arrière/3bis-cliquez sur Oui> allez à someAction puis allez à page2. Je voulais donc stocker en session les choses dont j'ai besoin, d'où je viens, où je veux aller. Mais voici le problème: Comment puis-je invoquer l'action que je veux? Le nom est dynamique. Supposons que je suis dans le contrôleur après avoir cliqué sur "Oui", je veux appeler le "myMethodAction" de son nom que j'ai stocké en session. J'ai pensé à l'évaluer en utilisant l'API de langage d'expression, mais je suis bloqué parce que je ne peux pas accéder à ELContext, et je ne suis pas autorisé à utiliser le paquet el (el-api.jar). En résumé, après le clic, j'essaye d'invoquer une action/méthode, puis de rediriger vers une page, au lieu d'appeler une page.

Est-ce que quelqu'un a des idées magiques? Ou suis-je totalement faux?

Merci d'avance.

Répondre

1

Vous pouvez créer un bean géré entièrement indépendant ConfirmationBean et le placer dans la portée de la demande. Vous pouvez y accéder dans le haricot "parent" sous chaque installation managed property injection ou créez-le vous-même et placez-le dans la carte de requête.

La première façon nécessite beaucoup de travail dans faces-config.xml si vous voulez l'associer à beaucoup d'autres fèves, donc je ne pense pas que ce soit très attrayant.

La deuxième méthode nécessite uniquement un peu de code (réutilisable) dans la méthode d'action. Je vais donner un exemple:

public String submit() { 
    ConfirmationBean conformationBean = new ConfirmationBean(); 
    confirmationBean.setOutcome("outcome"); // Set navigation case outcome where it should return back. 
    FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put("confirmationBean", confirmationBean); 
    return "confirm"; 
} 

et le confirm.jsf devrait avoir le « résultat » dans un champ caché, par exemple

<h:selectBooleanCheckbox value="#{confirmationBean.confirm}" /> 
<h:inputHidden value="#{confirmationBean.outcome}" /> 
<h:commandButton value="confirm" action="#{confirmationBean.submit}" /> 

la méthode d'action de ConfirmationBean devrait ressembler à:

public String submit() { 
    if (confirm) { 
     return outcome; 
    } else { 
     return "confirm"; 
    } 
} 

ou si vous êtes fan des opérateurs ternaires;)

public String submit() { 
    return confirm ? outcome : "confirm"; 
} 
+0

Salut, merci pour votre réactivité! J'essaie actuellement de l'utiliser, je vous tiendrai au courant. – Baztoune

+0

Donc, votre solution est très bonne, sauf que je voudrais appeler une action au lieu de rediriger vers la page "résultat". Par exemple, je voudrais appeler myController.deleteTheItem(), qui, après avoir fait quelque chose, redirigerait vers la liste rafraîchie. Je posterai ce que j'ai trouvé. Merci pour votre aide. En passant, votre site Web est une bonne source d'informations utiles;) – Baztoune

+0

Ensuite, faites-le juste avant l'instruction 'return'. – BalusC

0

Je viens donc avec deux options: - Override the navigation management of JSF comme cette solution pour activer EL dans l'étiquette d'ID de vue

(solution suivante dans le message suivant, limité parce que je suis nouveau sur stackoverflow)

0

Deuxième solution: -Call l'action (chaîne stockée dans la confirmationBean en session) invoking EL comme cette solution

Cela pourrait être utile pour certaines personnes ici, mais indisponible pour moi car je ne suis pas autorisé à importer des bibliothèques (el-api).