web-dev-qa-db-fra.com

Comment obtenir l'URL de la demande dans le bean géré par jsf sans le servlet demandé?

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.

41
Lan

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ête
  • getScheme, 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.
70
Vineet Reynolds

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.

23
BalusC

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.

4
McDowell

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']}" />
1
Sky Games Inc