获取 JSF bean 中的请求 URL?

2022-09-02 12:30:47

如何在支持 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 不太契合,但除了此调用之外的所有内容都适合 JSF。我发现的方法会起作用,但是深入研究FacesContext感觉不对劲。此外,我希望有一种方法可以用JSF表达式语言调用,因为它将以与“视图”相关的方式使用。


答案 1

如果您需要通过 JSF 引擎盖从下面拖动原始 Servlet API,那么您很可能在错误的地方完成了这项工作。它是什么,您认为这是正确解决方案的功能要求?你是否应该使用真正的类或代替JSF托管Bean?或者,也许您根本不需要请求URL,因为有更好的“jsfish”方法可以实现相同的目标?FacesContextServletFilter

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


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

当您在 JSP 上时:

${pageContext.request.requestURL}

或者,当您使用 Facelets 时:

#{request.requestURL}

现在,JavaScript需要它吗?打印为 JavaScript 变量?这样?

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

如果是这样,你也可以抓住window.location

var url = window.location;

无需将 JSF Bean 与视图特定的详细信息混为一谈。


答案 2

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

问候。


推荐