JSF2 Viewscope验证问题

时间:2012-12-17 10:59:43

标签: jsf-2

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

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

<?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>

1 个答案:

答案 0 :(得分:4)

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

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

这个鸡蛋问题已经报告为JSF issue 1492并且已针对即将推出的JSF 2.2进行了修复。

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

另见: