Il <t:message> non viene visualizzato correttamente quando si utilizza <t:inputFileUpload> all'interno di <t:PanelTabbedPane>

StackOverflow https://stackoverflow.com/questions/66912

  •  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">  

È stato utile?

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.

https://issues.apache.org/jira/browse/MYFACES-1807?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12567158#action_12567158

Altri suggerimenti

IL ID forzato L'attributo dei componenti del tomahawk dovrebbe risolvere questo problema.

qualcosa di simile a:

&lt;t:outputText id="xyz" forceId="true" value="#{mybean.stuff}"/&gt;

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 è.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top