commandButton/commandLink/ajax действие / метод прослушивателя не вызывается или входное значение не установлено / обновлено

иногда, при использовании <h:commandLink>, <h:commandButton> или <f:ajax> на action, actionListener или listener метод, связанный с тегом, просто не вызывается. Или свойства bean не обновляются с помощью submitted UIInput значения.

каковы возможные причины и решения для этого?

9 ответов


введение

когда UICommand компонент (<h:commandXxx>, <p:commandXxx> и т. д.) не удается вызвать связанный метод действия или UIInput компонент (<h:inputXxx>, <p:inputXxxx> и т. д.) не удается обработать отправленные значения и/или обновить значения модели, и вы не видите никаких исключений и / или предупреждений googlable в журнале сервера, также не при настройке обработчика исключений ajax согласно обработка исключений в запросах ajax JSF, ни когда вы устанавливаете ниже параметр контекста в web.xml,

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

и вы также не видите никаких ошибок и/или предупреждений googlable в консоли JavaScript браузера (нажмите F12 в Chrome/Firefox23+/IE9+, чтобы открыть набор инструментов веб-разработчика, а затем откройте консоль tab), затем проработайте ниже список возможных причин.

возможные причины

  1. UICommand и UIInput компоненты должны быть размещены внутри UIForm компонент, например <h:form> (и, таким образом, не простой HTML <form>), в противном случае ничего не может быть отправлено на сервер. UICommand компоненты также не должно быть type="button" атрибут, иначе это будет мертвая кнопка, которая полезна только для JavaScript onclick. См. также как отправить входные значения формы и вызвать метод в JSF bean и не инициирует обратную передачу.

  2. вы не можете вложить несколько UIForm компоненты друг к другу. Это незаконно в HTML. Поведение браузера не указано. Следите С включить файлы! Вы можете использовать UIForm компоненты параллельно, но они не будут обрабатывать друг друга во время отправки. Вы также должны следить за антипаттерном "форма Бога"; убедитесь, что вы не непреднамеренно обрабатываете/проверяете все другие (невидимые) входы в той же форме (например, наличие скрытого диалога с требуемыми входами в той же форме). См. также как использовать на странице JSF? Единая форма? Множественный форм? Вложенные формы?.

  3. нет UIInput ошибка проверки/преобразования значения должна была произойти. Вы можете использовать <h:messages> чтобы показать любые сообщения, которые не отображаются каким-либо конкретным входом <h:message> компоненты. Не забудьте включить id of <h:messages> на <f:ajax render>, если таковые имеются, так что он будет обновляться также по ajax-запросам. См. также h: сообщения не отображает сообщения, когда p: commandButton нажата.

  4. если UICommand или UIInput компоненты помещаются внутри итерационного компонента, такого как <h:dataTable>, <ui:repeat> и т. д., Тогда вам нужно убедиться, что точно так же value итерационного компонента сохраняется на этапе применить значения запроса формы отправить запрос. JSF повторит над ним, чтобы найти нажатую ссылку / кнопку и отправленные входные значения. Поместите компонент в область представления и / или убедитесь, что вы загружаете данные модель @PostConstruct Боба (и, следовательно, не в геттер метод!) должен исправить это. См. также как и когда я должен загрузить модель из базы данных для h: dataTable.

  5. если UICommand или UIInput компоненты включены динамическим источником, таким как <ui:include src="#{bean.include}">, вам необходимо убедиться, что точно так же #{bean.include} значение сохраняется во время построения представления запроса отправки формы. JSF будет повторно проверять его во время построения дерева компонентов. Поместите компонент в область просмотра и / или убедитесь, что вы загружаете модель данных в @PostConstruct Боба (и, следовательно, не в геттер метод!) должен исправить это. См. также как ajax-обновить динамический включить содержимое меню навигации? (JSF SPA).

  6. на rendered атрибут компонента и всех его родителей и test атрибут любого родителя <c:if>/<c:when> не следует оценивать в false на этапе применить значения запроса из формы отправить запрос. JSF перепроверит его как часть защиты от подделанных / взломанных запросов. Хранение переменных, отвечающих за состояние в @ViewScoped bean или убедитесь, что вы правильно прединициализируете условие в @PostConstruct of a @RequestScoped компонент должен это исправить. То же самое относится к disabled атрибут компонента, который не должен оцениваться как true во время фазы применить значения запроса. См. также действие командной кнопки JSF не вызывается и форма отправки в условно отображаемом компоненте не обрабатывается.

  7. на на UICommand компонент и на UIForm компонент не должен возвратить false или вызвать ошибку JavaScript. В случае <h:commandLink> или <f:ajax> также нет ошибок JS, видимых в консоли JS браузера. Обычно гуглить точное сообщение об ошибке уже даст вам ответ. См. также добавить jQuery для PrimeFaces приводит к Uncaught TypeError по всему месту.

  8. если вы используете 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.

  9. если вы используете Ajax, убедитесь, что UIInput и UICommand компоненты интереса охватываются <f:ajax execute> или например <p:commandXxx process>, иначе они не будут выполняться / обрабатываться. См. также отправленные значения формы не обновляются в модели при добавлении в и Понимание PrimeFaces процесс / обновление и JSF f:ajax execute/render attributes.

  10. если родитель <h:form> С предварительно отображается / обновляется запросом ajax, поступающим из другой формы на той же странице, тогда первое действие всегда будет неудачным. Второе и последующие действия будут работать. Это вызвано ошибкой в обработке состояния представления, которая сообщается как JSF spec выпуск 790 и в настоящее время планируется исправить в JSF 2.3. Для более старых версий JSF необходимо явно указать идентификатор <h:form> на render на <f:ajax>. См. также h:commandButton/h:commandLink не работает при первом щелчке, работает только при втором щелчке.

  11. если <h:form> и enctype="multipart/form-data" set для поддержки загрузки файлов, то вам нужно убедиться, что вы используете по крайней мере JSF 2.2, или что фильтр сервлетов, который отвечает за разбор запросов составных / форм-данных правильно настроено, иначе FacesServlet в конечном итоге не получит никаких параметров запроса вообще и, следовательно, не сможет применить значения запроса. Настройка такого фильтра зависит от используемого компонента загрузки файлов. За Томагавк!--68-->, Регистрация ответ и для PrimeFaces <p:fileUpload>, Регистрация ответ. Или, если вы на самом деле не загружаете файл вообще, удалите атрибут вообще.

  12. убедитесь, что что


если 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, который в значительной степени противостоит по умолчанию вы можете ожидать от простого JSF f:ajax или RichFaces, которые execute="@this" и render="@none" соответственно.

просто у меня ушло много времени, чтобы узнать. (... и я думаю, что это довольно unclever использовать значения по умолчанию, которые отличаются от JSF!)


Я бы упомянул еще одну вещь, которая касается Primefaces p:commandButton!

при использовании p:commandButton для действия, которое необходимо выполнить на сервере, вы не можете использовать type="button" потому что это кнопки которые используются для выполнения пользовательского javascript, не вызывая запрос ajax / non-ajax на сервер.

для этой цели можно обойтись (значение по умолчанию:"submit") или вы можете явно использовать type="submit".

надеюсь, что это поможет кому-то!


недавно я столкнулся с проблемой с UICommand, не вызывающим в приложении JSF 1.2 с использованием компонентов IBM Extended Faces.

у меня была кнопка команды в строке datatable (Расширенная версия, так что <hx:datatable>) и UICommand не будет срабатывать из определенных строк из таблицы (строки, которые не будут срабатывать, были строками больше размера отображения строки по умолчанию).

у меня был выпадающий компонент для выбора количества строк для отображения. Значение одгним поле было в RequestScope. Данные, поддерживающие саму таблицу, были в некотором роде ViewScope (на самом деле, временно в SessionScope).

если отображение строки было увеличено с помощью элемента управления, значение которого также было привязано кrows атрибут, ни одна из строк, отображаемых в результате этого изменения не может запустить UICommand при нажатии.

размещение этого атрибута в той же области, что и сами данные таблицы, исправило проблему.

Я думаю, что это упоминается в BalusC #4 выше, но значение таблицы должно быть не только областью просмотра или сеанса, но и атрибутом, управляющим количеством строк, отображаемых в этой таблице.


застрял с этой проблемой сам и нашел еще одну причину этой проблемы. Если у вас нет методов setter в вашем резервном компоненте для свойств, используемых в вашем *.xhtml, тогда действие просто не вызывается.


у меня тоже была эта проблема, и я только начал оттачивать основную причину после открытия веб-консоли браузера. До этого я не мог получить никаких сообщений об ошибках (даже с <p:messages>). Веб-консоль показала код состояния HTTP 405, возвращающийся из <h:commandButton type="submit" action="#{myBean.submit}">.

в моем случае у меня есть смесь ванильного HttpServlet, обеспечивающего аутентификацию OAuth через Auth0 и JSF facelets и beans, выполняющих мои представления приложений и бизнес-логику.

раз Я переделал свою паутину.xml, и удалил средний человек-сервлет, он тогда "волшебно" работал.

суть в том, что проблема заключалась в том, что сервлет среднего человека использовал RequestDispatcher.форвард.(..) для перенаправления из среды HttpServlet в среду JSF, тогда как сервлет, вызываемый до него, перенаправлялся с помощью HttpServletResponse.sendRedirect(...).

в основном, использование sendRedirect () позволило "контейнеру" JSF взять под контроль, тогда как Вызов requestdispatcher.forward (), очевидно, нет.

чего я не знаю, так это почему facelet смог получить доступ к свойствам bean, но не смог их установить, и это явно кричит о том, чтобы покончить со смесью сервлетов и JSF, но я надеюсь, что это поможет кому-то избежать многих часов от головы до стола.


мне было очень весело отлаживать проблему, когда <h:commandLink>действие в richfaces datatable отказались стрелять. Стол работал в какой-то момент, но остановился без видимой причины. Я не оставил камня на камне, только чтобы узнать, что мой rich:datatable использовал неправильный rowKeyConverter который вернул нули, которые richfaces счастливо использовал в качестве ключей строк. Это помешало моему <h:commandLink> действие от вызова.


еще одна возможность: если симптом заключается в том, что первый вызов работает, а последующие-нет, вы можете использовать PrimeFaces 3.x с JSF 2.2, как описано здесь:ViewState не отправляется.