Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF中的浏览器刷新处理_Jsf_Jsf 2 - Fatal编程技术网

JSF中的浏览器刷新处理

JSF中的浏览器刷新处理,jsf,jsf-2,Jsf,Jsf 2,是否有一种方法可以在JSF 2.0应用程序中处理浏览器刷新事件,以便在浏览器刷新页面时将用户导航到欢迎页面? 这就引出了另一个问题:如何在托管bean中进行页面导航 干杯,不太好 在http协议或jsf中没有这方面的内容 你可以找到一些“黑客”(为你的请求编号),但我认为最多也会很复杂 如果一个客户问我类似的问题,我会让它为这个功能付出很多,而不需要太多的保证。对我来说,这似乎是一个不切实际的要求;-) 使用单个视图,其中有条件地渲染包含 <h:panelGroup id="body"&g

是否有一种方法可以在JSF 2.0应用程序中处理浏览器刷新事件,以便在浏览器刷新页面时将用户导航到欢迎页面? 这就引出了另一个问题:如何在托管bean中进行页面导航

干杯,

不太好

在http协议或jsf中没有这方面的内容

你可以找到一些“黑客”(为你的请求编号),但我认为最多也会很复杂


如果一个客户问我类似的问题,我会让它为这个功能付出很多,而不需要太多的保证。对我来说,这似乎是一个不切实际的要求;-)

使用单个视图,其中有条件地渲染包含

<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;
    }

}