Значения UIInput внутри cc: insertChildren не отображаются повторно после ошибки проверки - PullRequest
2 голосов
/ 05 сентября 2011

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

Problem illustrated in three steps.

Ответы [ 2 ]

4 голосов
/ 05 сентября 2011

Происходит путаница.Значение возвращается к исходному значению только тогда, когда отправленное значение равно пусто (т. Е. Пользователь удалил начальное значение или просто ничего не ввел).Я не уверен, как проблема перепечатывания всего текста связана с этим, поскольку фактически ничего не было введено.

Когда переданное значение пусто или null, JSF просто перезапустит значение модели, иначе оно перезапустит переданное значение, точно так, как вы ожидаете.Это указано в спецификации JSF.Чтобы увидеть это сами, добавьте, например,

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

в поле ввода адреса электронной почты.Вы увидите, что любое непустое (!) Переданное значение сохраняется в случае неправильных форматов электронной почты.


Обновление : согласно вашему обновлению выясняется, что ваш вводкомпоненты на самом деле были обработаны <cc:insertChildren>.Такое поведение действительно ошибка в Мохарре.См. выпуск 1991 .Как упомянуто в заявке на проблему, обходной путь - поместить <cc:insertChildren /> в <h:panelGroup> или <ui:fragment>.

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

MyFaces 2.1.1 не имеет этой ошибки, и она работает нормальнотам.

0 голосов
/ 06 сентября 2011

Может быть, у вас есть какой-то код, который очищает отправленные значения входных компонентов внутри этого panelGroup (например, panelGroup имеет специфический id, или этот код выполняет более общий анализ, ища группы внутри групп). 1004 *

Попробуйте выполнить полнотекстовый поиск по исходному коду проекта для setSubmittedValue вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...