Java 如果没有请求的servlet,如何在jsf托管bean中获取请求url?

Java 如果没有请求的servlet,如何在jsf托管bean中获取请求url?,java,jsf,Java,Jsf,假设URL是 我想获得以下信息 在JSF管理的bean中。我假设您使用JSF2和JavaEE6来回答这个问题 实际机制的实现将根据您需要原始URL的程度而有所不同 您首先需要访问由HttpServletRequest对象生成的底层servlet容器(假定为一个容器,而不是portlet容器)。使用该对象以以下方式访问HttpServletRequest对象: HttpServletRequest origRequest = (HttpServletRequest)FacesContext.get

假设URL是

我想获得以下信息 在JSF管理的bean中。

我假设您使用JSF2和JavaEE6来回答这个问题

实际机制的实现将根据您需要原始URL的程度而有所不同

您首先需要访问由HttpServletRequest对象生成的底层servlet容器(假定为一个容器,而不是portlet容器)。使用该对象以以下方式访问HttpServletRequest对象:

HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
该类提供了几种实用方法来获得原始请求的近似表示:

  • ,它提供原始请求,而不包含查询字符串
  • getScheme
    getServerName
    getServerPort
    getContextPath
    getServletPath
    getPathInfo
    getQueryString
    所有输出都可以按顺序组合以获得原始请求。如果希望URL的片段更少,则可能必须省略后一个调用

您可以通过以下方式获得:

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

请注意,可能有更好的方法来实现需求。在JSF托管bean中获取原始Servlet API是一个代码气味警报。

您可以通过使用类似以下形式的

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);
  }
}
但是,请注意,此代码可能并不完全与容器无关-其中一些方法在其默认实现中抛出
UnsupportedOperationException
。此代码依赖于JSF2.0方法

您还应该注意,在一般情况下,使用这样的URI作为基础并不是引用应用程序中资源的正确方法;例如,
ViewHandler
ExternalContext
应协同使用,以创建资源URL,用于引用应用程序资源以获取资源,或用于调用JSF生命周期的操作URL


不幸的是,我不认为有一种通用的、与容器无关的方法来完成JSF应用程序中可能需要做的所有事情,因此有时您依赖于实现,除了使用其他API之外别无选择。

最好的方法是访问ExternalContext RequestHeaderMap属性

    ExternalContext ext = FacesContext.getCurrentInstance().getExternalContext();
    Map<String,String> requestHeader = ext.getRequestHeaderMap();
    urlRefered = requestHeader.get("referer");
ExternalContext ext=FacesContext.getCurrentInstance().getExternalContext();
Map requestHeader=ext.getRequestHeaderMap();
urlRefered=requestHeader.get(“referer”);
您可以在bean中保存urlRefered属性,并在xhtml页面中处理,如下所示:

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

@BalusC,它工作正常,但在应用程序名称前返回两个斜杠。@BalusC如果这是代码味道,那么更好的方法是什么?我正在尝试做一些类似的事情:@jeff:我指的是在这个特殊的例子中,
import javax.servlet.
HttpServletRequest
一样。你没有。因为我现在在本地主机上,没有办法用一个真正的域名来测试它。你能告诉我哪种方法能给我域名吗?我想检索www.mydomain.com
<error-page>
    <error-code>404</error-code>
    <location>/xhtml/pg/error/404.xhtml</location>
</error-page>
<h:outputText value="#{requestScope['javax.servlet.forward.request_uri']}" />