и вы также не видите никаких ошибок и / или предупреждений, связанных с 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.
Если вы
h:commandLink
внутри,h:dataTable
есть еще одна причина, по которой онh:commandLink
может не работать:Базовый источник данных, связанный с этим,
h:dataTable
также должен быть доступен во втором жизненном цикле JSF, который срабатывает при щелчке по ссылке.Так что, если базовый источник данных находится в области запроса, то
h:commandLink
он не работает!источник
Хотя мой ответ не применим на 100%, но большинство поисковых систем считают это первым хитом, я решил опубликовать его, тем не менее:
Если вы используете PrimeFaces (или некоторый подобный API)
p:commandButton
илиp:commandLink
, есть вероятность, что вы забыли явно добавитьprocess="@this"
к своим компонентам команд.Как указано в Руководстве пользователя PrimeFaces в разделе 3.18, значения по умолчанию для
process
и тогоupdate
и другого равны@form
, что в значительной степени противоречит значениям по умолчанию, которые вы можете ожидать от простого JSFf:ajax
или RichFaces, которые естьexecute="@this"
иrender="@none"
соответственно.Просто мне понадобилось много времени, чтобы выяснить это. (... и я думаю, что довольно неправильно использовать значения по умолчанию, которые отличаются от JSF!)
источник
process
является@form
. Так что, если действие не вызывается таким образом, но происходит при использовании@this
, то наиболее вероятен пункт 3 моего ответа.p:commandButton
метод, который не вызывал метод actionListener, пока я не добавилprocess="@this"
. Кроме того, в Руководстве пользователя PrimeFaces явно перечислены значения по умолчанию, о которых я упоминал в разделах 3.18 и 3.19. Это здесь: primefaces.googlecode.com/files/primefaces_users_guide_3_4.pdf ... может быть, настройки по умолчанию были изменены?process="@this"
и добавьте<p:messages autoUpdate="true">
(или просто прочитайте журнал сервера для помещенных в очередь, но не отображаемых сообщений), и вы увидите, что на самом деле произошла ошибка преобразования / проверки.Я бы упомянул еще одну вещь, которая касается Primefaces
p:commandButton
!Когда вы используете
p:commandButton
для действия, которое должно быть выполнено на сервере, вы не можете использовать его,type="button"
потому что это для кнопок, которые используются для выполнения пользовательского JavaScript, не вызывая ajax / non-ajax запрос к серверу.Для этой цели вы можете выдать
type
атрибут (значение по умолчанию -"submit"
) или вы можете явно использоватьtype="submit"
.Надеюсь, это кому-нибудь поможет!
источник
p:commandButton
имеет несколько значенийtype
атрибута иbutton
относится ко всему на стороне клиента. Это немного трудно найти это вPrimefaces
док, но вот одна ссылка: developer.am/primefaces/...Я сам застрял в этой проблеме и нашел еще одну причину этой проблемы. Если в вашем компоненте поддержки нет методов установки для свойств, используемых в вашем * .xhtml, то действие просто не вызывается.
источник
PropertyNotWritableException
. Если вы этого не видели, возможно, вы запустили ajax-запрос без надлежащего обработчика исключений ajax, но вы должны увидеть его в журналах сервера.Недавно я столкнулся с проблемой, когда UICommand не вызывается в приложении JSF 1.2 с использованием IBM Extended Faces Components.
У меня была командная кнопка в строке таблицы данных (расширенная версия, поэтому
<hx:datatable>
), и команда UICommand не запускалась из определенных строк таблицы (строки, которые не запускались, были строками больше размера отображения строки по умолчанию).У меня был выпадающий компонент для выбора количества строк для отображения. Значение, поддерживающее это поле, было в
RequestScope
. Данные, лежащие в основе самой таблицы, находились в некотором родеViewScope
(в действительности, временноSessionScope
).Если отображение строки было увеличено с помощью элемента управления, значение которого также было связано с
rows
атрибутом таблицы данных , ни одна из строк, отображаемых в результате этого изменения, не могла запустить UICommand при нажатии.Размещение этого атрибута в той же области, что и сами данные таблицы, решило проблему.
Я думаю, что это упоминалось в BalusC # 4 выше, но не только для табличного значения должна быть видимость или область видимости, но также и атрибут, управляющий количеством строк, отображаемых в этой таблице.
источник
У меня тоже была эта проблема, и я действительно начал понимать основную причину после открытия веб-консоли браузера. До этого я не мог получить никаких сообщений об ошибках (даже с
<p:messages>
). Веб-консоль показала код состояния HTTP 405, возвращаемый из<h:commandButton type="submit" action="#{myBean.submit}">
.В моем случае у меня есть смесь ванильного HttpServlet, обеспечивающего аутентификацию OAuth через фасеты Auth0 и JSF и бины, выполняющие представления моего приложения и бизнес-логику.
Как только я реорганизовал свой web.xml и удалил сервлет-посредник, он «волшебным образом» сработал.
В итоге проблема заключалась в том, что сервлет-посредник использовал RequestDispatcher.forward (...) для перенаправления из среды HttpServlet в среду JSF, тогда как сервлет, вызываемый до этого, перенаправлял с помощью HttpServletResponse.sendRedirect (.. .).
По сути, использование sendRedirect () позволило JSF-контейнеру взять управление, тогда как RequestDispatcher.forward () явно не было.
Что я не знаю, так это то, почему лицевая сторона смогла получить доступ к свойствам бина, но не смогла их установить, и это явно кричит об отказе от сочетания сервлетов и JSF, но я надеюсь, что это поможет кому-то избежать многих часов головной уборки. к настольному стук.
источник
Мне было очень весело отлаживать проблему, из-за которой
<h:commandLink>
действиеrichfaces
datatable
не срабатывало. Стол раньше работал, но остановился без видимой причины. Я не оставил камня на камне, только чтобы узнать, что мойrich:datatable
использовал неправильный,rowKeyConverter
который возвратил нули, которые richfaces счастливо использовали в качестве ключей строки. Это помешало моему<h:commandLink>
действию быть вызванным.источник
Еще одна возможность: если симптом заключается в том, что первый вызов работает, а последующие - нет, возможно, вы используете PrimeFaces 3.x с JSF 2.2, как подробно описано здесь: ViewState не отправляется .
источник
Я исправил мою проблему с размещением:
В:
источник
Это решение, которое работает для меня.
Здесь атрибут process = "userGroupSetupForm" является обязательным для вызова Ajax. actionListener вызывает метод из @ViewScope Bean. Также обновляется сообщение рычание, Datatable: userGroupList и Form: userGroupSetupForm.
источник
Решать;
источник