и вы также не видите никаких ошибок и / или предупреждений, связанных с 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>
компонентами ввода . Не забудьте включить id
of <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
аргумент actionListener
is 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.