在JSF bean中获取请求URL?

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

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

编辑:function要求这里的要求是我们需要第三方JavaScript实用程序的完整URL。 该实用程序的使用或体系结构不适合JSF,但是这个调用的所有内容都不合适。 我发现的方法会起作用,但是如果深入挖掘FacesContext则感觉不对。 另外我希望有一种可以用JSF表达式语言调用的方法,因为它将以“视图”相关的方式使用。

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

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


按照您的编辑进行更新 :那么,您在视图方面究竟需要它吗? 例如#{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。

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

问候。