JSF 2.0 AJAX: вызов метода bean из javascript с помощью jsf.ajax.request (или другим способом) - PullRequest
13 голосов
/ 14 сентября 2010

Немного предыстории: я создаю пользовательский компонент JSF. Компонент в основном представляет собой текстовый редактор и должен иметь кнопку «Сохранить» для сохранения строки содержимого редактора. Поскольку я использую библиотеку CodeMirror , мне нужно извлечь содержимое (строку) из редактора с помощью javascript и отправить его на сервер. Поэтому в этом случае я не могу использовать вызов JS на основе XML, такой как f:ajax.

Вопрос: я планировал отправить строку с jsf.ajax.request, но она напрямую не поддерживает вызов методов для bean-компонентов. Как я могу вызвать метод в bean-компоненте с JSF в AJAX-манере?

Есть как минимум два способа обойти это:

  • Включение скрытой формы на страницу со скрытым полем ввода. Обновите это поле ввода из javascript, а затем вызовите jsf.ajax.request, чтобы опубликовать эту форму. При необходимости пользовательские действия могут быть вызваны в получателе или установщике свойства.
  • Выполните запрос с помощью raw XMLHttpRequest (или, возможно, с помощью какой-либо другой библиотеки JS). Создайте сервлет и назовите его.

Оба способа неуклюжи, и последний также выходит за рамки JSF.

Я что-то упустил? Как ты это делаешь?

Существует весьма похожий вопрос , но приведенные ответы относятся только к вызовам AJAX на основе XML. Существует также еще один аналогичный вопрос , но он также относится к вызовам AJAX на основе XML.

Ответы [ 2 ]

15 голосов
/ 15 сентября 2010

Я не мог выяснить, как напрямую вызывать bean-компоненты с помощью javascript, но здесь есть хитрость при вызове f: ajax-декларации из javascript:

1) Создание скрытой формы с полями для всех данныхчто вы хотите отправить на сервер.Включите также ah: commandButton:

<h:form id="hiddenForm" style="display: none;">
    <h:inputHidden id="someData" value="#{someBean.someData}" />
    <h:commandButton id="invisibleClickTarget">
        <f:ajax execute="@form" listener="#{someBean.myCoolActionOnServer()}" />
    </h:commandButton>
</h:form>

Как обычно, атрибут listener, в данном случае #{someBean.myCoolActionOnServer()}, относится к методу, который вы хотите выполнить на сервере.

2) В какой-то другой кнопке используйте onclick для вызова вашего специального javascript И нажмите кнопку триггера через javascript:

<h:commandButton value="Click me" onclick="populateTheForm('hiddenForm'); document.getElementById('hiddenForm:invisibleClickTarget').click(); return false;" />

populateTheForm() должен фактически заполнить данные в поля hiddenForm.

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

1 голос
/ 09 ноября 2011

Я делал эту задачу несколько раз. Вам не нужно умножать скрытые поля. Вы можете использовать только одно скрытое поле, преобразовать все входные значения в объект JSON через JSON.stringify и установить в это поле. На стороне сервера - десериализовать объект JSON (для этого есть много Java-библиотек) в класс Java. Вот и все.

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