Obtener página actual mediante programación


54

En un bean de respaldo JSF (Managed Bean, Weld Bean, no importa), puedo obtener la ruta de contexto el cliente está en llamando

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

Esto me da la ruta de la el cliente tiene acceso actualmente, como /myapplication. ¿También es posible obtener la página actual, como /home.faces, y cómo?

102

Normalmente se desea utilizar para este UIViewRoot#getViewId().

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

Esta se encuentra en El también disponible como sigue:

#{view.viewId} 

Exactamente este valor es reutilizable en el caso de navegación resultados como la <h:link outcome> y <h:button outcome>.


Como alternativa, también se puede utilizar para obtener HttpServletRequest#getRequestURI() cualquiera que sea el usuario final está viendo realmente en la barra de direcciones del navegador.

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

¿Qué es en El también disponible como sigue:

#{request.requestURI} 

Exactamente este valor es reutilizable en <h:outputLink value> o simple <a href>. Tenga en cuenta que no puede usarlo como resultado del caso de navegación.

+1

Esto no funciona de forma fiable. Con PrettyFaces, por ejemplo, esto no da la URL que se llamó para crear la página actual. 25 mar. 122012-03-25 20:10:58

+1

@DoubleMalt: OP no indicó que esté usando PrettyFaces. 25 mar. 122012-03-25 20:12:09

+4

Si bien es cierto, tampoco declaró explícitamente que no lo hizo. Mi punto era simplemente que las bibliotecas que amplían JSF pueden romper su solución (y PrettyFaces es una mejora muy común ya que el manejo de la implementación estándar de navegación es bastante torpe). Solo quería darles a las personas que lo descubren, que su solución limpia no funciona para ellos, una pista de por qué. 12 abr. 122012-04-12 11:58:49

  0

@DoubleMalt: No hago PrettyFaces, pero me sorprendería mucho que su manejador de vista no determine la URL adecuada para un resultado de caso de navegación dado. 02 dic. 122012-12-02 00:56:27

+1

@DoubleMalt, se supone que Prettyfaces es una simple url más bella. Su afirmación de 'el manejo de navegación de la implementación estándar es bastante torpe' ... Bueno, las cosas bonitas no hacen nada acerca de la navegación que JSF no hace. Simplemente asigna sus url's a unos más bonitos. También tiene funcionalidades relacionadas con los parámetros, pero no las considero específicas de la navegación. 13 jun. 142014-06-13 22:01:34

  0

Esto suena como una buena idea, sin embargo fundición getRequest a HttpServletRequest lanzará el siguiente error: ClassCastException: com.liferay.portlet.RenderRequestImpl no se puede convertir a javax.servlet.http.HttpServletRequest parece que getRequest() devolverá un PortletRequestImpl, y no estoy seguro de cómo obtener la URL usando dicha clase. 20 ago. 142014-08-20 22:41:12

+1

@ Gaara: aparentemente estás desarrollando una aplicación de portlet, no una aplicación de servlet. Lo siento, los portlets me sobrepasan. Simplemente busque cómo obtener el URI de solicitud de una instancia de 'PortletRequest'. 21 ago. 142014-08-21 05:49:06


12

Entendido, es

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

Por favor explique su respuesta en palabras también. 17 feb. 132013-02-17 12:05:56

  0

Esto no agrega nada a la (s) respuesta (s) anterior (es). 10 jun. 152015-06-10 20:05:47