更新:现在再次更新。我认为我之前的分析是错误的,因为我现在能够为此创建一个示例。它似乎与复合组件和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。更新方法什么都不做。
我得到的行为如下所述。当我输入无效值时,它将恢复为存储在bean中的值。如果我通过form:workspace组件删除包装,它就像我期望的那样工作 - 该值不会被还原。 JSF错误?
我有一个带有许多输入组件的JSF表单。其中一些附有验证器。例如,一个简单的电子邮件地址是强制性的:
<h:inputText id="email" value="#{profile.user.email}" size="45"
required="true" requiredMessage="Required">
现在,我们已经收到一个要求,即无效的字段应该将提交的值保留在其中,因此用户不会为简单的拼写错误重新键入大量文本。这对我来说似乎很合理,我甚至期望这是验证的默认行为。但它似乎不是 - 价值恢复到以前的状态(当它仍然有效时)。
问题是,我甚至找不到行为应该是什么的参考。我在某处读到它是验证后显示的UIInput的本地值。检查UIInput的代码告诉我,如果验证失败,则故意不设置本地值。但这似乎并不是全部真相,因为所有输入字段都被还原 - 而不仅仅是验证失败的那些字段!所以它看起来更像是再次从模型中获取值。
无论如何,有没有办法绕过这种行为?
我正在使用JSF 2.0.4-b09。我觉得我错过了一些明显的东西。
编辑:我将电子邮件验证器更改为下面发布的正则表达式BalusC,我仍然得到相同的行为。我发布了一张说明问题的图片。图像的上半部分显示了表单的初始状态。然后中间部分显示我更改字段“名字”,“姓氏”和“电子邮件”。单击保存按钮后,底部显示结果。如您所见,电子邮件字段已还原。不仅如此,名字和姓氏字段也被还原。
答案 0 :(得分:4)
有一些混乱。当提交的值为为空时,该值仅恢复为初始值(即,用户删除了初始值或仅输入任何内容)。我不确定必须重新输入整个文本的问题是如何与此相关的,因为实际上没有输入任何内容。
当提交的值为空或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没有这个bug,它在那里工作正常。
答案 1 :(得分:0)
也许你有一些代码可以清除panelGroup
中输入组件的提交值(例如panelGroup
具有特定id
,或者该代码执行更通用的分析查找formGroups里面的表格。)
尝试通过setSubmittedValue
来电的项目源代码进行全文搜索。