Bonjour,
J'ai une application web au sein de laquelle les utilisateurs peuvent acceder directement à certaines pages (par exemple une page de visualisation d'un item, ou encore une page d'édition).
Afin de réaliser ceci, je fournis une URL particulière. Cette URL est accessible à l'extérieur de mon appli web, comme par exemple au sein d'un email ou d'une autre appli-web.
L'url ressemble à quelque chose de ce genre :
où :
Code : Sélectionner tout - Visualiser dans une fenêtre à part http://myserver/my-app/forward.jsf?action=XXX&actionParam=YYY
- action représente un identifiant symbolisant la page vers laquelle l'utilisateur va être redirigé. On peut considérer cela comme le from-outcome d'une règle de navigation de JSF.
- actionParam est un paramètre pour l'action précédente (généralement un ID).
Je vais par exemple avoir ce genre d'URL :
Du côté Java, j'ai un bean qui va réaliser certains tests de sécurité (savoir si l'utilisateur a le droit de voir / éditer l'item en question par exemple). Ensuite, il redirige l'utilisateur vers la bonne page, par ex. edit.xhtml, view.xhtml ou access-denied.xhtml si l'utilisateur n'est pas censé voir cette page.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 http://myserver/my-app/forward.jsf?action=viewItem&actionParam=1234 http://myserver/my-app/forward.jsf?action=editItem&actionParam=1234
Mon implementation actuelle
Aujourd'hui, la façon de faire est très basique : Quand un utilisateur clique sur l'URL, la page XHTML suivante est appelée :
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <html> <body> <form id="forwardForm"> <h:inputHidden id="myAction" binding="#{forwardBean.hiddenAction}"/> <h:inputHidden id="myParam" binding="#{forwardBean.hiddenActionParam}"/> <h:commandButton id="forwardBtn" actionListener="#{forwardBean.doForward}" style="display: none;"/> <script type="text/javascript"> document.getElementById('forwardForm:forwardBtn').click(); </script> </form> </body> </html>
On peut le voir, je binde 2 <h:inputHidden> dans mon bean Java. Ils vont être utilisés pour stocker la valeur de action et actionParam, en les récupérant depuis les paramètres de la requête :
Je fournis également une action doForward qui va être immédiatement appelée quand la page est créée, ce qui va avoir comme conséquence de redirigé à nouveau l'utilisateur sur la bonne page cette fois-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("actiontParam");
Cette solution fonctionne, mais me pose 2 soucis :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public void doForward(ActionEvent evt) { FacesContext facesContext = FacesContext.getCurrentInstance(); String redirect = // define the navigation rule that must be used in order to redirect the user to the adequate page... NavigationHandler myNav = facesContext.getApplication().getNavigationHandler(); myNav.handleNavigation(facesContext, null, redirect); }
- Je n'aime pas cette façon de faire, je suis sûr que l'on peut trouver quelque chose de plus propre.
- Nous devons bientôt gérer le BlackBerry, et le Javascript est tout simplement interdit (oui, le BB supporte le JS, mais là n'est pas la question).
Il me faut donc considérer une refactorisation de cette fonctionnalité de redirection. Comment dois-je aborder la chose ?
Je précise une chose : dans mon doForward, je vais rediriger l'utilisateur vers une page donnée, cette page étant identifiée via son from-outcome dans le fichier faces-config.xml. Autrement dit, cette redirection se base sur un contexte JSF qui doit donc être existant.
La solution d'opter pour une Servlet ne me parait pas forcément une bonne idée donc..
Infos Techniques
Java 1.6, JSF 1.2, Facelets, Richfaces 3.3
Partager