如何在没有请求的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 -
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托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作为基础不是在一般情况下引用应用程序中的资源的正确方法; 例如, ViewHandler
和ExternalContext
应协同使用来创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']}" />
- Java序列化:readObject()与readResolve()
- 如何编译一个编码为“UTF-8”的java源文件?
- 如何强制一个方法在java中重写?
- 你在Java中使用什么包命名规则来进行个人/业余爱好项目?
- com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败
- “设置”一个特定的枚举types,但generics
- 更新包含在JLabel中的图像 – 问题
- 如何在java文件path中转义反斜杠和自动生成的转义字符
- 是否有可能在我的applicationContext中有多个PropertyPlaceHolderConfigurer?