【发布时间】:2011-09-05 23:49:23
【问题描述】:
假设网址是http://localhost:8080/project-name/resource.xhtml,
我想获取以下http://localhost:8080/project-name 在 JSF 托管 bean 中。
【问题讨论】:
假设网址是http://localhost:8080/project-name/resource.xhtml,
我想获取以下http://localhost:8080/project-name 在 JSF 托管 bean 中。
【问题讨论】:
我假设您使用 JSF 2 和 Java EE 6 来回答这个问题。
实际机制的实现会因您需要原始 URL 的程度而异。
您首先需要访问生成的 HttpServletRequest 对象的底层 servlet 容器(假设是一个,而不是 portlet 容器)。使用FacesContext对象访问HttpServletRequest对象,方式如下:
HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
HttpServletRequest 类提供了几种实用方法来获得原始请求的近似表示:
getRequestURL(),提供无查询字符串的原始请求getScheme、getServerName、getServerPort、getContextPath、getServletPath、getPathInfo和getQueryString的所有输出都可以依次组合得到原始请求。如果您想要 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 托管 bean 中获取原始 Servlet API 是一种代码异味警报。
【讨论】:
import javax.servlet.* 与 HttpServletRequest 一样。你没有。
您可以通过使用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 作为基础并不是在应用程序中引用资源的正确方法;例如,ViewHandler 和 ExternalContext 应一起使用,以创建资源 URL 以引用应用程序资源以获取资源或操作 URL 以调用 JSF 生命周期。
不幸的是,我不认为有一种通用的、与容器无关的方式来执行您可能想要在 JSF 应用程序中执行的所有操作,因此有时您依赖于实现并且您别无选择,但转换为其他 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']}" />
【讨论】: