Как я могу иметь функциональность AJAX в моем веб-приложении JSF? - PullRequest
0 голосов
/ 07 июня 2011

У меня есть веб-приложение в JSF.Мне нужно добавить функциональность AJAX к нему.Как я могу это сделать?

Ответы [ 3 ]

3 голосов
/ 07 июня 2011

Я предполагаю, что вы используете JSF 1.x, поскольку JSF 2.x уже поставляется с функциональностью buitin Ajax, и тогда этот вопрос будет очень риторическим. Если обновление до JSF 2.x действительно не вариант, вам придется искать стороннюю библиотеку компонентов JSF 1.x со встроенной функциональностью Ajax, такую ​​как RichFaces 3.x (не 4 .x, поскольку для этого требуется JSF 2.x) или PrimeFaces 1.x (не 2.x или новее, поскольку для него требуется JSF 2.x).

RichFaces 3.x поставляется с библиотекой тегов Ajax4jsf (<a4j:xxx>), которая поддерживает базовую функциональность ajax, начиная с тега <a4j:support>. Этот тег очень похож на тег JSF 2.x <f:ajax>.

Нелегко представить "просто" библиотеку JS, такую ​​как Dojo, jQuery и т. Д., Поскольку вам необходимо , чтобы также изменять состояние дерева компонентов JSF на стороне сервера всякий раз, когда вы вносите изменения в дереве HTML DOM на стороне клиента. Эти простые библиотеки JS не учитывают это. Вам нужно было бы написать много дополнительного кода на стороне сервера во вкусе обработчика пользовательского представления. Но это именно то, что Ajax4jsf уже делает, поэтому вы хотели бы использовать его вместо изобретения колеса.

Если вы действительно намерены вырастить; глава 11 книги JSF: полный справочник дает хорошее представление обо всех вещах, которые вам необходимо принять во внимание. Вы увидите, что это не совсем так тривиально.

2 голосов
/ 07 июня 2011

С jsf 2.0 у нас есть f:ajax, который вы можете использовать

См. Также

1 голос
/ 05 августа 2014

Я знаю, что это старый пост, но я думаю, что это может быть полезно для тех, кто все еще борется с JSF 1.1.Я нашел способ получить функциональность AJAX с JSF 1.1 - MyFaces , просто используя jQuery и сервлет .Вам нужны эти элементы:

  1. Страница JSF, которая просто действует как контейнер.С DIV, куда вы хотите поместить свое содержимое и обновить его через AJAX.Внутри этого DIV, только для первой загрузки, вы помещаете подпредставление с включением для второй страницы JSF.
  2. Вторая страница JSF.Просто стандартная страница JSF с управляемым компонентом Session scoped, но предназначенная для перезагрузки через AJAX.На этой странице вы будете перенаправлять сервлет по каждому запросу.Объяснено впереди.
  3. Сервлет, который обрабатывает запросы AJAX и перезагружает вторую страницу JSF.Ключ в том, чтобы получить управляемый компонент, который обрабатывает второй JSF из класса FacesContext, так что вы можете манипулировать им, изменять его свойства ... Для этого:

// Это идетвнутри кода сервлета FacesContextFactory contextFactory = (FacesContextFactory) FactoryFinder.getFactory (FactoryFinder.FACES_CONTEXT_FACTORY);LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory (FactoryFinder.LIFECYCLE_FACTORY);Lifecycle lifecycle = lifecycleFactory.getLifecycle (LifecycleFactory.DEFAULT_LIFECYCLE);

FacesContext FaceContext = contextFactory.getFacesContext (request.getSession (). GetServletContext (), запрос, ответ, жизненный цикл); 101Con * жизненный цикл);setFacesContextAsCurrentInstance (FaceContext);

UIViewRoot view = FaceContext.getApplication (). getViewHandler (). createView (FaceContext, "");facesContext.setViewRoot (вид);

// теперь у вас есть доступ к контексту, вы можете получить управляемый компонент ValueBinding vb = FaceContext.getApplication (). CreateValueBinding ("# {YourManagedBean}");YourManagedBeanClass yourBean = (YourManagedBeanClass) vb.getValue (FaceContext);

// теперь вы можете манипулировать свойствами управляемого bean-компонента для окончательной пересылки на страницу JSF // ... yourBean.setParameter (request.getParameter ("MyParam "));RequestDispatcher dispatcher = getServletContext (). GetRequestDispatcher ("/ path / to / your_second_jsf.xhtml");dispatcher.forward (request, response);

Первая страница JSF - это место, где вы должны поместить функциональность javascript для запросов AJAX.Вы вызываете эти функции javascript из второго JSF.Когда AJAX-запросы выполняют обратный вызов, вы просто помещаете HTML-ответ в контейнер DIV.IE:

//param: json structure of parameters
function reloadAjaxPanel(param) {
    $.get("/ajaxController", param, function(data) {
        $("#container").html(data);
    }); 
}

Надеюсь, это поможет!

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