2011-06-01 21 views

Respuesta

65

Supongo que está utilizando JSF 2 y Java EE 6 para esta respuesta.

La implementación del mecanismo real variará según el grado en que necesite la URL original.

Primero tendrá que obtener acceso al contenedor de servlets subyacente (se supone que uno, en lugar de un contenedor de portlet) produjo el objeto HttpServletRequest. Utilice el objeto FacesContext para acceder al objeto HttpServletRequest de la siguiente manera:

HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 

La clase HttpServletRequest proporciona varios métodos de utilidad para obtener una representación cerca de la solicitud original:

  • getRequestURL(), que proporciona el original sans solicitud de la cadena de consulta
  • getScheme, getServerName, getServerPort, getContextPath, getServletPath, getPathInfo y getQueryString, cuyas salidas se pueden combinar en secuencia para obtener la solicitud original. Puede que tenga que omitir las últimas invocaciones si desea un fragmento menor de la URL.
+0

Desde que estoy en el servidor local y no hay forma de probarlo ahora mismo con un nombre de dominio real. ¿Podría decirme cuál de esos métodos me daría el dominio? Quiero recuperar www.midominio.com – Ced

19

Usted puede obtener de la siguiente manera:

HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
String url = req.getRequestURL().toString(); 
return url.substring(0, url.length() - req.getRequestURI().length()) + req.getContextPath() + "/"; 
// ... 

Tenga en cuenta que posiblemente hay mejores maneras de alcanzar el requisito. Obtener la API de Servlet sin formato dentro de un bean gestionado JSF es una alarma de olor a código.

+0

Gracias por su respuesta inteligente. – Lan

+0

@BalusC, que funciona bien pero devuelve barras de arrastre antes del nombre de la aplicación. –

+0

@Mah: ver respuesta actualizada. – BalusC

4

Puede evitar dependencias específica del contenedor mediante el uso de la ExternalContext en algo como esto forma:

public String getApplicationUri() { 
    try { 
    FacesContext ctxt = FacesContext.getCurrentInstance(); 
    ExternalContext ext = ctxt.getExternalContext(); 
    URI uri = new URI(ext.getRequestScheme(), 
      null, ext.getRequestServerName(), ext.getRequestServerPort(), 
      ext.getRequestContextPath(), null, null); 
    return uri.toASCIIString(); 
    } catch (URISyntaxException e) { 
    throw new FacesException(e); 
    } 
} 

Sin embargo, tenga en cuenta que este código no puede ser totalmente contenedor agnóstica - algunos de esos métodos lanzan una UnsupportedOperationException en su implementación predeterminada. Este código se basa en los métodos JSF 2.0.

También debe tener en cuenta que el uso de un URI como este como base no es la forma correcta de referirse a un recurso en su aplicación en el caso general; el ViewHandler y el ExternalContext se deben usar en concierto para crear URL de recursos para hacer referencia a recursos de la aplicación para buscar recursos o URL de acción para invocar el ciclo de vida JSF, por ejemplo.

Desafortunadamente, no creo que exista una forma general, independiente del contenedor, de hacer todo lo que pueda desear en una aplicación JSF, por lo que a veces depende de la implementación y no tiene más remedio que arrojar a otras API.

+0

Gracias es genial. – Lan

1

La mejor manera es acceder a los atributos ExternalContext RequestHeaderMap.

ExternalContext ext = FacesContext.getCurrentInstance().getExternalContext(); 
    Map<String,String> requestHeader = ext.getRequestHeaderMap(); 
    urlRefered = requestHeader.get("referer"); 

Usted puede ahorrar el atributo urlRefered en su frijol y el proceso en su página XHTML de la siguiente manera:

<h:outputText value="#{notFoundBean.urlRefered} 

No se olvide de la cartografía de su página de error en el archivo web.xml también.

<error-page> 
    <error-code>404</error-code> 
    <location>/xhtml/pg/error/404.xhtml</location> 
</error-page> 

Por otro lado también se puede obtener de esta línea directamente a la página XHTML:

<h:outputText value="#{requestScope['javax.servlet.forward.request_uri']}" /> 
Cuestiones relacionadas