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
JSF2.1中JSTL标记在以下方面的评估方法_Jsf_Jsf 2 - Fatal编程技术网

JSF2.1中JSTL标记在以下方面的评估方法

JSF2.1中JSTL标记在以下方面的评估方法,jsf,jsf-2,Jsf,Jsf 2,我有下面的Test.xhtml,在这里我可以选择Sea/Air模式。我不想将所有4个pagesPage1.xhtml、Page2.xhtml、Page3.xhtml、Page4.xhtml加载到jsf视图树中。在我的场景中,模式一旦选择并保存,就不能更改为其他模式。保存的模式将显示为查看模式。因为在任何时候我只需要2个文件Page1.xhtml,Page2.xhtml或Page3.xhtml,Page4.xhtml。。。我正在使用JSTL标记处理程序来处理动态页面。下面的东西很好用。但我无法理解

我有下面的Test.xhtml,在这里我可以选择Sea/Air模式。我不想将所有4个pagesPage1.xhtml、Page2.xhtml、Page3.xhtml、Page4.xhtml加载到jsf视图树中。在我的场景中,模式一旦选择并保存,就不能更改为其他模式。保存的模式将显示为查看模式。因为在任何时候我只需要2个文件Page1.xhtml,Page2.xhtml或Page3.xhtml,Page4.xhtml。。。我正在使用JSTL标记处理程序来处理动态页面。下面的东西很好用。但我无法理解渲染是如何工作的

Test.xhtml

再次更新

请帮助澄清以下内容

当我第一次发送访问Test.xhtml的请求时,就会创建jsf视图UIViewRoot。因为testBean.selectedMode默认为空。。此创建的视图不包含和的任何组件详细信息

之后,当我通过选择sea模式发送第二个requestajax回发时,将在恢复视图阶段再次为请求创建UIViewRoot。在还原视图阶段为该请求创建UIViewRoot时,将执行标记处理程序。 由于所选值“sea”将仅在更新模型值阶段更新为modelTestBean.java,因此在还原视图阶段,EL{testBean.selectedMode}将被计算为null。 因此,在我的示例Test.xhtml页面中,标记处理程序和将被计算为false。因此UIViewRoot不包含任何与内部组件相关的信息

即使UIViewRoot中不包含组件信息,JSF如何能够成功呈现包含的页面

我不确定JSF渲染是如何在这里发生的。渲染时,JSF是否为特定的渲染部分重新创建组件树


注意:当我选择模式为sea/air时,该示例工作正常。相应的部分渲染正确。

您的问题很难理解。你基本上说代码没有问题?你不清楚这是如何失败的和/或你到底不明白什么。taghandlers不仅是JSTL,而且是如何工作的,已经在@BalusC中给出了答案,谢谢你的回答。更新了问题。感谢您的帮助。我已经被第一个短语挡住了。JSF根本不在会话中存储UIViewRoot。它基本上是请求范围,并在每个请求上重新创建。只有UI组件状态存储在视图范围中,而视图范围反过来存储在会话中,以防服务器端状态保存,并在每次回发时恢复到新创建的UIViewRoot中。我没有阅读其余部分,因为这可能是基于第一个错误的假设。@BalusC,很抱歉反应太晚。忙于紧急任务。感谢您的回复,纠正了我对UIViewRoot的误解。再次更新问题。请。帮助理解。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

<h:head><title>JSF And JSTL</title>
<link href="../css/styles.css" 
      rel="stylesheet" type="text/css"/> 
</h:head>
<h:body>
<div align="center">
<h:form id="form1">

<h:panelGrid  columns="2">
<h:outputLabel value="Select Mode"/>

    <h:selectOneMenu id="selectPageId" value="#{testBean.selectedMode}">
        <f:selectItem itemLabel="Select" />
        <f:selectItem itemLabel="Sea" itemValue="sea" />
        <f:selectItem itemLabel="Air" itemValue="air" />

    <f:ajax execute="@this" render="pageGroup"/>    

    </h:selectOneMenu>


</h:panelGrid>

   <h:panelGroup id="pageGroup">

    <c:if test="#{'sea' eq testBean.selectedMode}">
        <ui:include src="Page1.xhtml" />
        <ui:include src="Page2.xhtml" />
    </c:if>

    <c:if test="#{'air' eq testBean.selectedMode}">
        <ui:include src="Page3.xhtml" />
        <ui:include src="Page4.xhtml" />
    </c:if>
 </h:panelGroup>


</h:form>
</div>
</h:body>
</html>
package com.test;


@ManagedBean(name = "testBean")
@ViewScoped 
public class TestBean {

    private String selectedMode;

    public String getSelectedMode() {
        return selectedMode;
    }

    public void setSelectedMode(String selectedMode) {
        this.selectedMode = selectedMode;
    }

}