JSF中的浏览器刷新处理
是否有一种方法可以在JSF 2.0应用程序中处理浏览器刷新事件,以便在浏览器刷新页面时将用户导航到欢迎页面? 这就引出了另一个问题:如何在托管bean中进行页面导航 干杯,不太好 在http协议或jsf中没有这方面的内容 你可以找到一些“黑客”(为你的请求编号),但我认为最多也会很复杂JSF中的浏览器刷新处理,jsf,jsf-2,Jsf,Jsf 2,是否有一种方法可以在JSF 2.0应用程序中处理浏览器刷新事件,以便在浏览器刷新页面时将用户导航到欢迎页面? 这就引出了另一个问题:如何在托管bean中进行页面导航 干杯,不太好 在http协议或jsf中没有这方面的内容 你可以找到一些“黑客”(为你的请求编号),但我认为最多也会很复杂 如果一个客户问我类似的问题,我会让它为这个功能付出很多,而不需要太多的保证。对我来说,这似乎是一个不切实际的要求;-) 使用单个视图,其中有条件地渲染包含 <h:panelGroup id="body"&g
如果一个客户问我类似的问题,我会让它为这个功能付出很多,而不需要太多的保证。对我来说,这似乎是一个不切实际的要求;-) 使用单个视图,其中有条件地渲染包含
<h:panelGroup id="body">
<ui:include src="#{bean.page}.xhtml" />
</h:panelGroup>
将bean视图设置为作用域,并使用commandlinks和
更改包含的页面
<h:form>
<h:commandLink value="Page 1" action="#{bean.setPage('page1')}">
<f:ajax execute="@this" render=":body" />
</h:commandLink>
<h:commandLink value="Page 2" action="#{bean.setPage('page2')}">
<f:ajax execute="@this" render=":body" />
</h:commandLink>
</h:form>
如果在bean(post)构造期间将欢迎页面设置为默认包含页面,那么新的GET请求将始终显示欢迎页面。唯一的缺点是,这些页面不再可以添加书签,但考虑到这个特殊的功能需求,这似乎不是一个主要问题。我使用下一种方法解决了重新加载页面的问题 已创建阶段
的阶段侦听器
渲染响应
的导航主页
。
在每个需要重新加载浏览器的页面上,应使用type=“my.NavigateHomePage”
导航到添加了f:phaseListener
的“主页”
方法afterPhase
中的NavigateHomePage
定义当前页面名称(来自request
path)并将其存储在会话中
beforePhase
方法中的NavigateHomePage
定义当前页面名称(从请求
路径),从会话
获取上一个页面名称,并获取请求方法
。如果当前页面名称等于上一个页面名称,并且request method
为GET
且当前页面不是“主页”,则重定向到“主页”完成
该限制是,对于此类页面(浏览器重新加载导航到“主页”),不应该有指向自身的链接(通过GET
)
要将阶段侦听器包含到页面外接程序页面,请执行以下操作:
<f:phaseListener type="my.NavigateHomePage"/>
public class NavigateHomePage implements PhaseListener {
private static final String CURR_PAGE = "currPage";
private static final String HOME_PAGE = "home";
private static final String HOME_PATH = "/my/faces/home.xhtml";
@Override
public void afterPhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
String currPage = getPageName(facesContext);
facesContext.getExternalContext().getSessionMap().put(CURR_PAGE, currPage);
}
@Override
public void beforePhase(PhaseEvent event) {
//check browser reload and redirect to Main page
FacesContext facesContext = event.getFacesContext();
String requestMethod = ((HttpServletRequest)facesContext.getExternalContext().getRequest()).getMethod();
String currPage = (String) facesContext.getExternalContext().getSessionMap().get(CURR_PAGE);
String newPage = getPageName(facesContext);
if ("GET".equals(requestMethod) && newPage.equals(currPage) && !HOME_PAGE.equals(newPage)) {
try {
facesContext.getExternalContext().redirect(HOME_PATH);
} catch (IOException ex) {
Logger.getLogger(this.getClass()).warn("Can't redirect to Home page", ex);
}
}
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
private String getPageName(FacesContext facesContext) {
String pagePath = facesContext.getExternalContext().getRequestServletPath();
String pageName = pagePath.substring(pagePath.lastIndexOf("/") + 1, pagePath.lastIndexOf(".xhtml"));
return pageName;
}
}