і ви також не бачите жодних помилок і / або попереджень, що переглядаються в Google, та консолі JavaScript браузера (натисніть F12 в Chrome / Firefox23 + / IE9 +, щоб відкрити набір інструментів веб-розробників, а потім відкрити вкладку Консоль ), а потім перегляньте список можливих причин нижче.
UICommandі UIInputкомпоненти повинні бути розміщені всередині UIFormкомпонента, наприклад <h:form>(і, таким чином, не звичайний HTML <form>), інакше сервер нічого не може бути надісланий. UICommandкомпоненти також не повинні мати type="button"атрибут, інакше це буде мертва кнопка, яка корисна лише для JavaScript onclick. Див. Також Як надсилати значення введення форми та викликати метод у квадраті JSF, і <h: commandButton> не ініціює поштовий зворотній зв'язок .
Не можна вкладати кілька UIFormкомпонентів один в одного. Це незаконне використання HTML. Поведінка браузера не визначена. Слідкуйте за включенням файлів! Ви можете використовувати UIFormкомпоненти паралельно, але вони не оброблять один одного під час надсилання. Ви також повинні стежити за антипаттерном "God Form"; переконайтеся, що ви ненавмисно не обробляєте / перевіряєте всі інші (невидимі) входи в тій же самій формі (наприклад, приховане діалогове вікно з необхідними входами в тій самій формі). Дивіться також Як користуватися <h: form> на сторінці 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бін (і, таким чином, не в метод getter!), Це повинно виправити це. Дивіться також Як і коли слід завантажувати модель з бази даних для h: dataTable .
Якщо UICommandабо UIInputкомпоненти включені в динамічне джерело, наприклад <ui:include src="#{bean.include}">, то вам потрібно забезпечити збереження точно такого ж #{bean.include}значення протягом часу складання подання запиту на надсилання форми. JSF повторно виконає його під час створення дерева компонентів. Якщо розмістити квасоля в області перегляду та / або переконатися, що ви завантажуєте модель даних в @PostConstructбін (і, таким чином, не в метод getter!), Це повинно виправити це. Дивіться також Як аякс-оновлення динамічного включення вмісту за допомогою навігаційного меню? (JSF SPA) .
renderedАтрибут компонента і всіх його батьків і testатрибут будь-якого батька <c:if>/ <c:when>годі було оцінювати в falseпротягом застосувати запит значень фази підпорядкованої форми запиту. JSF повторно перевірить її як частину гарантії від підроблених / зламаних запитів. Зберігання змінної відповідальності за стан в @ViewScopedквасолі або переконавшись , що ви правильно preinitializing умови в @PostConstructз @RequestScopedквасолі повинні це виправити. Це ж стосується disabledатрибута компонента, який не повинен оцінюватися trueпід час фази значень запиту застосувати. Дивіться також дії JSF CommandButton, не викликані , Форма подання у умовно наданому компоненті не обробляється таh: commandButton не працює, як тільки я оберну його в <h: panelGroup rended> .
onclickАтрибут UICommandкомпонента і onsubmitатрибут UIFormкомпонента не повинен повертати falseабо викликати помилку JavaScript. На консолі JS браузера не повинно бути помилок JS <h:commandLink>або <f:ajax>також не повинно бути помічено. Зазвичай гугл точне повідомлення про помилку вже дасть вам відповідь. Дивіться також Ручне додавання / завантаження jQuery з результатами PrimeFaces у Uncaught TypeErrors .
Якщо ви використовуєте Ajax через JSF 2.x <f:ajax>або, наприклад, PrimeFaces <p:commandXxx>, переконайтеся, що у вас є <h:head>головний шаблон замість <head>. Інакше JSF не зможе автоматично включити необхідні файли JavaScript, які містять функції Ajax. Це призведе до помилки JavaScript типу "мояrra не визначено" або "PrimeFaces не визначено" в консолі JS браузера. Дивіться також h: commandLink actionlistener не викликається, коли використовується з f: ajax та ui: повторити .
Якщо ви використовуєте Ajax, і подані значення закінчуються null, переконайтеся, щоUIInput і UICommandкомпоненти інтересів покриваються <f:ajax execute>або , наприклад <p:commandXxx process>, в іншому випадку вони не будуть виконані / оброблені. Дивіться також Представлені значення форми, не оновлені в моделі при додаванні <f: ajax> до <h: commandButton> та розуміння PrimeFaces процесу / оновлення та JSF f: ajax Execute / render атрибутів .
Якщо подані значення все-таки є null, а ви використовуєте CDI для управління квасолею, тоді переконайтеся, що ви імпортуєте анотацію про обсяг з правильного пакета, інакше CDI за замовчуванням буде @Dependentефективно відтворювати боб при кожній оцінці EL вираз. Дивіться також @SessionScoped квасоля втрачає область застосування і постійно відтворюється, поля стають нульовими і що таке за замовчуванням керований обсяг квасолі в додатку JSF 2?
Якщо заздалегідь надісланий / оновлений батько кнопки <h:form>з UICommandкнопкою за допомогою ajax-запиту, який надходить з іншої форми на тій же сторінці, то перша дія завжди буде невдалою в JSF 2.2 або старішій версії. Друга та наступні дії спрацюють. Це спричинено помилкою в обробці стану перегляду, яка повідомляється як випуск 790 JSF, і наразі фіксується в JSF 2.3. Для старих версій JSF потрібно чітко вказати ідентифікатор<h:form> в renderз <f:ajax>. Дивіться також h: commandButton / h: commandLink не працює при першому натисканні, працює лише при другому клацанні .
Якщо <h:form>було enctype="multipart/form-data"встановлено для того , щоб завантаження файлу підтримки, то вам необхідно переконатися , що ви використовуєте по крайней мере , JSF 2.2, або що сервлет фільтр , який відповідає за аналіз запитів багаточастинні / форм-даних налаштований правильно, в іншому випадку FacesServletволі в кінцевому підсумку не отримує жодних параметрів запиту і, таким чином, не зможе застосувати значення запиту. Налаштування такого фільтра залежить від використовуваного компонента для завантаження файлів. Для Tomahawk <t:inputFileUpload>перевірте цю відповідь, а PrimeFaces <p:fileUpload>- цю відповідь . Або якщо ви насправді взагалі не завантажуєте файл, то видаліть атрибут взагалі.
Переконайтесь, що ActionEventаргумент actionListener- це, javax.faces.event.ActionEventа отже, ні java.awt.event.ActionEvent, що саме більшість ІДЕ пропонують як перший варіант автозаповнення. Не маючи аргументів, також неправильно, якщо ви використовуєте actionListener="#{bean.method}". Якщо ви не хочете аргументувати свій метод, використовуйте actionListener="#{bean.method()}". Або, можливо, ви насправді хочете використовувати actionзамість цього actionListener. Дивіться також Відмінності між дією та 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>. Тому що ці компоненти за замовчуванням перенесені JavaScript на кінець HTML <body>. Отже, якби вони спочатку сиділи всередині a <form>, вони б зараз більше не сиділи в a <form>. Дивіться також p: Дія командної кнопки не працює в діалоговому вікні 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.