0

尝试根据下拉列表值动态显示页面。所有关联的组件都在正确呈现。当我的 bean 在视图范围内时,验证不会触发,而会话范围内同样可以正常工作。任何人都可以帮我解决问题?

下面是我的 Main.xhtml 代码。此页面包含下拉列表。基于下拉值动态包括页面。

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<ui:composition template="#{templates.standard}">
<ui:define name="contentArea">
<c:choose>
<c:when test="#{testBean.value == '1'}">
<h:panelGroup>
<ui:include src="Page1.xhtml" />
</h:panelGroup>
</c:when>
<c:when test="#{testBean.value == '2'}">
<h:panelGroup>
<ui:include src="Page2.xhtml" />
</h:panelGroup>
</c:when>
</c:choose>
</ui:define>
</ui:composition>
</html>

The below Page1.xhtml will be included dynamically in Main.xhtml 

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:panelGroup>
<h:inputText value="#{testBean1.date}"
id="date" 
required="true" requiredMessage="Enter Valid date">
<f:validator validatorId="test.TestDateValidator" />        
</h:inputText>  
</h:panelGroup>
<h:panelGroup>
<h:message for="date"/>
</h:panelGroup>
4

1 回答 1

4

视图范围的 bean 存储在 JSF 视图中。JSF 视图仅在构建后可用。像 JSTL 这样的标记处理程序<c:xxx>在视图构建期间运行。因此,它们在 JSF 视图可用之前运行。因此,当您将视图范围 bean 的属性绑定到 JSTL 标记属性时,它不会引用 JSF 视图中的视图范围 bean 实例,而是引用一个新创建的实例,所有属性都设置为默认值。

因此,基本上,您最终会在每个请求的基础上得到两个不同的视图范围 bean 实例。一种在恢复视图期间使用(在每次提交表单时重新创建的一种),另一种在处理表单提交期间使用(实际存储在视图范围中的一种)。

这个鸡蛋问题已被报告为JSF 问题 1492,并已在即将到来的 JSF 2.2 中修复。

在那之前,最好的办法是创建一个单独的请求范围 bean,并让包含条件依赖于由 注入的请求参数@ManagedProperty,或者关闭部分状态保存(但这可能会影响内存/性能)。请注意,它<ui:include>也在视图构建期间运行,因此将其包装在具有该rendered属性的 JSF 组件中不会有任何帮助,因为它是在视图渲染期间进行评估的。

也可以看看:

于 2012-12-17T11:58:15.150 回答