Вы можете безопасно использовать несколько форм на странице JSF.Это не отличается от использования простого HTML.
Вложение <form>
элементов недопустимо в HTML .Поскольку JSF просто генерирует кучу HTML, в JSF он не отличается.Вложенность <h:form>
поэтому также недопустима в JSF.
<h:form>
...
<h:form> <!-- This is INVALID! -->
...
</h:form>
...
</h:form>
Поведение браузера при отправке вложенной формы не определено.Это может или не может работать так, как вы ожидаете.Например, он может просто обновить страницу, не вызывая метод действия компонента.Даже если вы переместите вложенную форму (или компонент, который ее содержит) за пределы родительской формы с помощью dom-манипуляции (или, например, с помощью PrimeFaces appendTo="@(body)"
), она все равно не будет работать и должно быть no вложенные формы во время загрузки страницы.
Относительно того, какие формы вам нужно сохранить, наличие единственного «бога» <h:form>
на самом деле плохая практика.Итак, вам лучше удалить внешний <h:form>
из основного шаблона и позволить каждому из разделов header
, sidebar
, content
и т. Д. Определять свои собственные <h:form>
.Несколько параллельных форм действительны.
<h:form>
...
</h:form>
<h:form> <!-- This is valid. -->
...
</h:form>
Каждая форма должна иметь одну четкую ответственность.Например, форма входа в систему, форма поиска, основная форма, диалоговая форма и т. Д. Вы не хотите без необходимости обрабатывать все другие формы / входные данные при отправке определенной формы.
Обратите внимание, что при отправке определенной формы другие формы НЕ обрабатываются.Итак, если вы все равно собираетесь обрабатывать ввод другой формы, значит, у вас проблема с дизайном.Либо поместите его в ту же форму, либо добавьте несколько уродливых хаков JavaScript, чтобы скопировать необходимую информацию в скрытое поле формы, содержащее кнопку отправки.
Внутри определенной формы вы можете, однако, использовать ajax для ограниченияобработка входов в меньшее подмножество.Например, <f:ajax execute="@this">
будет обрабатывать (отправлять / преобразовывать / проверять / вызывать) только текущий компонент, а не другие в той же форме.Это обычно используется в случаях использования, когда другие входы в той же форме должны быть динамически заполнены / обработаны / переключены, например, зависимые выпадающие меню, списки автозаполнения, таблицы выбора и т. Д.
См. Также: