gpt4 book ai didi

java - cc :insertChildren are not redisplayed after validation failure 内的 UIInput 值

转载 作者:行者123 更新时间:2023-11-30 07:31:31 44 4
gpt4 key购买 nike

更新:现在再次更新。我认为我之前的分析是错误的,因为我现在已经能够为此创建一个示例。它似乎与复合组件和 insertChildren 标签有关。

这是我的小脸:

<?xml version='1.0' encoding='UTF-8' ?>
<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:form="http://java.sun.com/jsf/composite/composite/form"
xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head></h:head>

<h:body>
<h:form>
<form:workspace>

<h:inputText id="email" value="#{user.email}" size="45"
required="true" requiredMessage="Required">
<f:validateRegex pattern="([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)" />
</h:inputText>
<h:message for="email" />
<br />
<h:commandButton action="#{user.update}" value="Update"/>

</form:workspace>
</h:form>
</h:body>
</html>

form:workspace复合组件定义如下:

<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:cc="http://java.sun.com/jsf/composite">

<cc:interface>
</cc:interface>

<cc:implementation>
<cc:insertChildren/>
</cc:implementation>
</html>

#{user} 变量引用一个简单的 bean,它只有一个名为 email 的字段以及一个 getter 和一个 setter。 update 方法什么都不做。

我得到的行为如下所述。当我输入无效值时,它会恢复为存储在 bean 中的值。如果我删除 form:workspace 组件的包装,它会像我预期的那样工作——该值不会被还原。 JSF 错误?


我有一个包含多个输入组件的 JSF 表单。其中一些附有 validator 。例如,一个简单的是电子邮件地址,这是强制性的:

<h:inputText id="email" value="#{profile.user.email}" size="45"
required="true" requiredMessage="Required">

现在,我们收到了一项要求,即无效字段应在其中保留提交的值,这样用户就不会因为简单的拼写错误而重新输入大量文本。这对我来说似乎很合理,我什至希望这是验证的默认行为。但它似乎不是 - 该值恢复到之前的状态(当它仍然有效时)。

问题是,我什至找不到行为应该是什么的引用。我在某处读到它是验证后显示的 UIInput 的本地值。检查 UIInput 的代码告诉我,如果验证失败,则有意不设置本地值。但这似乎不是全部事实,因为所有输入字段都已还原 - 不仅仅是验证失败的字段!所以它看起来更像是再次从模型中获取值。

无论如何,我有办法避免这种行为吗?

我正在使用 JSF 2.0.4-b09。我觉得我错过了一些明显的东西。

编辑:我将电子邮件验证程序更改为下面发布的 BalusC 正则表达式,我仍然得到相同的行为。我张贴了一张说明问题的图片。图像的上半部分显示了表单的初始状态。然后中间部分显示我更改了字段“First name”、“Last name”和“Email”。底部显示了我单击保存按钮后的结果。如您所见,电子邮件字段已还原。不仅如此,名字和姓氏字段也被还原。

Problem illustrated in three steps.

最佳答案

有些困惑正在发生。只有当提交的值为(即用户删除了初始值或什么都不输入)时,该值才会恢复为初始值。我不确定必须重新输入整个文本的问题与此有何关系,因为实际上没有输入任何内容。

当提交的值为空或null时, JSF 将只重新显示模型值,否则它将重新显示提交的值,正如您所期望的那样。这是在 JSF 规范中指定的。自己看吧,加个例子

<f:validateRegex pattern="([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)" />

到电子邮件输入字段。如果电子邮件格式无效,您会看到任何非空 (!) 提交的值都会保留。


更新:根据您的更新,事实证明您的输入组件实际上是由 <cc:insertChildren> 呈现的.这种行为确实是 Mojarra 中的一个错误。参见 issue 1991 .如问题单中所述,解决方法是将 <cc:insertChildren /><h:panelGroup> 里面或 <ui:fragment> .

<cc:implementation>
<ui:fragment>
<cc:insertChildren/>
</ui:fragment>
</cc:implementation>

MyFaces 2.1.1 没有这个错误,在那里工作正常。

关于java - cc :insertChildren are not redisplayed after validation failure 内的 UIInput 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7310286/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com