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.
UICommande i UIInputcomponenti devono essere collocati all'interno di un UIFormcomponente, ad es. <h:form>(e quindi non semplice HTML <form>), altrimenti non è possibile inviare nulla al server. UICommandanche 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ù UIFormcomponenti l'uno nell'altro. Questo è illegale in HTML. Il comportamento del browser non è specificato. Fai attenzione con i file include! È possibile utilizzare i UIFormcomponenti 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 UIInputsi 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 iddi <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 UICommando UIInputcomponenti vengono inseriti all'interno di un componente iterante come <h:dataTable>, <ui:repeat>ecc., È necessario assicurarsi che lo stesso valuecomponente 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 @PostConstructbean (e quindi non in un metodo getter!) Dovrebbe risolverlo. Vedi anche Come e quando devo caricare il modello dal database per h: dataTable .
Se UICommando UIInputcomponenti 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 @PostConstructbean (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' renderedattributo del componente e di tutti i suoi genitori e l' testattributo di qualsiasi genitore <c:if>/ <c:when>non devono essere valutati falsedurante 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 @ViewScopedbean o accertarsi di preinizializzare correttamente la condizione in @PostConstructun @RequestScopedbean dovrebbe risolverlo. Lo stesso vale per l' disabledattributo del componente, che non deve essere valutato truedurante 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' onclickattributo del UICommandcomponente e l' onsubmitattributo del UIFormcomponente non devono restituire falseo 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 UIInpute UICommanddi 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 @Dependentricreare 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 UICommandpulsante è 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 renderdel <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 FacesServletvolontà 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' ActionEventargomento di actionListenersia un javax.faces.event.ActionEvente 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 actioninvece di actionListener. Vedi anche Differenze tra action e actionListener .
Assicurarsi che nessuno PhaseListenero nessuno EventListenernella 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 Filtero Servletnella stessa catena richiesta-risposta abbia bloccato la richiesta in FacesServletqualche 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:calendarelemento dell'interfaccia utente con un defaultLabelattributo (o, in alcuni casi, un rich:placeholderelemento 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 UICommandcomponente, sarebbe UICommand#queueEvent()e in caso di UIInputcomponente, 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.