如何在没有请求的servlet的情况下在jsf托管bean中获取请求URL?

时间:2011-06-01 05:01:59

标签: java jsf

假设网址为http://localhost:8080/project-name/resource.xhtml

我想获得以下http://localhost:8080/project-name 在JSF托管bean中。

4 个答案:

答案 0 :(得分:71)

我假设你使用JSF 2和Java EE 6来解决这个问题。

实际机制的实施将根据您需要原始网址的程度而有所不同。

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

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

HttpServletRequest类提供了几种实用方法来获取原始请求的近似表示:

  • getRequestURL(),它提供的原始请求没有查询字符串
  • getSchemegetServerNamegetServerPortgetContextPathgetServletPathgetPathInfogetQueryString所有输出都可以是按顺序组合以获得原始请求。如果您想要一个较小的URL片段,则可能必须省略后面的调用。

答案 1 :(得分:24)

您可以按照以下方式获取:

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是一种代码异味警报。

答案 2 :(得分:4)

您可以使用ExternalContext之类的形式来避免特定于容器的依赖项:

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。此代码依赖于JSF 2.0方法。

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

不幸的是,我不认为在JSF应用程序中执行您可能想做的所有操作都不存在与容器无关的一般方法,所以有时您依赖于实现而您别无选择转向其他API。

答案 3 :(得分:1)

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

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

您可以在您的bean中保存urlRefered属性并在xhtml页面中处理如下:

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

不要忘记在您的web.xml文件中映射您的错误页面。

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

另一方面,你也可以从这一行直接获取它到xhtml页面:

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