и вы также не видите никаких погугливаемых ошибок и / или предупреждений в консоли JavaScript браузера (нажмите F12 в Chrome / Firefox23 + / IE9 +, чтобы открыть набор инструментов веб-разработчика, а затем откройте вкладку Консоль ), затем Проработайте приведенный ниже список возможных причин.
UICommand
и UIInput
должны быть размещены внутри компонента UIForm
, например <h:form>
(и, следовательно, не простой HTML <form>
), в противном случае ничего не может быть отправлено на сервер. Компоненты UICommand
также не должны иметь атрибута type="button"
, в противном случае это будет мертвая кнопка, полезная только для JavaScript onclick
. См. Также Как отправлять входные значения формы и вызывать метод в компоненте JSF , а не инициирует обратную передачу .
Вы не можете вложить несколько UIForm
компонентов друг в друга. Это незаконно в HTML. Поведение браузера не определено. Остерегайтесь включаемых файлов! Вы можете использовать UIForm
компонентов параллельно, но они не будут обрабатывать друг друга во время отправки. Вы также должны остерегаться «антипаттерна формы Бога»; убедитесь, что вы непреднамеренно не обрабатываете / не проверяете все другие (невидимые) входные данные в той же форме (например, наличие скрытого диалога с необходимыми входными данными в той же форме). См. Также Как использовать на странице JSF? Одиночная форма? Несколько форм? Вложенные формы? .
Нет UIInput
Ошибка проверки / преобразования значения должна была произойти. Вы можете использовать <h:messages>
, чтобы показать любые сообщения, которые не отображаются никакими специфичными для ввода компонентами <h:message>
. Не забудьте включить id
из <h:messages>
в <f:ajax render>
, если таковой имеется, чтобы он также обновлялся при запросах ajax. См. Также h: в сообщениях не отображаются сообщения при нажатии кнопки 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
или проверка правильности инициализации условия в @PostConstruct
компонента @RequestScoped
должно исправить это. То же самое относится к атрибуту disabled
компонента, который не должен оцениваться как true
на этапе применения значений запроса. См. Также Действие JSF CommandButton не вызвано и Отправка формы в условно отображаемом компоненте не обработана .
Атрибут onclick
компонента UICommand
и атрибут onsubmit
компонента UIForm
не должны возвращать false
или вызывать ошибку JavaScript. В случае <h:commandLink>
или <f:ajax>
также не должно быть ошибок JS, видимых в консоли JS браузера. Обычно поиск точного сообщения об ошибке уже даст вам ответ. См. Также Добавление jQuery к PrimeFaces приводит к Uncaught TypeError для всех мест .
Если вы используете Ajax через JSF 2.x <f:ajax>
или, например, PrimeFaces <p:commandXxx>
, убедитесь, что у вас есть <h:head>
в главном шаблоне вместо <head>
. В противном случае JSF не сможет автоматически включать необходимые файлы JavaScript, которые содержат функции Ajax. Это может привести к ошибке JavaScript типа «mojarra не определен» или «PrimeFaces не определен» в консоли JS браузера. См. Также h: commandLink actionlistener не вызывается при использовании с f: ajax и ui: repeat .
Если вы используете Ajax, убедитесь, что на UIInput
и UICommand
представляющие интерес компоненты включены <f:ajax execute>
или, например, <p:commandXxx process>
, иначе они не будут выполнены / обработаны. См. Также Отправленные значения формы не обновляются в модели при добавлении в и Общие сведения о процессе / обновлении PrimeFaces и JSF f: ajax для атрибутов выполнения / визуализации .
Если родительский элемент <h:form>
с кнопкой UICommand
был предварительно обработан / обновлен с помощью ajax-запроса, поступающего из другой формы на той же странице, то первое действие всегда будет неудачным. Второе и последующие действия будут работать. Это вызвано ошибкой в обработке состояния представления, которая сообщается как проблема спецификации JSF 790 и в настоящее время планируется исправить в JSF 2.3. Для более старых версий JSF вам необходимо явно указать идентификатор <h:form>
в render
<f:ajax>
. См. Также h: commandButton / h: commandLink не работает при первом нажатии, работает только при втором нажатии .
Если для <h:form>
установлено enctype="multipart/form-data"
, установленное для поддержки загрузки файлов, вам необходимо убедиться, что вы используете хотя бы JSF 2.2 или что фильтр сервлетов отвечает за синтаксический анализ multipart Запросы / form-data настроены правильно, в противном случае FacesServlet
в итоге не получит параметров запроса вообще и, следовательно, не сможет применить значения запроса. Как настроить такой фильтр, зависит от используемого компонента загрузки файла. Для Томагавка <t:inputFileUpload>
проверьте этот ответ , а для PrimeFaces <p:fileUpload>
проверьте этот ответ . Или, если вы вообще не загружаете файл, полностью удалите атрибут.
Убедитесь, что аргумент ActionEvent
для actionListener
является javax.faces.event.ActionEvent
и, следовательно, не java.awt.event.ActionEvent
, что большинство IDE предлагает в качестве первого параметра автозаполнения. Если вы не используете аргумент, это также неправильно, если вы используете actionListener="#{bean.method}"
. Если вам не нужен аргумент в вашем методе, используйте actionListener="#{bean.method()}"
. Или, возможно, вы действительно хотите использовать action
вместо actionListener
. См. Также Различия между action и actionListener .
Убедитесь, что ни PhaseListener
, ни какие-либо EventListener
в цепочке запрос-ответ не изменили жизненный цикл JSF для пропуска фазы действия вызова, например, вызвав FacesContext#renderResponse()
или FacesContext#responseComplete()
.
Убедитесь, что никакие Filter
или Servlet
в той же цепочке запрос-ответ каким-либо образом не заблокировали запрос FacesServlet
.
Ошибка в рамках. Например, RichFaces имеет « ошибка преобразования » при использовании элемента пользовательского интерфейса rich:calendar
с атрибутом defaultLabel
(или, в некоторых случаях, подэлементом rich:placeholder
). Эта ошибка предотвращает вызов метода bean, если для календарной даты не задано значение. Отслеживание ошибок каркаса можно выполнить, начав с простого рабочего примера и создавая страницу обратно до обнаружения ошибки.
Если вы используете PrimeFaces <p:dialog>
или <p:overlayPanel>
, убедитесь, что у них есть свои <h:form>
. Потому что по умолчанию эти компоненты перемещены в конец HTML <body>
. Итак, если бы они изначально сидели внутри <form>
, то теперь они больше не сидели бы в <form>
. См. Также p: действие командной кнопки не работает внутри p: диалоговое окно
Если вы все еще застряли, пришло время отладки. На стороне клиента нажмите F12 в веб-браузере, чтобы открыть набор инструментов для веб-разработчиков. Перейдите на вкладку Console , чтобы увидеть консоль JavaScript. Он не должен содержать ошибок JavaScript. Ниже на скриншоте приведен пример из Chrome, который демонстрирует случай отправки кнопки с включенной <f:ajax>
без объявления <h:head>
(как описано в пункте 7 выше).
На стороне сервера убедитесь, что сервер запущен в режиме отладки. Поместите точку останова отладки в метод интересующего компонента JSF, который вы ожидаете вызвать во время обработки отправки формы. Например. для компонента UICommand
это будет UICommand#queueEvent()
, а для компонента UIInput
это будет UIInput#validate()
. Просто выполните выполнение кода и проверьте, соответствуют ли поток и переменные ожиданиям. Ниже на скриншоте приведен пример отладчика Eclipse.