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
JSF2ViewScope问题_Jsf_Jsf 2 - Fatal编程技术网

JSF2ViewScope问题

JSF2ViewScope问题,jsf,jsf-2,Jsf,Jsf 2,引述此文, 新的视图范围应该解决这个问题 正是这些问题。A@viewscope 比恩会活得和你一样长 将表单提交到同一视图 一次又一次。换句话说,作为 只要操作方法 返回null甚至void,bean 将在下一个请求中出现。 一旦导航到不同的视图, 然后豆子就会被扔掉 我想到了这些问题: 如果我的当前视图是index.xhtml,并且如果我明确指定返回“index”或,基本上返回到相同的视图,bean将再次被重新创建。。为什么? ViewScope bean能否在重定向后存活 如果可以,我如何指

引述此文,

新的视图范围应该解决这个问题 正是这些问题。A@viewscope 比恩会活得和你一样长 将表单提交到同一视图 一次又一次。换句话说,作为 只要操作方法 返回null甚至void,bean 将在下一个请求中出现。 一旦导航到不同的视图, 然后豆子就会被扔掉

我想到了这些问题:

  • 如果我的当前视图是
    index.xhtml
    ,并且如果我明确指定
    返回“index”
    ,基本上返回到相同的视图,bean将再次被重新创建。。为什么?
  • ViewScope bean能否在重定向后存活
  • 如果可以,我如何指定它?我无法想象做类似于
    return”?faces redirect=true“
    ,是的,我想跳过使用
    faces config.xml
    中定义导航
  • 如果我的当前视图是index.xhtml,并且如果我显式指定返回“index”;或者,基本上返回到相同的视图,bean将再次被重新创建。。为什么?

    如果显式指定结果(读取:视图),则将创建一个新视图。您必须从action方法返回null或void(或者只保留command组件的
    action
    属性)

    我必须承认,我理解你的困惑,“观点”一词可以根据上下文进行不同的解释。我想我迟早会修改链接文章中的措辞

    ViewScope bean能否在重定向后存活


    不可以。只有会话范围的bean可以在中保存和对象(重定向完成后立即结束,这可能是您在问这个问题时考虑到的功能需求所需要的)。

    如果提供了javax.faces.ViewState,视图状态可以在重定向后继续存在。目前我发现的最简单的解决方案是实现一个导航处理程序

    在faces-config.xml中:

    <faces-config>
        <application>
            ...
            <navigation-handler>com.intersult.jsf.util.RedirectNavigationHandler</navigation-handler>
        </application>
        ...
    </faces-config>
    
    这会产生一些影响:每个重定向不再是一个独立的请求。它取决于视图状态,视图状态不一定要恢复。因此,如果一个视图范围bean已过期,就要有一个回退策略,例如在视图过期异常时重定向。

    对于“JSF中如何以及何时销毁视图范围bean”的问题可能是相关的。
    public class RedirectNavigationHandler extends ConfigurableNavigationHandler {
        private NavigationHandler parent;
    
        public RedirectNavigationHandler(NavigationHandler parent) {
            this.parent = parent;
        }
    
        @Override
        public void handleNavigation(FacesContext context, String from, String outcome) {
            if (!context.getPartialViewContext().isPartialRequest()) {
                if (outcome == null)
                    outcome = context.getViewRoot().getViewId();
                if (!outcome.endsWith("?faces-redirect=true"))
                    outcome += "?faces-redirect=true";
                String viewState =
                    context.getExternalContext().getRequestParameterMap().get(ResponseStateManager.VIEW_STATE_PARAM);
                outcome += "&javax.faces.ViewState=" + viewState;
            }
            parent.handleNavigation(context, from, outcome);
        }
    }