Comment obtenir l'url de la requête dans JSF managed bean sans le servlet demandé?

en supposant que L'URL est http://localhost:8080/project-name/resource.xhtml,

je veux obtenir le suivant <!--5 http://localhost:8080/project-name dans un JSF géré bean.

40
demandé sur Vineet Reynolds 2011-06-01 09:01:59

4 réponses

je suppose que vous utilisez JSF 2 et Java EE 6 pour cette réponse.

la mise en œuvre du mécanisme réel variera en fonction de la mesure dans laquelle vous aurez besoin de l'URL originale.

vous aurez d'abord besoin d'accéder au conteneur servlet sous-jacent (supposé à un, au lieu d'un conteneur portlet) produit par L'objet HttpServletRequest. Utilisez le FacesContext objet pour accéder à L'objet HttpServletRequest manière suivante:

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

HttpServletRequest class fournit plusieurs méthodes d'utilité pour obtenir une représentation approximative de la requête initiale:

  • getRequestURL(), qui fournit la requête originale 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 requête originale. Vous devrez peut-être omettre ce dernier invocations si vous voulez un petit fragment de L'URL.
68
répondu Vineet Reynolds 2013-08-23 05:47:48

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() + "/";
// ...

Remarque qu'il y a probablement de meilleures façons d'atteindre l'exigence. Obtenir l'API de Servlet brut à l'intérieur d'un bean géré par JSF est une alarme d'odeur de code.

22
répondu BalusC 2012-10-23 14:03:02

vous pouvez éviter les dépendances spécifiques à un conteneur en utilisant le ExternalContext sous une forme semblable:

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);
  }
}

cependant, notez que ce code peut ne pas être entièrement container-agnostic-certaines de ces méthodes jeter un UnsupportedOperationException dans leur implémentation par défaut. Ce code s'appuie sur les méthodes JSF 2.0.

Vous devriez noter également que l'utilisation d'un URI comme ce n'est pas la bonne manière de se référer à une ressource dans votre application dans le cas général; la ViewHandler et ExternalContext doit être utilisé de concert pour créer des URLs de ressources pour renvoyer aux ressources de l'application pour récupérer des ressources ou des URLs d'action pour invoquer le cycle de vie JSF, par exemple.

malheureusement, Je ne pense pas qu'il y ait une façon générale, container-agnostique de faire tout ce que vous pourriez vouloir faire dans une application JSF, donc parfois vous êtes dépendant de la mise en œuvre et vous avez peu d'autre choix que de vous rabattre sur d'autres API.

4
répondu McDowell 2011-06-01 13:59:24

la meilleure façon est d'accéder au contexte externe RequestHeaderMap attributes.

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

vous pouvez sauvegarder l'attribut urlRefered dans votre fève et le traiter dans votre page xhtml comme suit:

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

n'oubliez pas de cartographier votre page d'erreur dans votre site web.fichier xml.

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

de l'autre côté, vous pouvez aussi l'obtenir directement de cette ligne à la page xhtml:

<h:outputText value="#{requestScope['javax.servlet.forward.request_uri']}" />
1
répondu Sky Games Inc 2017-01-04 11:59:34