Obtenir la page en cours par programme


54

Dans un backing bean JSF (Managed Bean, Weld Bean, peu importe), je peux obtenir le chemin de contexte, le client est en appelant

FacesContext ctx = FacesContext.getCurrentInstance(); 
String path = ctx.getExternalContext().getRequestContextPath(); 

Cela me donne le chemin de la client accède actuellement, comme /myapplication. Est-il également possible d'obtenir la page actuelle , comme /home.faces, et comment?

102

Vous voulez normalement utiliser UIViewRoot#getViewId() pour cela.

String viewId = facesContext.getViewRoot().getViewId(); 

C'est en EL également disponible comme suit:

#{view.viewId} 

Exactement cette valeur est dans le cas où les résultats reuseable de navigation tels que <h:link outcome> et <h:button outcome>.


Vous pouvez également utiliser HttpServletRequest#getRequestURI() pour obtenir ce que l'utilisateur final voit effectivement dans la barre d'adresse du navigateur.

String uri = ((HttpServletRequest) externalContext.getRequest()).getRequestURI(); 

Ce qui est en EL également disponible comme suit:

#{request.requestURI} 

Exactement cette valeur est en reuseable <h:outputLink value> ou <a href> plaine. Notez que vous ne pouvez pas l'utiliser comme résultat de navigation.

+1

Cela ne fonctionne pas correctement. Avec PrettyFaces par exemple, cela ne donne pas l'URL qui a été appelée pour créer la page en cours. 25 mars. 122012-03-25 20:10:58

+1

@DoubleMalt: OP n'a pas indiqué qu'il utilise PrettyFaces. 25 mars. 122012-03-25 20:12:09

+4

Bien qu'il soit vrai, il n'a pas non plus déclaré explicitement qu'il ne l'avait pas fait. Mon propos était simplement que les bibliothèques qui étendent JSF pourraient casser votre solution (et PrettyFaces est une amélioration assez commune car la gestion de la navigation de l'implémentation standard est assez maladroite). Je voulais juste donner aux gens qui découvrent que votre solution propre ne fonctionne pas pour eux. 12 avril. 122012-04-12 11:58:49

  0

@DoubleMalt: Je ne fais pas de PrettyFaces, mais je serais très surpris si son gestionnaire de vue ne détermine pas l'URL correcte pour un résultat de navigation donné. 02 déc.. 122012-12-02 00:56:27

+1

@DoubleMalt, Prettyfaces est supposé être un simple url prettyfier. Votre déclaration sur la façon dont la mise en œuvre standard de la navigation est gérée est assez maladroite ... Eh bien, prettyfaces ne fait rien à propos de la navigation que JSF ne fait pas. Il ne fait que mapper son URL à un plus joli. Il a aussi des fonctionnalités liées aux paramètres, mais je ne les considère pas comme spécifiques à la navigation. 13 juin. 142014-06-13 22:01:34

  0

Cela sonne comme une bonne idée, mais la coulée getRequest à HttpServletRequest jetteront l'erreur suivante: ClassCastException: com.liferay.portlet.RenderRequestImpl ne peut pas être jeté à javax.servlet.http.HttpServletRequest On dirait getRequest() retourne un PortletRequestImpl, et je ne suis pas sûr de savoir comment obtenir l'URL en utilisant une telle classe. 20 août. 142014-08-20 22:41:12

+1

@Gaara: apparemment, vous développez une application de portlet, pas une application de servlet. Désolé, les portlets sont au-delà de moi. Recherchez simplement comment obtenir l'URI de demande à partir d'une instance 'PortletRequest'. 21 août. 142014-08-21 05:49:06


12

Ok, il a obtenu, il est

FacesContext ctx = FacesContext.getCurrentInstance(); 
HttpServletRequest servletRequest = (HttpServletRequest) ctx.getExternalContext().getRequest(); 
// returns something like "/myapplication/home.faces" 
String fullURI = servletRequest.getRequestURI(); 

2
String uri = ((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRequestURI(); 

1
String str = ((HttpServletRequest) FacesContext.getCurrentInstance() 
.getExternalContext().getRequest()).getRequestURI(); 
System.out.println(str); 
+2

Veuillez également expliquer votre réponse par des mots. 17 févr.. 132013-02-17 12:05:56

  0

Cela n'ajoute rien à la (aux) réponse (s) précédente (s). 10 juin. 152015-06-10 20:05:47