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 FaceletContext为空_Jsf_Jsf 2_Facelets - Fatal编程技术网

Jsf FaceletContext为空

Jsf FaceletContext为空,jsf,jsf-2,facelets,Jsf,Jsf 2,Facelets,我有一个JSF2.0项目,无法从中获取FaceletContext 以下是my web.xml中的设置: <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-st

我有一个JSF2.0项目,无法从中获取FaceletContext

以下是my web.xml中的设置:

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

<context-param>
    <param-name>facelets.DEVELOPMENT</param-name>
    <param-value>true</param-value>
</context-param>

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
</context-param>

<context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
</context-param>

<context-param>
    <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
    <param-value>/index.xhtml</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
</context-param>

<context-param>
    <param-name>javax.faces.application.CONFIG_FILES</param-name>
    <param-value>/WEB-INF/faces-config.xml</param-value>
</context-param>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
有人能帮忙吗

更新:

上面是我总体目标的一个片段:加载一个包含按需对话框的facelet文件,然后将其添加到父级以显示。下面的代码不完整,但应该解释我的意思。请注意,应用程序使用Primefaces库,因此使用RequestContext对象

public void launch() {

    form.getChildren().clear();

    FacesContext fctx = FacesContext.getCurrentInstance();
    for (Object o: fctx.getAttributes().keySet()) {
        System.out.println(o.toString());
    }

    FaceletContext f2ctx = (FaceletContext) fctx.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
    //FaceletContext f2ctx = (FaceletContext) fctx.getELContext().getContext(FaceletContext.class);
    dialog = new Dialog();

    try {
        f2ctx.includeFacelet(dialog, "/WEB-INF/facelets/dialog/manager.xhtml");
        form.getChildren().add(dialog);
    } catch (IOException ex) {
        log.debug(ex.toString());
    }

    RequestContext.getCurrentInstance().update("mainPageCenterForm");
}

当您试图在构建视图之前访问它时,它将为
null
。例如,在
RESTORE\u VIEW
阶段的
before阶段期间。重新安排代码逻辑。目前还不清楚功能需求是什么,以及您试图访问它的确切位置,因此我无法给出更合适的答案



与具体问题无关当禁用部分状态保存时,
javax.faces.FULL_STATE_SAVING_VIEW_id
上下文参数被忽略。也许那不是你的意图?另请参见此相关答案

感谢您指出这个问题,它是一些实验的遗留问题。我添加了完整的方法和我试图做的解释。不幸的是,我不能使用动态ui:include来完成我需要的任务。什么时候调用
launch()
?调试/打印
FacesContext#getViewRoot()
FacesContext#getCurrentPhaseId()
时会得到什么?我明白你的观点,为什么它是空的。launch方法在Primefaces菜单项中作为操作调用,但在另一个页面(index.xhtml)上定义。但是,该应用程序的对话量很大(客户要求),因此我正试图找出如何按需加载相关的Facelet。请直接在视图中尝试
。在Myfaces中,我们做了一些很好的破解来解决ui:include/c:if上的问题。最好让facelets构建组件树,因此如果可以,最好使用模板标记或复合组件。尝试在facelets外部(在托管bean上)更改组件树也可以,但这会在以后刷新视图时导致问题,并且无需增加状态大小。
public void launch() {

    form.getChildren().clear();

    FacesContext fctx = FacesContext.getCurrentInstance();
    for (Object o: fctx.getAttributes().keySet()) {
        System.out.println(o.toString());
    }

    FaceletContext f2ctx = (FaceletContext) fctx.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
    //FaceletContext f2ctx = (FaceletContext) fctx.getELContext().getContext(FaceletContext.class);
    dialog = new Dialog();

    try {
        f2ctx.includeFacelet(dialog, "/WEB-INF/facelets/dialog/manager.xhtml");
        form.getChildren().add(dialog);
    } catch (IOException ex) {
        log.debug(ex.toString());
    }

    RequestContext.getCurrentInstance().update("mainPageCenterForm");
}