以编程方式获取当前页面

64
在JSF的后端Bean(Managed Bean,Weld Bean都可以)中,我可以通过调用以下方法来获取客户端所在上下文路径:
FacesContext ctx = FacesContext.getCurrentInstance();
String path = ctx.getExternalContext().getRequestContextPath();

这个代码给出了客户端目前正在访问的路径,例如/myapplication。 是否也可以获取当前的页面,比如 /home.faces,该怎么做?

4个回答

122

通常情况下,您需要使用UIViewRoot#getViewId()来实现这一功能。

String viewId = facesContext.getViewRoot().getViewId();

这也可以在EL中按以下方式使用:
#{view.viewId}

这个值可以在导航方案的结果中重复使用,例如 <h:link outcome><h:button outcome>


或者,您也可以使用 HttpServletRequest#getRequestURI() 获取浏览器地址栏中实际显示的内容。

String uri = ((HttpServletRequest) externalContext.getRequest()).getRequestURI();

在EL中也可以按照以下方式使用:

#{request.requestURI}

这个值可以在<h:outputLink value>或普通的<a href>中重复使用。请注意,您不能将其用作导航案例结果。


1
这种方法无法可靠地工作。例如,使用PrettyFaces时,它无法提供用于创建当前页面的调用URL。 - DoubleMalt
1
@DoubleMalt:OP没有表明他正在使用PrettyFaces。 - BalusC
5
确实,他也没有明确表示他没有那样做。我的意思只是扩展JSF的库可能会破坏你的解决方案(而PrettyFaces作为标准实现导航处理相当笨拙的常见增强)。我只是想给那些发现你的简洁解决方案对他们不起作用的人一个线索为什么会这样。 - DoubleMalt
1
@DoubleMalt,Prettyfaces只是一个URL美化器。你说“标准实现处理导航的方式相当笨拙”...嗯,Prettyfaces在导航方面并没有JSF所没有的功能。它只是将其URL映射到更漂亮的URL上。它还具有与参数相关的功能,但我不认为它们是导航特定的。 - Aritz
1
@Gaara:显然你正在开发一个Portlet应用程序,而不是Servlet应用程序。抱歉,我对Portlets不熟悉。只需搜索如何从“PortletRequest”实例中获取请求URI即可。 - BalusC
显示剩余2条评论

14

好的,我知道了,它是

FacesContext ctx = FacesContext.getCurrentInstance();
HttpServletRequest servletRequest = (HttpServletRequest) ctx.getExternalContext().getRequest();
// returns something like "/myapplication/home.faces"
String fullURI = servletRequest.getRequestURI();

3
String uri = ((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRequestURI();

-2
 String str = ((HttpServletRequest) FacesContext.getCurrentInstance() 
 .getExternalContext().getRequest()).getRequestURI(); 
 System.out.println(str);

3
请将英语翻译成中文。仅返回翻译后的文本:请用语言解释您的答案。 - Olle Sjögren
3
这并未对之前的回答增添任何内容。 - Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接