如何在没有请求的servlet的情况下在jsf托pipebean中获取请求url?

假设URL是http:// localhost:8080 / project-name / resource.xhtml ,

我想在JSF托pipebean中获得以下http:// localhost:8080 / project-name 。

我假设你正在使用JSF 2和Java EE 6作为这个答案。

实际机制的实现将取决于您需要原始URL的程度。

你首先需要访问底层的servlet容器(假设为一个,而不是一个portlet容器)生成HttpServletRequest对象。 使用FacesContext对象按以下方式访问HttpServletRequest对象:

 HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 

HttpServletRequest类提供了几种实用方法来获取原始请求的近似表示:

  • getRequestURL() ,它提供原始的请求sans查询string
  • getSchemegetServerNamegetServerPortgetContextPathgetServletPathgetPathInfogetQueryString所有输出可以按顺序组合以获取原始请求。 如果您想要较小的URL片段,则可能不得不省略后者的调用。

你可以得到它如下:

 HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); String url = req.getRequestURL().toString(); return url.substring(0, url.length() - req.getRequestURI().length()) + req.getContextPath() + "/"; // ... 

请注意,有可能有更好的方法来达到这个要求。 在JSF托pipebean中获取原始Servlet API是一种代码异味警报。

您可以通过使用如下forms的ExternalContext来避免容器特定的依赖性:

 public String getApplicationUri() { try { FacesContext ctxt = FacesContext.getCurrentInstance(); ExternalContext ext = ctxt.getExternalContext(); URI uri = new URI(ext.getRequestScheme(), null, ext.getRequestServerName(), ext.getRequestServerPort(), ext.getRequestContextPath(), null, null); return uri.toASCIIString(); } catch (URISyntaxException e) { throw new FacesException(e); } } 

但是,请注意,此代码可能不是完全容器不可知的 – 其中一些方法在默认实现中抛出UnsupportedOperationException 。 这段代码依赖于JSF 2.0方法。

您还应该注意,使用这样的URI作为基础不是在一般情况下引用应用程序中的资源的正确方法; 例如, ViewHandlerExternalContext应协同使用来创build资源URL,以便引用应用程序资源来获取调用JSF生命周期的资源或操作URL。

不幸的是,我不认为有一个通用的,容器不可知的方法来做你可能想在JSF应用程序中做的所有事情,所以有时候你依赖于实现,你别无select,只能抛弃其他API 。

最好的方法是访问ExternalContext的RequestHeaderMap属性。

  ExternalContext ext = FacesContext.getCurrentInstance().getExternalContext(); Map<String,String> requestHeader = ext.getRequestHeaderMap(); urlRefered = requestHeader.get("referer"); 

您可以将urlRefered属性保存在您的bean中,并在您的xhtml页面中进行处理,如下所示:

 <h:outputText value="#{notFoundBean.urlRefered} 

别忘了在web.xml文件中映射错误页面。

 <error-page> <error-code>404</error-code> <location>/xhtml/pg/error/404.xhtml</location> </error-page> 

另一方面,你也可以从这一行直接到xhtml页面:

 <h:outputText value="#{requestScope['javax.servlet.forward.request_uri']}" />