Как пользоватьсяна странице JSF?Одиночная форма?Несколько форм?Вложенные формы? - PullRequest
41 голосов
/ 10 сентября 2011

Я использую технологию шаблонов Facelet для размещения моей страницы в приложении JSF 2, над которым я работаю.

В моем header.xhtml Primefaces требует, чтобы строка меню была заключена в h: form.

<h:form>
    <p:menubar autoSubmenuDisplay="true">
        Menu Items here!
    </p:menubar>
</h:form>

Итак, на моих страницах содержания у меня будет другая форма h: или больше.

Будет ли это работать, если я просто добавлю форму h: в свой файл template.xhtml?

<h:body>
    <h:form>
        <div id="top">
            <ui:insert name="header"><ui:include src="sections/header.xhtml"/></ui:insert>
        </div>
        <div>
            <div id="left">
                <ui:insert name="sidebar"><ui:include src="sections/sidebar.xhtml"/></ui:insert>
            </div>
            <div id="content" class="left_content">
                <ui:insert name="content">Content</ui:insert>
            </div>
        </div>
        <div id="bottom">
            <ui:insert name="footer"><ui:include src="sections/footer.xhtml"/></ui:insert>
        </div>
    <h:form>
</h:body>

Я на самом деле думаю о случае использования, когда мне нужно несколько h: form на странице.

Спасибо

Ответы [ 2 ]

84 голосов
/ 10 сентября 2011

Вы можете безопасно использовать несколько форм на странице 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"> будет обрабатывать (отправлять / преобразовывать / проверять / вызывать) только текущий компонент, а не другие в той же форме.Это обычно используется в случаях использования, когда другие входы в той же форме должны быть динамически заполнены / обработаны / переключены, например, зависимые выпадающие меню, списки автозаполнения, таблицы выбора и т. Д.

См. Также:

0 голосов
/ 18 ноября 2016

Я какое-то время был озадачен этой проблемой. Вместо ряда независимых форм я преобразовал в шаблон, то есть вместо вызова xhtml с перечисленными формами, обычно с помощью ui: include, я выполняю вызов тех ранее созданных ui: включенных xhtml страниц, которые ui: содержимое, захваченное в родительском шаблоне.

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