Java 如果没有请求的servlet,如何在jsf托管bean中获取请求url?
假设URL是 我想获得以下信息 在JSF管理的bean中。我假设您使用JSF2和JavaEE6来回答这个问题 实际机制的实现将根据您需要原始URL的程度而有所不同 您首先需要访问由HttpServletRequest对象生成的底层servlet容器(假定为一个容器,而不是portlet容器)。使用该对象以以下方式访问HttpServletRequest对象:Java 如果没有请求的servlet,如何在jsf托管bean中获取请求url?,java,jsf,Java,Jsf,假设URL是 我想获得以下信息 在JSF管理的bean中。我假设您使用JSF2和JavaEE6来回答这个问题 实际机制的实现将根据您需要原始URL的程度而有所不同 您首先需要访问由HttpServletRequest对象生成的底层servlet容器(假定为一个容器,而不是portlet容器)。使用该对象以以下方式访问HttpServletRequest对象: HttpServletRequest origRequest = (HttpServletRequest)FacesContext.get
HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
该类提供了几种实用方法来获得原始请求的近似表示:
- ,它提供原始请求,而不包含查询字符串
,getScheme
,getServerName
,getServerPort
,getContextPath
,getServletPath
和getPathInfo
所有输出都可以按顺序组合以获得原始请求。如果希望URL的片段更少,则可能必须省略后一个调用getQueryString
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是一个代码气味警报。您可以通过使用类似以下形式的
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
。此代码依赖于JSF2.0方法
您还应该注意,在一般情况下,使用这样的URI作为基础并不是引用应用程序中资源的正确方法;例如,ViewHandler
和ExternalContext
应协同使用,以创建资源URL,用于引用应用程序资源以获取资源,或用于调用JSF生命周期的操作URL
不幸的是,我不认为有一种通用的、与容器无关的方法来完成JSF应用程序中可能需要做的所有事情,因此有时您依赖于实现,除了使用其他API之外别无选择。最好的方法是访问ExternalContext RequestHeaderMap属性
ExternalContext ext = FacesContext.getCurrentInstance().getExternalContext();
Map<String,String> requestHeader = ext.getRequestHeaderMap();
urlRefered = requestHeader.get("referer");
ExternalContext ext=FacesContext.getCurrentInstance().getExternalContext();
Map requestHeader=ext.getRequestHeaderMap();
urlRefered=requestHeader.get(“referer”);
您可以在bean中保存urlRefered属性,并在xhtml页面中处理,如下所示:
<h:outputText value="#{notFoundBean.urlRefered}
@BalusC,它工作正常,但在应用程序名称前返回两个斜杠。@BalusC如果这是代码味道,那么更好的方法是什么?我正在尝试做一些类似的事情:@jeff:我指的是在这个特殊的例子中,import javax.servlet.
与HttpServletRequest
一样。你没有。因为我现在在本地主机上,没有办法用一个真正的域名来测试它。你能告诉我哪种方法能给我域名吗?我想检索www.mydomain.com
<error-page>
<error-code>404</error-code>
<location>/xhtml/pg/error/404.xhtml</location>
</error-page>
<h:outputText value="#{requestScope['javax.servlet.forward.request_uri']}" />