Il <t:message> non viene visualizzato correttamente quando si utilizza <t:inputFileUpload> all'interno di <t:PanelTabbedPane>
-
09-06-2019 - |
Domanda
In una pagina JSP, ho creato un file <h:form enctype="multipart/form-data">
con alcuni elementi: <t:inputText>
, <t:inputDate>
, eccetera.Inoltre, ne ho aggiunti alcuni <t:message for="someElement">
E volevo consentire all'utente di caricare più file (uno alla volta) all'interno del modulo (utilizzando <t:inputFileUpload>
) A questo punto il mio codice funziona bene.
Il mal di testa arriva quando provo a inserire il modulo all'interno di un file <t:panelTabbedPane serverSideTabSwitch="false">
(e quindi ovviamente, all'interno di a <t:panelTab>
)
Ho copiato la struttura mostrata nel codice sorgente per l'esempio TabbedPane Gli esempi di Tomahawk, utilizzando il <f:subview>
tag e inserendo il tag panelTab all'interno di una nuova pagina jsp (usando <jsp:include page="somePage.jsp">
direttiva)
Innanzitutto, il <t:inputFileUpload>
non riesce a caricare il file al valore assegnato nell'attributo Managed Bean UploadedFile #{myBean.upFile}
Poi, cercando su Google un indizio, Sapevo che <t:panelTabbedPane>
genera un modulo chiamato "autoform", quindi ottenevo moduli nidificati.Ok, ho risolto il problema creando il file <h:form>
fuori da <t:panelTabbedPane>
ed eureka!l'input del file ha funzionato di nuovo!(il modulo automatico non genera)
Ma, oh sorpresa!oh terribile legge di Murphy!Tutto il mio <h:message>
comincia a fallire.L'output della console Eclipse mi mostra tutto <t:message>
stanno cercando ID di elementi inesistenti (che hanno i loro ID in parte uguali a quelli che stanno cercando, ma alla fine degli ID i loro nomi cambiano)
A questo punto metto a <t:mesagges>
tag (nota la "s" alla fine) per mostrarmi tutti gli errori di convalida contemporaneamente all'inizio del pannello e funziona correttamente.Pertanto, esistono errori di convalida e vengono visualizzati correttamente all'inizio del pannello.
Tutti i messaggi di errore di convalida generati in questa pagina sono messaggi di convalida incorporati in JSF.Il bean di supporto in questo momento non ha validatori definiti.
¿Come posso ottenere il <t:message for="xyz">
funziona correttamente?
Sto usando Tomahawk-1.1.6 con myFaces-impl-1.2.3 in un progetto Eclipse Ganymede con Geronimo come server applicativo (Geronimo mi fornisce l'implementazione del jar myFaces mentre inserisco il jar tomahawk nella cartella WEB-INF/lib di applicazione)
"RISOLTO":Questo problema è un problema segnalato al forum myFaces.
Grazie a Kyle Renfro per la tempestiva risposta e informazione.(Buon lavoro Kyle!)Vedi il problema
MODIFICA 1
1.- Grazie a Kyle Renfro per la sua pronta risposta.L'attributo forceID utilizzato all'interno dell'elemento input non funziona la prima volta, ma apportando alcune modifiche molto complicate ho potuto apportare <t:message for="xyz">
i tag funzionano.
Quello che ho fatto è stato:
1.Avere la mia targhetta <inputText id="name" forceId="true" required="true">
IL <t:message>
non funziona.
2.Quindi, dopo aver esaminato i messaggi di errore sulla console Eclipse, ho rinominato il mio attributo "id" in questo modo:<inputText id="nomej_id_1" forceId="vero" richiesto="vero">
3.Poi il <t:message>
lavorato!!ma dopo aver premuto il pulsante "Invia" del modulo una seconda volta.La seconda volta!(Sospetto che stia succedendo qualcosa nel ciclo di vita di JSF)
4.Ciò implica che l'utente deve premere 2 volte il pulsante di invio per visualizzare i messaggi di errore sulla pagina.
5.E usare la frase "j_id_1" alla fine degli ID è molto strano.
MODIFICA 2
Ok, ecco che arriva il codice, spero che non sia fastidioso.
1.- mainPage.jsp (ecco il <t:panelTabbedPane>
E <f:subview>
tag)
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="t" uri="http://myfaces.apache.org/tomahawk"%>
<html>
<body>
<f:view>
<h:form enctype="multipart/form-data">
<t:panelTabbedPane serverSideTabSwitch="false" >
<f:subview id="subview_tab_detail">
<jsp:include page="detail.jsp"/>
</f:subview>
</t:panelTabbedPane>
</h:form>
</f:view>
</body>
</html>
2.- dettaglio.jsp (ecco il <t:panelTab>
etichetta)
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="t" uri="http://myfaces.apache.org/tomahawk"%>
<t:panelTab label="TAB_1">
<t:panelGrid columns="3">
<f:facet name="header">
<h:outputText value="CREATING A TICKET" />
</f:facet>
<t:outputLabel for="ticket_id" value="TICKET ID" />
<t:inputText id="ticket_id" value="#{myBean.ticketId}" required="true" />
<t:message for="ticket_id" />
<t:outputLabel for="description" value="DESCRIPTION" />
<t:inputText id="description" value="#{myBean.ticketDescription}" required="true" />
<t:message for="description" />
<t:outputLabel for="attachment" value="ATTACHMENTS" />
<t:panelGroup>
<!-- This is for listing multiple file uploads -->
<!-- The panelGrid binding make attachment list grow as the user inputs several files (one at a time) -->
<t:panelGrid columns="3" binding="#{myBean.panelUpload}" />
<t:inputFileUpload id="attachment" value="#{myBean.upFile}" storage="file" />
<t:commandButton value="ADD FILE" action="#{myBean.upload}" />
</t:panelGroup>
<t:message for="attachment" />
<t:commandButton action="#{myBean.create}" value="CREATE TICKET" />
</t:panelGrid>
</t:panelTab>
MODIFICA 3
In risposta al follow-up di Kyle Renfro:
Kyle dice:
"Alla prima visualizzazione della pagina, se si preme il pulsante "CREA BIGLIETTO" senza nulla in nessuno degli inputTexts e nessun file caricato, i tag del messaggio funzionano per gli inputTexts?(cioè.obbligatorio = true) Sono solo curioso di sapere se i messaggi per inputTexts funzionano ma il messaggio per inputFileUpload no."
Ecco il comportamento riscontrato:
1.- Non viene visualizzato alcun messaggio di errore di convalida (i tag dei messaggi non funzionano) Anche quando provo a testare solo un messaggio di errore di convalida (ad esempio, testando il messaggio per il primo testo di input) nessuno di essi viene visualizzato .
2.- La console Eclipse mi mostra questi errori interni:
ERROR [HtmlMessageRendererBase] Could not render Message. Unable to find component 'ticket_id' (calling findComponent on component 'j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:j_id_jsp_1716158401_5j_id_1'). If the provided id was correct, wrap the message and its component into an h:panelGroup or h:panelGrid.
ERROR [HtmlMessageRendererBase] Could not render Message. Unable to find component 'description' (calling findComponent on component 'j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:j_id_jsp_1716158401_8j_id_1'). If the provided id was correct, wrap the message and its component into an h:panelGroup or h:panelGrid.
ERROR [HtmlMessageRendererBase] Could not render Message. Unable to find component 'attachment' (calling findComponent on component 'j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:j_id_jsp_1716158401_14j_id_1'). If the provided id was correct, wrap the message and its component into an h:panelGroup or h:panelGrid.
Ecco quando ho visto il "j_id_1"
parola negli ID generati, ad esempio, per l'id "ticket_id":
j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:j_id_jsp_1716158401_5j_id_1
E, visualizzando la pagina HTML risultante generata, ho visto che i nomi degli ID sono così (senza utilizzare l'attributo "ForceId"):
<input id="j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:ticket_idj_id_1" name="j_id_jsp_1383779881_1:subview_tab_detail:j_id_jsp_1716158401_0j_id_1:ticket_idj_id_1">
Soluzione
Sembra che possa essere correlato a un bug in myfaces.C'è una versione più recente di myfaces e tomahawk che potresti provare.Vorrei rimuovere la funzionalità di visualizzazione secondaria come test rapido: copiare nuovamente la pagina detail.jsp nella pagina principale.
Altri suggerimenti
IL ID forzato L'attributo dei componenti del tomahawk dovrebbe risolvere questo problema.
qualcosa di simile a:
<t:outputText id="xyz" forceId="true" value="#{mybean.stuff}"/>
Alla prima visualizzazione della pagina, se premi il pulsante "CREA BIGLIETTO" senza nulla in nessuno degli inputTexts e nessun file caricato, i tag dei messaggi funzionano per gli inputTexts?(cioè.obbligatorio = true) Sono solo curioso di sapere se i messaggi per inputTexts funzionano ma il messaggio per inputFileUpload non lo è.