Ответ 1
Вы можете безопасно использовать несколько форм на странице 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)"
), это все равно не будет работать, и должно быть без вложенных форм при загрузке страницы.
Что касается форм, которые вам нужно сохранить, наличие единственного "бога" <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">
будет обрабатывать (отправлять/конвертировать/проверять/вызывать) только текущий компонент, а не другие в той же форме. Обычно это используется в случаях, когда другие входы в одной и той же форме должны быть динамически заполнены/отображены/переключены, например, зависимые выпадающие меню, списки автозаполнения, таблицы выбора и т.д.
Смотрите также:
- commandButton/commandLink/ajax действие/метод прослушивания не вызывается или входное значение не установлено/обновлено - точка 2
- Что действительно нужно делать <f: ajax execute = "@all">? Это ОТПРАВЛЯЕТ только прилагаемую форму
- Понимание процесса/обновления PrimeFaces и JSF f: атрибуты ajax execute/render
- <p: commandbutton> действие не работает внутри <p: dialog>