webentwicklung-frage-antwort-db.com.de

Wie erhalte ich die Anforderungs-URL in jsf managed Bean ohne das angeforderte Servlet?

Angenommen, die URL lautet http: // localhost: 8080/Projektname/resource.xhtml ,

Ich möchte folgendes http: // localhost: 8080/project-name In einer JSF-Managed Bean erhalten.

41
Lan

Ich gehe davon aus, dass Sie für diese Antwort JSF 2 und Java EE 6 verwenden.

Die Implementierung des tatsächlichen Mechanismus hängt davon ab, inwieweit Sie die ursprüngliche URL benötigen.

Sie müssen zunächst Zugriff auf den zugrunde liegenden Servlet-Container erhalten, der auf einen statt eines Portlet-Containers gesetzt wird, und das HttpServletRequest-Objekt erzeugt. Verwenden Sie das Objekt FacesContext , um auf das HttpServletRequest-Objekt auf folgende Weise zuzugreifen:

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

Die HttpServletRequest -Klasse stellt mehrere Dienstmethoden zur Verfügung, um eine nahezu vollständige Darstellung der ursprünglichen Anforderung zu erhalten:

  • getRequestURL() , das die ursprüngliche Anforderung liefert, die Abfragezeichenfolge
  • getScheme, getServerName, getServerPort, getContextPath, getServletPath, getPathInfo und getQueryString, deren Ausgänge nacheinander kombiniert werden können, um die ursprüngliche Anforderung zu erhalten. Möglicherweise müssen Sie die letzteren Aufrufe auslassen, wenn Sie ein geringeres Fragment der URL benötigen.
70
Vineet Reynolds

Sie können es wie folgt bekommen:

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

Beachten Sie, dass es möglicherweise bessere Möglichkeiten gibt, die Anforderung zu erreichen. Wenn Sie die rohe Servlet-API in einem JSF-Managed Bean verwenden, ist dies ein Code-Geruchsalarm.

23
BalusC

Sie können containerabhängige Abhängigkeiten vermeiden, indem Sie die ExternalContext in einer der folgenden Form verwenden:

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

Beachten Sie jedoch, dass dieser Code möglicherweise nicht vollständig containeragnostisch ist. Einige dieser Methoden werfen eine UnsupportedOperationException in ihrer Standardimplementierung. Dieser Code basiert auf JSF 2.0-Methoden.

Beachten Sie auch, dass die Verwendung eines solchen URIs als Basis nicht der richtige Weg ist, auf eine Ressource in Ihrer Anwendung im allgemeinen Fall zu verweisen. ViewHandler und ExternalContext sollten zusammen verwendet werden, um Ressourcen-URLs zu erstellen, die auf Anwendungsressourcen verweisen, um beispielsweise Ressourcen- oder Aktions-URLs zum Aufrufen des JSF-Lebenszyklus abzurufen.

Leider glaube ich nicht, dass es eine generelle, Container-agnostische Methode gibt, um all das zu tun, was Sie möglicherweise in einer JSF-App tun möchten. Daher sind Sie manchmal auf die Implementierung angewiesen und haben nur eine Wahl, auf die Sie sich verlassen müssen andere APIs.

4
McDowell

Der beste Weg ist, auf die ExternalContext RequestHeaderMap-Attribute zuzugreifen.

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

Sie können das urlRefered-Attribut in Ihrem Bean speichern und auf Ihrer Xhtml-Seite wie folgt verarbeiten:

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

Vergessen Sie auch nicht, Ihre Fehlerseite in Ihrer Datei web.xml abzubilden.

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

Auf der anderen Seite können Sie es auch aus dieser Zeile direkt zur xhtml-Seite bekommen:

<h:outputText value="#{requestScope['javax.servlet.forward.request_uri']}" />
1
Sky Games Inc