El <t:message> no se muestra correctamente cuando se usa <t:inputFileUpload> dentro de <t:PanelTabbedPane>

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

  •  09-06-2019
  •  | 
  •  

Pregunta

En una página JSP, creé un <h:form enctype="multipart/form-data"> con algunos elementos: <t:inputText>, <t:inputDate>, etc.Además agregué algunas <t:message for="someElement"> Y quería permitir al usuario cargar varios archivos (uno a la vez) dentro del formulario (usando <t:inputFileUpload> ) En este punto mi código funciona bien.


El dolor de cabeza viene cuando intento poner el formulario dentro de un <t:panelTabbedPane serverSideTabSwitch="false"> (y por lo tanto, por supuesto, dentro de un <t:panelTab> )

Copié la estructura que se muestra en el código fuente del ejemplo TabbedPane de Los ejemplos de Tomahawk, utilizando el <f:subview> etiqueta y colocando la etiqueta panelTab dentro de una nueva página jsp (usando <jsp:include page="somePage.jsp"> directiva)

En primer lugar, el <t:inputFileUpload> no puede cargar el archivo en el valor asignado en el atributo Managed Bean UploadedFile #{myBean.upFile}

Entonces, buscando en google una pista, Lo sabía <t:panelTabbedPane> genera un formulario llamado "autoform", por lo que obtenía formularios anidados.Ok, arreglé eso creando el <h:form> fuera de <t:panelTabbedPane> y eureka!¡La entrada de archivos funcionó de nuevo!(el autoformulario no genera)

Pero ¡oh sorpresa!¡Oh terrible ley de Murphy!Toda mi <h:message> comienza a fallar.La salida de la consola Eclipse me muestra que todo <t:message> están buscando elementos ID's inexistentes (que tienen sus ID's en parte iguales a los que buscan, pero al final de los ID's cambian sus nombres)

En este punto pongo un <t:mesagges> etiqueta (tenga en cuenta la "s" al final) para mostrarme todos los errores de validación a la vez al comienzo del Panel, y funciona bien.Entonces, existen errores de validación y se muestran correctamente al comienzo del Panel.

Todos los mensajes de error de validación generados en esta página son mensajes de validación integrados en JSF.El bean de respaldo en este momento no tiene ningún validador definido.

¿Cómo puedo obtener el <t:message for="xyz"> ¿trabajando apropiadamente?


Estoy usando Tomahawk-1.1.6 con myFaces-impl-1.2.3 en un proyecto eclipse Ganymede con Geronimo como servidor de aplicaciones (Geronimo me da la implementación del jar myFaces mientras coloco el jar tomahawk en la carpeta WEB-INF/lib de solicitud)


"SOLUCIONADO":Este problema es un problema reportado en el foro myFaces.

Gracias a Kyle Renfro por la pronta respuesta e información.(¡Buen trabajo Kyle!)Ver el problema


EDITAR 1

1.- Gracias a Kyle Renfro por su pronta respuesta.El atributo forceID usado dentro del elemento de entrada no funciona la primera vez, pero haciendo algunos ajustes muy complicados pude hacer que <t:message for="xyz"> Las etiquetas funcionan.

Lo que hice fue:
1.teniendo mi etiqueta <inputText id="name" forceId="true" required="true"> El <t:message> no funciona.
2.Luego, después de mirar los mensajes de error en la consola de eclipse, cambié el nombre de mi atributo "id" a este:<entradaTexto id="nombrej_id_1"forceId="true" requerido="true">
3.Entonces el <t:message> ¡¡trabajó!!pero después de presionar el botón "Enviar" del formulario por segunda vez.¡La segunda vez!(Sospecho que algo está pasando en el ciclo de vida de JSF)
4.Esto implica que el usuario debe presionar 2 veces el botón de enviar para recibir los mensajes de error en la página.
5.Y usar la frase "j_id_1" al final de los ID es muy extraño.


EDITAR 2

Ok, aquí viene el código, espero que no sea molesto.

1.- página principal.jsp (aquí está el <t:panelTabbedPane> y <f:subview> etiquetas)

<%@ 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.- detalle.jsp (aquí está el <t:panelTab> etiqueta)

<%@ 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>  

EDITAR 3

Sobre la respuesta al seguimiento de Kyle Renfro:

Kyle dice:

"En la primera vista de la página, si presiona el botón "CREAR BOLETO" sin nada en ninguno de los textos de entrada y sin archivos cargados, ¿funcionan las etiquetas de mensaje para los textos de entrada?(es decir.requerido = verdadero) Solo tengo curiosidad por saber si los mensajes para inputTexts funcionan pero el mensaje para inputFileUpload no".

Aquí está el comportamiento encontrado:
1.- No se muestra ningún mensaje de error de validación (las etiquetas de mensaje no funcionan) Incluso cuando intento probar solo un mensaje de error de validación (por ejemplo, probando el mensaje para el primer texto ingresado) ninguno aparece .
2.- La consola de eclipse me muestra estos errores internos:

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.  

Aquí fue cuando vi el "j_id_1" palabra en los ID generados, por ejemplo, para el 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

Y, al ver la página HTML generada resultante, vi que los nombres de los ID son así (sin usar el atributo "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">  

¿Fue útil?

Solución

Parece que puede estar relacionado con un error en myfaces.Hay una versión más nueva de myfaces y tomahawk que puedes probar.Quitaría la funcionalidad de subvista como prueba rápida: copie la página Detail.jsp nuevamente en la página principal.

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

Otros consejos

El fuerzaId El atributo de los componentes del tomahawk debería resolver este problema.

algo como:

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

En la primera vista de la página, si presiona el botón "CREAR BOLETO" sin nada en ninguno de los textos de entrada y sin archivos cargados, ¿funcionan las etiquetas de mensaje para los textos de entrada?(es decir.requerido = verdadero) Solo tengo curiosidad por saber si los mensajes para inputTexts funcionan pero el mensaje para inputFileUpload no.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top