2

更新:现在再次更新。我认为我之前的分析是错误的,因为我现在已经能够为此创建一个示例。它似乎与复合组件和 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 表单。其中一些附加了验证器。例如,一个简单的电子邮件地址是强制性的:

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

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

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

无论如何,有没有办法绕过这种行为?

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

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

问题分三步说明。

4

2 回答 2

4

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

当提交的值为空或null时,JSF 只会重新显示模型值,否则它将重新显示提交的值,完全符合您的预期。这是在 JSF 规范中指定的。要自己查看,请添加例如

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

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


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

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

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

于 2011-09-05T16:33:03.247 回答
0

也许您有一些代码可以清除其中输入组件的提交值panelGroup(例如panelGrouphas specific id,或者该代码执行更通用的分析以查找表单内的 panelGroups )。

setSubmittedValue尝试通过您的项目源代码对调用进行全文搜索。

于 2011-09-06T11:37:59.330 回答