【问题标题】:JSF2 Viewscope validation issueJSF2 Viewscope 验证问题
【发布时间】:2012-12-17 10:59:42
【问题描述】:

尝试根据下拉列表值动态显示页面。所有关联的组件都在正确呈现。当我的 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>

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

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

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

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

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

    另见:

    【讨论】:

    • 刚刚从 BalusC 的答案更新到 stackoverflow.com/questions/3342984/… “使用早于 2.1.18 的 Mojarra 版本时,不要将视图范围 bean 的属性绑定到 JSTL 标记属性”,另请参见 java.net/jira/browse/JAVASERVERFACES-1492 底部的评论“balusc 13/Apr/13 .. 自 2.1.18 以来,我无法再在 2.1 上重现此问题。从这个版本开始,taghandlers 开始与视图范围的 bean 一起正常工作。我不确定 2.1.18 究竟是哪个问题也为 2.1 修复了它(请注意,这张票是针对 2.2 的)。”
    猜你喜欢
    • 2014-01-11
    • 2011-07-26
    • 1970-01-01
    • 2013-11-23
    • 2011-05-11
    • 1970-01-01
    • 2011-07-22
    • 2012-07-16
    • 1970-01-01
    相关资源
    最近更新 更多