і ви також не бачите жодних помилок і / або попереджень, що переглядаються в 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.