e inoltre non visualizzi errori e / o avvisi googlable nella console JavaScript del browser (premi F12 in Chrome / Firefox23 + / IE9 + per aprire il set di strumenti per sviluppatori web e quindi apri la scheda Console ), quindi procedi attraverso l'elenco delle possibili cause.
UICommand
e i UIInput
componenti devono essere collocati all'interno di un UIForm
componente, ad es. <h:form>
(e quindi non semplice HTML <form>
), altrimenti non è possibile inviare nulla al server. UICommand
anche i componenti non devono avere type="button"
attributi, altrimenti sarà un pulsante morto che è utile solo per JavaScript onclick
. Vedere anche Come inviare i valori di input del modulo e invocare un metodo nel bean JSF e <h: commandButton> non avvia un postback .
Non è possibile nidificare più UIForm
componenti l'uno nell'altro. Questo è illegale in HTML. Il comportamento del browser non è specificato. Fai attenzione con i file include! È possibile utilizzare i UIForm
componenti in parallelo, ma non si elaboreranno a vicenda durante l'invio. Dovresti anche stare attento con l'antipasto "God Form"; assicurati di non elaborare / convalidare involontariamente tutti gli altri input (invisibili) nella stessa forma (ad es. avere una finestra di dialogo nascosta con input richiesti nella stessa forma). Vedi anche Come usare <h: form> nella pagina JSF? Forma singola? Forme multiple? Forme nidificate? .
Non UIInput
si sarebbe verificato alcun errore di convalida / conversione del valore. È possibile utilizzare <h:messages>
per mostrare tutti i messaggi che non sono mostrati da alcun <h:message>
componente specifico di input . Non dimenticare di includere il id
di <h:messages>
in <f:ajax render>
, se presente, in modo che venga aggiornato anche nelle richieste Ajax. Vedi anche h: i messaggi non visualizzano i messaggi quando si preme p: commandButton .
Se UICommand
o UIInput
componenti vengono inseriti all'interno di un componente iterante come <h:dataTable>
, <ui:repeat>
ecc., È necessario assicurarsi che lo stesso value
componente iterante sia stato conservato durante la fase di richiesta dei valori della richiesta di invio del modulo. JSF lo ripeterà per trovare il link / pulsante cliccato e i valori di input inviati. Mettere il bean nell'ambito della vista e / o assicurarsi di caricare il modello di dati nel @PostConstruct
bean (e quindi non in un metodo getter!) Dovrebbe risolverlo. Vedi anche Come e quando devo caricare il modello dal database per h: dataTable .
Se UICommand
o UIInput
componenti sono inclusi da un'origine dinamica come <ui:include src="#{bean.include}">
, allora è necessario assicurarsi che lo stesso #{bean.include}
valore sia preservato durante il tempo di costruzione della vista della richiesta di invio del modulo. JSF lo eseguirà nuovamente durante la creazione dell'albero dei componenti. Mettere il bean nell'ambito della vista e / o assicurarsi di caricare il modello di dati nel @PostConstruct
bean (e quindi non in un metodo getter!) Dovrebbe risolverlo. Vedi anche Come aggiornare ajax in modo dinamico includere i contenuti tramite il menu di navigazione? (JSF SPA) .
L' rendered
attributo del componente e di tutti i suoi genitori e l' test
attributo di qualsiasi genitore <c:if>
/ <c:when>
non devono essere valutati false
durante la fase di richiesta dei valori della richiesta di invio del modulo. JSF lo ricontrollerà come parte della protezione contro richieste manomesse / compromesse. Memorizzare le variabili responsabili della condizione in un @ViewScoped
bean o accertarsi di preinizializzare correttamente la condizione in @PostConstruct
un @RequestScoped
bean dovrebbe risolverlo. Lo stesso vale per l' disabled
attributo del componente, che non deve essere valutato true
durante la fase di applicazione dei valori di richiesta. Vedi anche l' azione CommandButton JSF non invocata , invio del modulo nel componente sottoposto a rendering condizionale non viene elaborato eh: commandButton non funziona una volta che lo avvolgo in un <h: panelGroup reso> .
L' onclick
attributo del UICommand
componente e l' onsubmit
attributo del UIForm
componente non devono restituire false
o causare un errore JavaScript. In caso di errori JS <h:commandLink>
o <f:ajax>
anche non essere visibili nella console JS del browser, dovrebbero essere presenti. Di solito google il messaggio di errore esatto ti darà già la risposta. Vedi anche Aggiunta / caricamento manuale di jQuery con risultati PrimeFaces in Uncaught TypeErrors .
Se si utilizza Ajax tramite JSF 2.xo <f:ajax>
ad esempio PrimeFaces <p:commandXxx>
, assicurarsi di avere un <h:head>
modello principale anziché <head>
. Altrimenti JSF non sarà in grado di includere automaticamente i file JavaScript necessari che contengono le funzioni Ajax. Ciò comporterebbe un errore JavaScript come "mojarra non definito" o "PrimeFaces non definito" nella console JS del browser. Vedi anche h: commandLink actionlistener non viene richiamato se usato con f: ajax e ui: repeat .
Se si utilizza Ajax e i valori inviati finiscono per essere null
, assicurarsi che i componenti UIInput
e UICommand
di interesse siano coperti da <f:ajax execute>
o ad es. <p:commandXxx process>
, Altrimenti non verranno eseguiti / elaborati. Vedere anche Valori modulo inviati non aggiornati nel modello quando si aggiungono <f: ajax> in <h: commandButton> e Comprensione processo / aggiornamento PrimeFaces e JSF f: ajax eseguono / rendono gli attributi .
Se i valori inviati continuano a essere null
, e stai usando CDI per gestire i bean, assicurati di importare l'annotazione dell'ambito dal pacchetto corretto, altrimenti CDI verrà automaticamente impostato su predefinito per @Dependent
ricreare il bean su ogni singola valutazione dell'EL espressione. Vedi anche il bean @SessionScoped perde ambito e viene ricreato continuamente, i campi diventano nulli e Qual è l'ambito di bean gestito predefinito in un'applicazione JSF 2?
Se un genitore del <h:form>
con il UICommand
pulsante è stato precedentemente reso / aggiornato da una richiesta Ajax proveniente da un altro modulo nella stessa pagina, la prima azione fallirà sempre in JSF 2.2 o precedente. La seconda e le successive azioni funzioneranno. Ciò è causato da un bug nella gestione dello stato di visualizzazione che viene segnalato come problema con le specifiche JSF 790 e attualmente risolto in JSF 2.3. Per le versioni più vecchie JSF, è necessario specificare in modo esplicito l'ID del <h:form>
nel render
del <f:ajax>
. Vedi anche h: commandButton / h: commandLink non funziona al primo clic, funziona solo al secondo clic .
Se <h:form>
è stato enctype="multipart/form-data"
impostato per supportare il caricamento di file, è necessario assicurarsi di utilizzare almeno JSF 2.2 o che il filtro servlet responsabile dell'analisi delle richieste multipart / form-data sia configurato correttamente, altrimenti la FacesServlet
volontà finiscono per non ottenere alcun parametro di richiesta e quindi non possono applicare i valori di richiesta. La modalità di configurazione di tale filtro dipende dal componente di caricamento file utilizzato. Per Tomahawk <t:inputFileUpload>
, controlla questa risposta e per PrimeFaces <p:fileUpload>
, controlla questa risposta . Oppure, se in realtà non stai caricando affatto un file, rimuovi del tutto l'attributo.
Assicurati che l' ActionEvent
argomento di actionListener
sia un javax.faces.event.ActionEvent
e quindi no java.awt.event.ActionEvent
, che è ciò che la maggior parte degli IDE suggerisce come prima opzione di completamento automatico. Non avere argomenti è sbagliato anche se si utilizza actionListener="#{bean.method}"
. Se non vuoi un argomento nel tuo metodo, usa actionListener="#{bean.method()}"
. O forse vuoi effettivamente usare action
invece di actionListener
. Vedi anche Differenze tra action e actionListener .
Assicurarsi che nessuno PhaseListener
o nessuno EventListener
nella catena richiesta-risposta abbia modificato il ciclo di vita di JSF per saltare la fase di azione di richiamo, ad esempio chiamando FacesContext#renderResponse()
o FacesContext#responseComplete()
.
Assicurarsi che nessuna Filter
o Servlet
nella stessa catena richiesta-risposta abbia bloccato la richiesta in FacesServlet
qualche modo. Ad esempio, i filtri di accesso / sicurezza come Spring Security. Soprattutto nelle richieste Ajax che per impostazione predefinita finirebbero senza alcun feedback dell'interfaccia utente. Vedi anche Gestione delle richieste AJAX di Spring Security 4 e PrimeFaces 5 .
Se si utilizza un PrimeFaces <p:dialog>
o un <p:overlayPanel>
, quindi assicurarsi che abbiano i propri <h:form>
. Perché, questi componenti sono per impostazione predefinita da JavaScript trasferiti alla fine di HTML <body>
. Quindi, se fossero stati originariamente seduti all'interno di un <form>
, allora non si sarebbero più seduti in un <form>
. Vedi anche l' azione p: commandbutton non funziona all'interno di p: dialog
Bug nel framework. Ad esempio, RichFaces presenta un " errore di conversione " quando si utilizza un rich:calendar
elemento dell'interfaccia utente con un defaultLabel
attributo (o, in alcuni casi, un rich:placeholder
elemento secondario). Questo errore impedisce di invocare il metodo bean quando non è impostato alcun valore per la data del calendario. La traccia dei bug del framework può essere realizzata iniziando con un semplice esempio funzionante e costruendo il backup della pagina fino a quando il bug non viene scoperto.
Nel caso in cui rimanga bloccato, è il momento di eseguire il debug. Nel lato client, premi F12 nel browser web per aprire il set di strumenti per sviluppatori web. Fai clic sulla scheda Console, quindi vedi il cono JavaScript. Dovrebbe essere privo di errori JavaScript. Lo screenshot seguente mostra un esempio di Chrome che mostra il caso di invio di un <f:ajax>
pulsante abilitato senza averlo <h:head>
dichiarato (come descritto al punto 7 sopra).
Sul lato server, assicurarsi che il server sia avviato in modalità debug. Inserisci un breakpoint di debug in un metodo del componente JSF di interesse che prevedi di essere chiamato durante l'elaborazione del modulo di invio. Ad esempio in caso di UICommand
componente, sarebbe UICommand#queueEvent()
e in caso di UIInput
componente, sarebbe UIInput#validate()
. Basta passare attraverso l'esecuzione del codice e ispezionare se il flusso e le variabili sono come da aspettative. Lo screenshot seguente è un esempio del debugger di Eclipse.