Обновление: Обновлен еще раз сейчас.Я думаю, что мой предыдущий анализ был неверным, потому что теперь я смог создать пример для этого.Похоже, он связан с составными компонентами и тегом 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>
Форма: составной компонент рабочей области определен следующим образом:
<?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}
относится к тривиальному компоненту, содержащему только поле с именем email, а также метод получения и установки.Метод обновления ничего не делает.
Я получаю такое же поведение, как описано ниже.Когда я ввожу недопустимое значение, оно возвращается к тому, что хранится в компоненте.Если я удаляю обтекание компонентом 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, опубликованное ниже, и у меня все еще такое же поведение.Я разместил изображение, иллюстрирующее проблему.Верхняя часть изображения показывает начальное состояние формы.Затем средняя часть показывает, что я меняю поля «Имя», «Фамилия» и «Электронная почта».В нижней части отображается результат после нажатия кнопки «Сохранить».Как видите, поле электронной почты перевернуто.Кроме того, поля имени и фамилии также возвращаются.