在JSF bean中获取请求URL?

时间:2010-07-21 19:17:19

标签: java jsf servlets

如何在支持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实用程序的完整网址。该实用程序的使用或体系结构不适合JSF,但是这个调用的所有内容都没有。我发现的方法会起作用,但是如果深入挖掘FacesContext则感觉不对。另外,我希望有一种可以用JSF表达式语言调用的方法,因为它将以“视图”相关的方式使用。

2 个答案:

答案 0 :(得分:31)

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

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


根据您的编辑

更新:所以,您只需要在视图方面完全需要它?例如。 #{bean.requestURL}?您也可以从已在EL中隐式提供的HttpServletRequest对象中获取它。

当您使用JSP时:

${pageContext.request.requestURL}

或者当你在Facelets上时:

#{request.requestURL}

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

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

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

var url = window.location;

不需要使用视图特定的细节来混淆JSF bean。

答案 1 :(得分:3)

你已经有了回答:)我担心你必须以这种方式使用它,因为每个HTTP请求都必须从faces上下文中检索。当然,您可以简化此方法的某些部分,例如面部上下文检索,但最终可以采用这种方式,除非您使用某种框架来抽象出这些细节并让您直接访问HttpRequest对象。 / p>

问候。