Использование commandButton или commandLink для обратной передачи и управление значениями элемента управления HTML - PullRequest
0 голосов
/ 07 октября 2009

Во многих случаях вы хотите добавить HTML-элементы управления или Facelets на свой веб-сайт, но насколько просто получить к ним доступ, когда вы вызываете действие?

У меня есть следующая команда Link для выполнения действия

<h:commandLink action="#{MyBean.save}" value="">
    <f:verbatim><input type="button" value="Save"/></f:verbatim>
    <f:param name="id" value="#{MyBean.id}"/>
</h:commandLink>

Параметр предназначен для сохранения состояния QueryString, чтобы мое приложение не падало.

Теперь представьте, что у вас есть <input type="text" /> или <h:inputText value="hello" />, теперь эти компоненты являются фундаментальными для запуска вашего сайта, особенно если вы создаете некоторую динамику.

Однако, если элементы управления не привязаны ни к чему, или если у вас есть список, в который вы можете добавлять элементы с помощью JavaScript, как вы получите к ним доступ при выполнении commandLink или commandButton? Нужно ли вам привязывать элементы управления к вашему Бину или можно получить доступ к этому FaceContext другим способом, чтобы получить значения из списка, входного текста или чего-либо еще, что вы хотели бы иметь?

Ответы [ 2 ]

2 голосов
/ 08 октября 2009

Может быть трудно рассматривать страницу, отображаемую в 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 каждый раз, когда вы хотите добавить элемент в список
1 голос
/ 07 октября 2009

Вы можете получить значения из элементов управления "не-JSF" на своей странице, используя стандартную карту параметров запроса, доступ к которой можно получить с помощью

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()

в любом действии, которое вы называете, например. MyBean.save()

...