У меня есть dataTable и фильтр с несколькими входами. В фильтре у меня есть commandButton с ajax. Ajax запускает метод из bean, который ищет базу данных для записей, которые соответствуют критериям фильтра, и отображает dataTable. Проблема в том, что вызов ajax не работает всегда. Я знаю, это странно, для меня тоже, но это реально. И не всегда я имею в виду, что пусть говорят, что я делаю 5 запросов (я нажимаю 5 раз командуLink и работает ajax, данные меняются, метод из bean-горит), и чем в 6-й раз он не работает, ничего не происходит (запрос от клиента отсутствует side, method from bean not called), я нажимаю еще раз и до сих пор ничего не происходит, и пусть говорят, когда нажимают на него в 3 раза, но не с помощью ajax, а путем обычной отправки и перезагрузки всей страницы. Цифры, которые я дал, не всегда одинаковы, иногда самый первый запрос, который я делаю, не работает, и иногда я работаю много раз без этой ошибки. Некоторый код:JSF ajax не всегда срабатывает, вместо этого загружается страница
стол:
<h:dataTable id="usersTable" value="#{adminUserBean.userList}" var="user" styleClass="table" columnClasses="col30, ,col140,col140,col200,col140"> <h:column headerClass="col30"> <h:selectBooleanCheckbox value="#{user.selected}" id="check"> <f:ajax listener="#{adminUserBean.selectUser(user)}" render=":table:linkGroup" /> </h:selectBooleanCheckbox> </h:column> <h:column> <h:commandLink styleClass="user-edit" value="#{user.name} #{user.surname}"> <f:setPropertyActionListener value="true" target="#{adminUserBean.edit}" /> <f:ajax listener="#{adminUserBean.selectUser(user)}" render=":table:linkGroup check" /> </h:commandLink> </h:column> <h:column headerClass="col140"> <h:commandLink value="#{user.login}"> <f:ajax listener="#{adminUserBean.selectUser(user)}" render=":table:linkGroup check" /> </h:commandLink> </h:column> <h:column headerClass="col140"> <h:commandLink value="#{user.permissions}"> <f:ajax listener="#{adminUserBean.selectUser(user)}" render=":table:linkGroup check" /> </h:commandLink> </h:column> <h:column headerClass="col200"> <h:commandLink value="#{user.lastLogin}"> <f:ajax listener="#{adminUserBean.selectUser(user)}" render=":table:linkGroup check" /> </h:commandLink> </h:column> <h:column headerClass="col140"> <h:commandLink styleClass="icon-status #{!user.active ? 'blocked' : user.isLogged ? 'logged' : 'offline'}" value="#{!user.active ? 'Nieaktywny' : user.isLogged ? 'Zalogowany' : 'Wylogowany'}"> <f:ajax listener="#{adminUserBean.selectUser(user)}" render=":table:linkGroup check" /> </h:commandLink> </h:column> </h:dataTable>
фильтр:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:f="http://java.sun.com/jsf/core"> <h:form> <div class="filters"> <h2>Filtruj wg</h2> <h:panelGroup id="filtr" styleClass="filters-group"> <div class="div-table"> <div class="div-cell"> <fieldset> <legend>od</legend> <a href="" class="icon icon-filter-off hidden" /> <h:inputText class="input-filtr date" value="#{adminUserBean.userSearchProvider.dateFrom}" /> </fieldset> </div> <div class="div-cell"> <fieldset> <legend>do</legend> <a href="" class="icon icon-filter-off hidden" /> <h:inputText class="input-filtr date" value="#{adminUserBean.userSearchProvider.dateTo}" /> </fieldset> </div> </div> <div class="div-table"> <div class="div-cell"> <fieldset> <legend>nazwa zawiera:</legend> <a href="" class="icon icon-filter-off hidden"></a> <h:inputText class="input-filtr" value="#{adminUserBean.userSearchProvider.name}" /> </fieldset> </div> </div> </h:panelGroup> <h:commandButton value="Wyszukaj" styleClass="btn btn-blue-back btn-big wyszukaj"> <f:ajax execute="filtr" listener="#{adminUserBean.search}" render=":table:usersTable" /> </h:commandButton> </div>
боб:
package com.example.bean @ManagedBean @SessionScoped @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) @Controller public class AdminUserBean implements Serializable { @PostConstruct public void init() { offset = 0; sortCol = 0; sortOrder = "asc"; cleanData(); setUsers(); reportSearchProvider = new ReportSearchProvider(); } public void setUsers() { try { if (userList == null || userList.size() == 0) { userList = new ArrayList<User>(); } userList.addAll(adminUserService.getUsers(userSearchProvider, offset, sortCol, sortOrder)); } catch (DAOException e) { e.printStackTrace(); } } public void search() { if (userSearchProvider != null) { refreshUserList(); } } private void refreshUserList() { offset = 0; userList.clear(); setUsers(); }
(Я пропустил некоторые строки, переменные decl. и т. д.)
Я использую чистый JSF 2.2, Tomcat 8 как сервер (я не знаю, имеет ли это значение). Я читал подобные вопросы, но я не нашел того же примера, что и мой, что иногда работает ajax, а иногда нет. Любые идеи?
Вы проверили консоль браузера для любых ошибок JS или других подсказок? – BalusC
Да, ошибок нет. – pawel
Возможно ли, что метод bean загружает слишком много данных, чтобы он длился долго для запроса ajax? – pawel