En supposant que l'URL est http: // localhost: 8080/nom-projet/ressource.xhtml ,
Je souhaite obtenir le fichier suivant: http: // localhost: 8080/nom-projet Dans un bean géré par JSF.
Je suppose que vous utilisez JSF 2 et Java EE 6 pour cette réponse.
L'implémentation du mécanisme réel varie en fonction de l'utilité de l'URL d'origine.
Vous devez d'abord avoir accès au conteneur HttpServletRequest produit par le conteneur de servlet sous-jacent (supposé en avoir un, au lieu d'un conteneur de portlet). Utilisez l'objet FacesContext
pour accéder à l'objet HttpServletRequest de la manière suivante:
HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
La classe HttpServletRequest
fournit plusieurs méthodes utilitaires pour obtenir une représentation proche de la requête d'origine:
getRequestURL()
, qui fournit la requête d'origine sans la chaîne de requêtegetScheme
, getServerName
, getServerPort
, getContextPath
, getServletPath
, getPathInfo
et getQueryString
dont toutes les sorties peuvent être combinées en séquence pour obtenir la demande initiale. Vous devrez peut-être omettre ces dernières invocations si vous souhaitez un fragment plus petit de l'URL.Vous pouvez l'obtenir comme suit:
HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
String url = req.getRequestURL().toString();
return url.substring(0, url.length() - req.getRequestURI().length()) + req.getContextPath() + "/";
// ...
Notez qu'il existe peut-être de meilleures façons de satisfaire à l'exigence. Obtenir l'API Servlet brute dans un bean géré JSF est une alarme d'odeur de code.
Vous pouvez éviter les dépendances spécifiques au conteneur en utilisant le ExternalContext
de la manière suivante:
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);
}
}
Toutefois, notez que ce code peut ne pas être entièrement agnostique par conteneur - certaines de ces méthodes jettent une variable UnsupportedOperationException
dans leur implémentation par défaut. Ce code repose sur les méthodes JSF 2.0.
Vous devriez également noter que l'utilisation d'un URI comme celui-ci comme base n'est pas la bonne façon de faire référence à une ressource de votre application dans le cas général; ViewHandler
et ExternalContext
doivent être utilisés conjointement pour créer des URL de ressource permettant de faire référence à des ressources d'application pour extraire des ressources ou des URL d'action pour invoquer le cycle de vie JSF, par exemple.
Malheureusement, je ne pense pas qu'il existe un moyen général, indépendant du conteneur, de faire tout ce que vous pourriez vouloir faire dans une application JSF. Vous êtes donc parfois tributaire de la mise en œuvre et vous n'avez guère d'autre choix que de vous d'autres API.
Le meilleur moyen consiste à accéder aux attributs ExternalContext RequestHeaderMap.
ExternalContext ext = FacesContext.getCurrentInstance().getExternalContext();
Map<String,String> requestHeader = ext.getRequestHeaderMap();
urlRefered = requestHeader.get("referer");
Vous pouvez enregistrer l'attribut urlRefered dans votre bean et le traiter dans votre page xhtml comme suit:
<h:outputText value="#{notFoundBean.urlRefered}
N'oubliez pas de mapper votre page d'erreur dans votre fichier web.xml.
<error-page>
<error-code>404</error-code>
<location>/xhtml/pg/error/404.xhtml</location>
</error-page>
D'un autre côté, vous pouvez également l'obtenir depuis cette ligne directement vers la page xhtml:
<h:outputText value="#{requestScope['javax.servlet.forward.request_uri']}" />