и вы также не видите никаких ошибок и / или предупреждений, связанных с Google, в консоли JavaScript браузера (нажмите F12 в Chrome / Firefox23 + / IE9 +, чтобы открыть набор инструментов веб-разработчика, а затем откройте вкладку « Консоль »), затем просмотрите приведенный ниже список возможных причин.
UICommandи UIInputкомпоненты должны быть размещены внутри UIFormкомпонента, например <h:form>(и, следовательно, не в виде простого HTML <form>), иначе ничто не может быть отправлено на сервер. UICommandКомпоненты также не должны иметь type="button"атрибутов, иначе это будет мертвая кнопка, которая полезна только для JavaScript onclick. См. Также Как отправить входные значения формы и вызвать метод в компоненте JSF, и <h: commandButton> не инициирует обратную передачу .
Вы не можете вложить несколько UIFormкомпонентов друг в друга. Это незаконно в HTML. Поведение браузера не определено. Остерегайтесь включаемых файлов! Вы можете использовать UIFormкомпоненты параллельно, но они не будут обрабатывать друг друга во время отправки. Вы также должны остерегаться «антипаттерна формы Бога»; убедитесь, что вы непреднамеренно не обрабатываете и не проверяете все другие (невидимые) входные данные в той же форме (например, наличие скрытого диалога с необходимыми входными данными в той же форме). Смотрите также Как использовать <h: form> на странице JSF? Одиночная форма? Несколько форм? Вложенные формы? ,
Нет UIInputошибка проверки / преобразования значения не должна была произойти. Вы можете использовать <h:messages>для отображения любых сообщений, которые не отображаются никакими <h:message>компонентами ввода . Не забудьте включить idof <h:messages>в <f:ajax render>, если таковой имеется, чтобы он также обновлялся при запросах ajax. См. Также h: messages не отображает сообщения при нажатии кнопки p: commandButton .
Если UICommandили UIInputкомпоненты размещены внутри итеративного компонента, такого как <h:dataTable>, <ui:repeat>и т. Д., То вы должны убедиться, что точно такой же valueитерационный компонент был сохранен на этапе применения значений запроса в форме отправки запроса. JSF будет повторять его, чтобы найти нажатую ссылку / кнопку и ввести введенные значения. Помещение компонента в область просмотра и / или проверка того, что вы загружаете модель данных в @PostConstructкомпоненте (и, следовательно, не в методе получения!), Должны исправить это. Смотрите также Как и когда я должен загрузить модель из базы данных для h: dataTable .
Если UICommandили UIInputкомпоненты включены таким динамическим источником, как <ui:include src="#{bean.include}">, то вы должны убедиться, что точно такое же #{bean.include}значение сохраняется во время создания представления запроса на отправку формы. JSF повторно выполнит его во время построения дерева компонентов. Помещение компонента в область просмотра и / или проверка того, что вы загружаете модель данных в @PostConstructкомпоненте (и, следовательно, не в методе получения!), Должны исправить это. См. Также Как ajax-refresh динамически включать контент с помощью меню навигации? (JSF SPA) .
renderedАтрибут компонента и всех его родителей и testатрибут любого родителя <c:if>/ <c:when>не следует оценивать в falseтечение применить запрос значений фазы подчиненной формы запроса. JSF перепроверит его как часть защиты от подделанных / взломанных запросов. Хранение переменной ответственности за состояние в @ViewScopedфасоли или убедившись , что вы правильно preinitializing условия в @PostConstructиз @RequestScopedфасоли должны это исправить. То же самое относится и к disabledатрибуту компонента, который не следует оценивать на trueэтапе применения значений запроса. См. Также действие JSF CommandButton, не вызванное , отправка формы в условно отображаемом компоненте не обрабатывается иh: commandButton не работает, когда я обертываю его в <h: panelGroup render> .
onclickАтрибут UICommandкомпонента и onsubmitатрибут UIFormкомпонента не должен возвращать falseили вызвать ошибку JavaScript. В случае <h:commandLink>или <f:ajax>не должно быть никаких ошибок JS, видимых в консоли JS браузера. Обычно поиск точного сообщения об ошибке уже даст вам ответ. См. Также Добавление / загрузка jQuery вручную с PrimeFaces приводит к Uncaught TypeErrors .
Если вы используете Ajax через JSF 2.x <f:ajax>или, например, PrimeFaces <p:commandXxx>, убедитесь, что у вас есть <h:head>в шаблоне master вместо <head>. В противном случае JSF не сможет автоматически включать необходимые файлы JavaScript, которые содержат функции Ajax. Это может привести к ошибке JavaScript типа «mojarra не определен» или «PrimeFaces не определен» в консоли JS браузера. См. Также h: commandLink actionlistener не вызывается при использовании с f: ajax и ui: repeat .
Если вы используете Ajax, и представленные значения в конечном итоге становятся null, тогда убедитесь, что интересующие компоненты UIInputи и UICommandвключены <f:ajax execute>или, например <p:commandXxx process>, иначе они не будут выполнены / обработаны. См. Также Отправленные значения формы, не обновленные в модели, при добавлении <f: ajax> в <h: commandButton> и Понимании процесса / обновления PrimeFaces и атрибутов JSF f: ajax execute / render .
Если отправленные значения все еще заканчиваются тем null, что вы используете CDI для управления bean-компонентами, убедитесь, что вы импортируете аннотацию области действия из правильного пакета, иначе по умолчанию будет использоваться CDI, @Dependentкоторый эффективно воссоздает bean-компонент при каждой отдельной оценке EL. выражение. Смотрите также @SessionScoped фасоль теряет объем и пересоздался все время, поля утратившим и Что такое по умолчанию Управляемый компонент Scope в JSF 2 приложения?
Если родительский элемент кнопки <h:form>with был UICommandпредварительно обработан / обновлен с помощью ajax-запроса, поступающего из другой формы на той же странице, то первое действие всегда будет неудачным в JSF 2.2 или более ранней версии. Второе и последующие действия будут работать. Это вызвано ошибкой обработки состояния представления, которая сообщается как проблема спецификации JSF 790 и в настоящее время исправлена в JSF 2.3. Для более старых версий JSF, вам нужно явно указать идентификатор <h:form>в renderиз <f:ajax>. См. Также h: commandButton / h: commandLink не работает при первом щелчке, работает только при втором щелчке .
Если <h:form>было enctype="multipart/form-data"установлено для того , чтобы загрузки файла поддержки, то вам необходимо убедиться , что вы используете по крайней мере , JSF 2.2, или что сервлет фильтр , который отвечает за анализ запросов многочастных / форм-данных настроен правильно, в противном случае FacesServletволи в конечном итоге не получает параметров запроса вообще и, следовательно, не может применять значения запроса. Как настроить такой фильтр, зависит от используемого компонента загрузки файла. Для Томагавк <t:inputFileUpload>, проверьте этот ответ и для PrimeFaces <p:fileUpload>, проверьте этот ответ . Или, если вы вообще не загружаете файл, удалите атрибут вообще.
Убедитесь, что ActionEventаргумент actionListeneris javax.faces.event.ActionEventи, следовательно, нет java.awt.event.ActionEvent, что большинство IDE предлагает в качестве 1-й опции автозаполнения. Если вы не используете аргумент, это также неправильно actionListener="#{bean.method}". Если вам не нужен аргумент в вашем методе, используйте actionListener="#{bean.method()}". Или, возможно, вы действительно хотите использовать actionвместо actionListener. Смотрите также Различия между action и actionListener .
Убедитесь, что ни PhaseListenerодин EventListenerиз цепочек запрос-ответ не изменил жизненный цикл JSF, чтобы пропустить фазу действия invoke, например, с помощью вызова FacesContext#renderResponse()или FacesContext#responseComplete().
Убедитесь, что ни одна Filterили Servletв той же цепочке запрос-ответ не заблокировала запрос FacesServletкаким-либо образом. Например, фильтры входа / безопасности, такие как Spring Security. Особенно в запросах ajax, которые по умолчанию заканчивались бы вообще без обратной связи с пользовательским интерфейсом. См. Также Обработка запросов Spring Security 4 и PrimeFaces 5 AJAX .
Если вы используете PrimeFaces <p:dialog>или a <p:overlayPanel>, убедитесь, что у них есть свои <h:form>. Потому что по умолчанию эти компоненты перемещены в конец HTML <body>. Итак, если бы они изначально сидели внутри <form>, то теперь они больше не сидели бы в <form>. См. Также действие p: commandbutton внутри p: не работает
Ошибка в рамках. Например, RichFaces имеет « ошибку преобразования » при использовании rich:calendarэлемента пользовательского интерфейса с defaultLabelатрибутом (или, в некоторых случаях, rich:placeholderподэлементом). Эта ошибка предотвращает вызов метода bean, если для календарной даты не задано значение. Отследить ошибки в фреймворке можно, начав с простого рабочего примера и создавая страницу обратно, пока ошибка не будет обнаружена.
Если вы все еще застряли, пришло время отладки. На стороне клиента нажмите F12 в веб-браузере, чтобы открыть набор инструментов веб-разработчика. Перейдите на вкладку « Консоль », чтобы увидеть консоль JavaScript. Он не должен содержать ошибок JavaScript. Ниже снимок экрана - пример из Chrome, который демонстрирует случай отправки <f:ajax>включенной кнопки, пока она не была <h:head>объявлена (как описано в пункте 7 выше).
На стороне сервера убедитесь, что сервер запущен в режиме отладки. Поместите точку отладки в метод интересующего компонента JSF, который вы ожидаете вызвать во время обработки отправки формы. Например, в случае UICommandкомпонента это будет, UICommand#queueEvent()а в случае UIInputкомпонента это будет UIInput#validate(). Просто выполните выполнение кода и проверьте, соответствуют ли поток и переменные ожиданиям. Ниже на скриншоте приведен пример отладчика Eclipse.