【问题标题】:How do I get request url in jsf managed bean without the requested servlet?如何在没有请求的 servlet 的情况下在 jsf 托管 bean 中获取请求 url?
【发布时间】:2011-09-05 23:49:23
【问题描述】:

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

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

【问题讨论】:

    标签: java jsf


    【解决方案1】:

    我假设您使用 JSF 2 和 Java EE 6 来回答这个问题。

    实际机制的实现会因您需要原始 URL 的程度而异。

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

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

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

    • getRequestURL(),提供无查询字符串的原始请求
    • getSchemegetServerNamegetServerPortgetContextPathgetServletPathgetPathInfogetQueryString的所有输出都可以依次组合得到原始请求。如果您想要 URL 的较小片段,您可能不得不省略后面的调用。

    【讨论】:

    • 由于我在本地主机上,现在无法使用真实域名对其进行测试。你能告诉我其中一种方法会给我域名吗?我想检索 www.mydomain.com
    【解决方案2】:

    你可以通过以下方式获取:

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

    【讨论】:

    • @BalusC,工作正常,但在应用程序名称之前返回两个斜杠。
    • @BalusC 如果这是代码异味,那么更好的方法是什么?我正在尝试做类似的事情:stackoverflow.com/questions/20483043/…
    • @jeff:在这种特殊情况下,我指的是 import javax.servlet.*HttpServletRequest 一样。你没有。
    【解决方案3】:

    您可以通过使用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 以引用应用程序资源以获取资源或操作 URL 以调用 JSF 生命周期。

    不幸的是,我不认为有一种通用的、与容器无关的方式来执行您可能想要在 JSF 应用程序中执行的所有操作,因此有时您依赖于实现并且您别无选择,但转换为其他 API。

    【讨论】:

      【解决方案4】:

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

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

      您可以将 urlRefered 属性保存在您的 bean 中并在您的 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']}" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-01
        • 1970-01-01
        • 2013-01-05
        • 2011-05-15
        • 2017-02-13
        • 2019-09-12
        • 1970-01-01
        • 2016-06-15
        相关资源
        最近更新 更多