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


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

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

9 315

9 ответов:

введение

когда UICommand компонент (<h:commandXxx>,<p:commandXxx> и т. д.) не удается вызвать связанный метод действия или UIInput компонент (<h:inputXxx>,<p:inputXxxx> и т. д.) не удается обработать представленные значения и/или обновить значения модели, и вы не видите никаких исключений и / или предупреждений googlable в журнале сервера, также не при настройке обработчика исключений ajax в соответствии с обработка исключений в запросах JSF ajax, ни когда вы устанавливаете ниже параметр контекста в 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 компоненты параллельно, но они не будут обрабатывать друг друга во время отправки. Вы также должны следить за антипаттером "God Form"; убедитесь, что вы не непреднамеренно обрабатываете/проверяете все другие (невидимые) входы в той же форме (например, имея скрытый диалог с требуемыми входами в той же форме). Смотрите также как использовать на странице JSF? Единая форма? Множественный формы? Вложенные формы?.

  3. нет UIInput ошибка проверки значения / преобразования должна была произойти. Вы можете использовать <h:messages> чтобы показать любые сообщения, которые не отображаются никакими входными данными <h:message> компоненты. Не забудьте включить id на <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. The rendered атрибут компонента и всех его родителей и test атрибут любого родителя <c:if>/<c:when> не следует оценивать в false на этапе применения значений запроса из формы отправить запрос. В JSF будет перепроверять его как часть защиты от подделки/взломан запросы. Хранение переменных, ответственных за условие в @ViewScoped bean или убедитесь, что вы правильно предварительно инициализируете условие в @PostConstruct на @RequestScoped компонент должен это исправить. То же самое относится и к disabled атрибут компонента, который не должен оцениваться в true во время фазы применить значения запроса. Смотрите также действие JSF CommandButton не вызывается и форма отправки в условно отрисованном компоненте не обрабатывается.

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

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

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

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

  11. если <h:form> и enctype="multipart/form-data" установить для поддержки загрузки файлов, то вам нужно убедиться, что вы используете по крайней мере JSF 2.2, или что фильтр сервлетов, который отвечает за разбор запросов multipart / form-data является правильно настроен, иначе FacesServlet в конечном итоге не получит никаких параметров запроса вообще и, следовательно, не сможет применить значения запроса. Способ настройки такого фильтра зависит от используемого компонента загрузки файлов. Для Томагавка <t:inputFileUpload>, Регистрация ответ и для 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).

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

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

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

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

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

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

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

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

в принципе, использование sendRedirect () позволило "контейнеру" JSF взять под контроль, тогда как RequestDispatcher.форварда() явно не было.

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

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

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