a także nie widzisz żadnych błędów i / lub ostrzeżeń w przeglądarce w konsoli JavaScript przeglądarki (naciśnij F12 w Chrome / Firefox23 + / IE9 +, aby otworzyć zestaw narzędzi dla programistów, a następnie otwórz konsolę kartę ), a następnie zapoznaj się z poniższą listą możliwych przyczyn.
UICommand
a UIInput
komponenty muszą być umieszczone wewnątrz UIForm
komponentu, np. <h:form>
(a więc nie zwykły HTML <form>
), w przeciwnym razie nic nie zostanie wysłane na serwer. UICommand
komponenty również nie mogą mieć type="button"
atrybutu, w przeciwnym razie będzie to martwy przycisk przydatny tylko w JavaScript onclick
. Zobacz także Jak wysyłać wartości wejściowe formularza i wywoływać metodę w komponencie bean JSF, a <h: commandButton> nie inicjuje postback .
Nie można zagnieżdżać UIForm
w sobie wielu komponentów. Jest to nielegalne w HTML. Zachowanie przeglądarki nie jest określone. Uważaj z dołączonymi plikami! Możesz używać UIForm
komponentów równolegle, ale nie będą się one przetwarzać podczas przesyłania. Powinieneś także uważać z antypatternem „God Form”; upewnij się, że nie przypadkowo przetwarzasz / weryfikujesz wszystkie inne (niewidoczne) dane wejściowe w tej samej formie (np. mając ukryte okno dialogowe z wymaganymi danymi wejściowymi w tej samej formie). Zobacz także Jak używać <h: formularz> na stronie JSF? Pojedynczy formularz? Wiele formularzy? Zagnieżdżone formularze?.
Nie UIInput
powinien wystąpić błąd sprawdzania poprawności / konwersji wartości. Można użyć <h:messages>
do wyświetlenia dowolnych komunikatów, które nie są pokazywane przez <h:message>
komponenty specyficzne dla danych wejściowych . Nie zapomnij zawierać id
od <h:messages>
w <f:ajax render>
, jeśli w ogóle, tak, że będzie on aktualizowany w miarę dobrze na ajax żądań. Zobacz także h: wiadomości nie wyświetla wiadomości po naciśnięciu przycisku p: polecenie .
Jeśli UICommand
lub UIInput
składniki są umieszczone wewnątrz komponentu iteracji jak <h:dataTable>
, <ui:repeat>
itp, to trzeba upewnić się, że dokładnie to samo value
składnika iteracji jest zachowały się podczas zastosowania żądania wartości fazę formie przedstawienia żądania. JSF powtórzy to, aby znaleźć kliknięty link / przycisk i przesłał wartości wejściowe. Umieszczenie komponentu bean w zakresie widoku i / lub upewnienie się, że ładujesz model danych @PostConstruct
do komponentu bean (a zatem nie w metodzie gettera!) Powinno to naprawić. Zobacz także Jak i kiedy powinienem załadować model z bazy danych dla h: dataTable .
Jeśli UICommand
lub UIInput
komponenty są zawarte w dynamicznym źródle, takim jak <ui:include src="#{bean.include}">
, musisz upewnić się, że dokładnie ta sama #{bean.include}
wartość zostanie zachowana w czasie kompilacji widoku żądania przesyłania formularza. JSF ponownie go wykona podczas budowania drzewa komponentów. Umieszczenie komponentu bean w zakresie widoku i / lub upewnienie się, że ładujesz model danych @PostConstruct
do komponentu bean (a zatem nie w metodzie gettera!) Powinno to naprawić. Zobacz także Jak odświeżyć dynamicznie ajax dołączyć zawartość według menu nawigacji? (JSF SPA) .
rendered
Atrybut elementu i wszystkich jego rodziców i test
atrybut każdego rodzica <c:if>
/ <c:when>
nie należy oceniać na false
czasie zastosować wartości żądania fazę formie przedstawienia żądania. JSF sprawdzi to ponownie w ramach zabezpieczenia przed sfałszowanymi / zhakowanymi żądaniami. Przechowywanie zmienne odpowiedzialne za stan w @ViewScoped
fasoli lub upewniając się, że jesteś właściwie preinitializing stanu w @PostConstruct
z @RequestScoped
fasoli powinien to naprawić. To samo dotyczy disabled
atrybutu komponentu, którego nie należy oceniać true
podczas fazy stosowania wartości żądania. Zobacz także Nie akcji JSF CommandButton , Prześlij formularz w warunkowo renderowanym komponencie nie jest przetwarzany ih: commandButton nie działa, gdy zawinę go w <h: panelGroup renderowane> .
onclick
Atrybutem UICommand
elementu i onsubmit
atrybut UIForm
elementu nie powinna powrócić false
lub spowodować błąd JavaScript. Tam w przypadku powinny <h:commandLink>
lub <f:ajax>
też nie ma JS błędy widoczne w konsoli JS przeglądarki. Zwykle wyszukiwanie go w dokładnym komunikacie o błędzie daje już odpowiedź. Zobacz także Ręczne dodawanie / ładowanie wyników jQuery za pomocą PrimeFaces w Uncaught TypeErrors .
Jeśli używasz Ajax przez JSF 2.x <f:ajax>
lub np. PrimeFaces <p:commandXxx>
, upewnij się, że masz <h:head>
szablon główny zamiast <head>
. W przeciwnym razie JSF nie będzie w stanie automatycznie dołączyć niezbędnych plików JavaScript, które zawierają funkcje Ajax. Spowodowałoby to błąd JavaScript, taki jak „mojarra nie jest zdefiniowany” lub „PrimeFaces nie jest zdefiniowany” w konsoli JS przeglądarki. Zobacz także h: commandLink actionlistener nie jest wywoływany, gdy jest używany z f: ajax i ui: repeat .
Jeśli używasz Ajax, a przesłane wartości są w końcu null
, upewnij się, że UIInput
i UICommand
komponenty będące przedmiotem zainteresowania są objęte przez <f:ajax execute>
np. W <p:commandXxx process>
przeciwnym razie nie zostaną wykonane / przetworzone. Zobacz także Przesłane wartości formularza niezaktualizowane w modelu podczas dodawania <f: ajax> do <h: commandButton> oraz Zrozumienie procesu / aktualizacji PrimeFaces i JSF f: ajax atrybuty wykonania / renderowania .
Jeśli przesłane wartości nadal się kończą null
, a używasz CDI do zarządzania komponentami bean, to upewnij się, że importujesz adnotację zakresu z właściwego pakietu, w przeciwnym razie CDI domyślnie, do @Dependent
którego skutecznie odtwarza komponent bean przy każdej pojedynczej ocenie EL wyrażenie. Zobacz także @SessionScoped bean traci zakres i cały czas jest odtwarzany, pola stają się puste i jaki jest domyślny zakres Bean Managed w aplikacji JSF 2?
Jeśli element nadrzędny <h:form>
z UICommand
przyciskiem jest wcześniej renderowany / aktualizowany przez żądanie ajax pochodzące z innego formularza na tej samej stronie, wówczas pierwsza akcja zawsze zakończy się niepowodzeniem w JSF 2.2 lub starszym. Drugie i kolejne działania będą działać. Jest to spowodowane błędem w obsłudze stanu widoku, który jest zgłaszany jako problem ze specyfikacją JSF 790 i obecnie naprawiony w JSF 2.3. Dla starszych wersji JSF, trzeba wyraźnie określić identyfikator <h:form>
w render
z <f:ajax>
. Zobacz także h: commandButton / h: commandLink nie działa przy pierwszym kliknięciu, działa tylko przy drugim kliknięciu .
Jeśli <h:form>
został enctype="multipart/form-data"
ustawiony w celu przesyłania plików wsparcie, to trzeba się upewnić, że używasz przynajmniej JSF 2.2, lub że filtr serwletu, który jest odpowiedzialny za analizowanie wniosków wieloczęściowy / form-data jest poprawnie skonfigurowany, w przeciwnym razie FacesServlet
wolę ostatecznie nie otrzyma żadnych parametrów żądania, a zatem nie będzie w stanie zastosować wartości żądania. Sposób skonfigurowania takiego filtra zależy od używanego komponentu do przesyłania plików. W przypadku Tomahawk <t:inputFileUpload>
sprawdź tę odpowiedź, aw przypadku PrimeFaces <p:fileUpload>
sprawdź tę odpowiedź . Lub, jeśli w ogóle nie przesyłasz pliku, usuń atrybut całkowicie.
Upewnij się, że ActionEvent
argumentem actionListener
jest, javax.faces.event.ActionEvent
a zatem nie java.awt.event.ActionEvent
, co sugeruje większość IDE jako pierwsza opcja autouzupełniania. Brak argumentu jest również błędny, jeśli używasz actionListener="#{bean.method}"
. Jeśli nie chcesz argumentu w swojej metodzie, użyj actionListener="#{bean.method()}"
. A może faktycznie chcesz użyć action
zamiast actionListener
. Zobacz także Różnice między akcją a listą akcji .
Upewnij się, że żaden PhaseListener
lub żaden EventListener
w łańcuchu żądania-odpowiedzi nie zmienił cyklu życia JSF, aby pominąć fazę działania invoke, na przykład wywołując FacesContext#renderResponse()
lub FacesContext#responseComplete()
.
Upewnij się, że żaden Filter
lub Servlet
w tym samym łańcuchu żądanie-odpowiedź w FacesServlet
jakiś sposób nie zablokował żądania . Na przykład filtry logowania / bezpieczeństwa, takie jak Spring Security. Zwłaszcza w żądaniach ajax, które domyślnie nie miałyby żadnej informacji zwrotnej z interfejsu użytkownika. Zobacz także Obsługa żądań AJAX Spring Security 4 i PrimeFaces 5 .
Jeśli używasz PrimeFaces <p:dialog>
lub a <p:overlayPanel>
, upewnij się, że mają swoje własne <h:form>
. Ponieważ te składniki są domyślnie przenoszone przez JavaScript na koniec HTML <body>
. Tak więc, jeśli pierwotnie siedzieli w środku <form>
, to nie mogliby już więcej siedzieć w <form>
. Zobacz także akcja przycisku p: polecenie nie działa w oknie dialogowym p:
Błąd w ramach. Na przykład RichFaces ma „ błąd konwersji ” podczas używania rich:calendar
elementu interfejsu użytkownika z defaultLabel
atrybutem (lub, w niektórych przypadkach, rich:placeholder
podelementem). Ten błąd uniemożliwia wywołanie metody komponentu bean, gdy dla daty kalendarzowej nie jest ustawiona żadna wartość. Śledzenie błędów frameworka można osiągnąć, zaczynając od prostego działającego przykładu i budując stronę z powrotem do momentu wykrycia błędu.
Jeśli nadal utkniesz, czas na debugowanie. Po stronie klienta naciśnij klawisz F12 w przeglądarce, aby otworzyć zestaw narzędzi dla programistów. Kliknij kartę Konsola , aby zobaczyć plik JavaScript. Powinien być wolny od błędów JavaScript. Poniższy zrzut ekranu to przykład z Chrome, który pokazuje przypadek przesłania <f:ajax>
włączonego przycisku bez jego <h:head>
zadeklarowania (jak opisano w punkcie 7 powyżej).
Po stronie serwera upewnij się, że serwer jest uruchomiony w trybie debugowania. Umieść punkt przerwania debugowania w metodzie interesującego komponentu JSF, który ma zostać wywołany podczas przetwarzania formularza przesyłania. Np. W przypadku UICommand
komponentu byłoby to, UICommand#queueEvent()
aw przypadku UIInput
komponentu, byłoby UIInput#validate()
. Wystarczy wykonać wykonanie kodu i sprawdzić, czy przepływ i zmienne są zgodne z oczekiwaniami. Poniższy zrzut ekranu przedstawia przykład z debugera Eclipse.