如何在支持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表达式语言调用的方法,因为它将以“视图”相关的方式使用。
答案 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>
问候。