Может быть трудно рассматривать страницу, отображаемую в JSF, как большой шар HTML и JavaScript (что, я думаю, лежит в основе вопроса). Вы не можете добавить произвольные элементы управления формой в приложение на клиенте и ожидать, что среда JSF будет их интерпретировать. JSF использует предопределенные компоненты, поэтому компонент должен знать, как интерпретировать дополнительные данные, поступающие из запроса. Поскольку все это заканчивается как HTML-форма, интерпретируемая сервлетом, данные, отправленные клиентом, все равно окажутся в карте параметров - но эти значения не будут проходить через жизненный цикл JSF, поэтому не получат пользу от проверки / привязка данных / и т. д.
Дерево управления JSF очень похоже на любое другое дерево виджетов (например, Swing или SWT):
UIViewRoot
|_HtmlForm
|_HtmlInputText
|_HtmlCommandButton
Элемент управления JSF в основном работает следующим образом:
- a UIComponent экземпляр инкапсулирует значения (первоначально заполняемые из JSP / Facelet); пример: HtmlInputTextarea
- Когда страница отображается, жизненный цикл ищет реализацию компонента Renderer для компонента;
Renderer
записывает разметку на выход
- Когда форма публикуется, тот же визуализатор просматривает карту входящих параметров на предмет значений, которые он распознает, и в конечном итоге (после преобразования и проверки) помещает новое значение в
UIComponent
(что, в свою очередь, может подтолкнуть его к значение привязки для модели)
Взять ваш конкретный пример со списком - это хитрый пример. JSF предоставляет HtmlSelectManyListbox , который заканчивается как элемент SELECT
в HTML. Можно добавить OPTION
потомков в DOM, используя JavaScript на клиенте, но это не приносит пользы, когда дело доходит до отправки формы. Если вы читаете HTML спецификацию , там написано:
Только выбранные параметры будут успешными. Если ни один из параметров не выбран, элемент управления не будет успешным, и ни имя, ни любые значения не будут отправлены на сервер при отправке формы.
Таким образом, при отправке формы на сервер передаются только элементы списка, выбранные пользователем. Вам понадобятся некоторые скрытые поля, чтобы получить все новые данные на сервер. В базовом наборе нет элемента управления, который бы помог вам в этом.
У вас есть несколько вариантов:
- Найдите существующий элемент управления из сторонней библиотеки , которая делает это. Если вы не можете его найти, рассмотрите возможность использования обновлений AJAX - посмотрите на RichFaces select control для вдохновения.
- Напишите свой собственный элемент управления (предупреждение: прочитайте спецификацию и помните о множестве ручных шагов )
- мириться с необходимостью выполнять операцию POST каждый раз, когда вы хотите добавить элемент в список