【问题标题】:Get the request URL in a JSF bean?在 JSF bean 中获取请求 URL?
【发布时间】:2010-07-21 19:17:18
【问题描述】:

如何在支持 JSF 页面的 bean 中获取请求 URL?我一直在查看 FacesContext 文档,我能找到的最佳方法似乎非常长:

public String getRequestURL()
{
    Object request = FacesContext.getCurrentInstance().getExternalContext().getRequest();
    if(request instanceof HttpServletRequest)
    {
            return ((HttpServletRequest) request).getRequestURL().toString();
    }else
    {
        return "";
    }
}

编辑:功能要求这里的要求是我们需要第三方 javascript 实用程序的完整 URL。该实用程序的使用或体系结构不适合 JSF,但没有此调用的所有内容都可以。我找到的方法会起作用,但是深入研究 FacesContext 感觉不对。此外,我希望有一种方法可以用 JSF 表达式语言调用,因为这将以“视图”相关的方式使用。

【问题讨论】:

    标签: java jsf servlets


    【解决方案1】:

    如果您需要通过 FacesContext 从 JSF 引擎盖下获取原始 Servlet API,那么您很可能在错误的地方做这项工作。它是什么,您认为这是正确解决方案的功能需求?您是否应该使用真正的Servlet 类或Filter 而不是JSF 托管bean?或者您可能根本不需要请求 URL,因为有更好的“jsfish”方法来实现相同的目标?

    如果您更新您的问题以包含有关功能要求的详细信息,那么我们或许能够建议正确的解决方案。


    更新根据您的编辑:所以,您毕竟只需要在视图方面吗?例如。 #{bean.requestURL}?您也可以从HttpServletRequest 对象中获取它,该对象已经在 EL 中隐式可用。

    当您使用 JSP 时:

    ${pageContext.request.requestURL}
    

    或者当您使用 Facelets 时:

    #{request.requestURL}
    

    现在,JavaScript 如何需要它?作为 JavaScript 变量打印?像这样?

    var url = '#{request.requestURL}';
    

    如果是这样,您也可以直接使用 window.location

    var url = window.location;
    

    无需让 JSF bean 与视图特定的细节混为一谈。

    【讨论】:

    • 感谢您清理所有各种拉出它的方法!
    • 我最终能够解决它,但我会使用 window.location
    【解决方案2】:

    您已经回答了 :) 恐怕您必须以这种方式使用它,因为每个 HTTP 请求都必须从 faces 上下文中检索。当然,您可以简化此方法的某些部分,例如面部上下文检索,但这绝对是要走的路,除非您使用某种框架来抽象出这些细节并让您直接访问 HttpRequest 对象。

    问候。

    【讨论】:

      【解决方案3】:

      你可以得到带有所有参数的url:

      HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()
                          .getRequest();
      String url = req.getHeader("referer");
      

      【讨论】:

        猜你喜欢
        • 2011-09-05
        • 1970-01-01
        • 2011-02-28
        • 2011-11-21
        • 2011-08-15
        • 2011-11-11
        • 2012-09-16
        • 2011-03-22
        • 2011-05-01
        相关资源
        最近更新 更多