JSF2.1中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是否为特定的渲染部分重新创建组件树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标记处理程序来处理动态页面。下面的东西很好用。但我无法理解
注意:当我选择模式为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;
}
}