0

I have an development with Spring Roo 1.X + JSF addon.

I have the next page, a very long and complex page with 5 datatables (next version is simplified and i show only some dialogs:

<ui:composition template="/view/layout/main_layout.xhtml">

    <ui:define name="content">

        <h:form id="growlForm" prependId="false">
            <p:growl id="growl" showDetail="false" />
        </h:form>
        <h:form id="dataForm" prependId="false">

            <p:panel id="data" toggleable="true" toggleSpeed="500" closeSpeed="500">

                <ui:param name="dependiente" value="#{dependienteBean.dependiente}" />

                <f:facet id="header" name="header">
                    <h:outputText
                        value="#{msg.entity_dependiente}:&emsp;#{dependiente.apellidos},&nbsp;#{dependiente.nombre}&ensp;(#{dependiente.dni})" />
                </f:facet>

                <h:panelGrid columns="5" cellspacing="10" styleClass="center_panel">

                    <h:panelGroup>
                        <h:outputLabel for="dni" value="#{msg.field_dni}:" />
                        <p:inputText id="dni" value="#{dependiente.dni}" />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="nombre" value="#{msg.field_nombre}:" />
                        <p:inputText id="nombre" value="#{dependiente.nombre}" />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="apellidos" value="#{msg.field_apellidos}:" />
                        <p:inputText id="apellidos" value="#{dependiente.apellidos}" />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="fechaNacimiento" value="#{msg.field_fecha_nacimiento}:" />
                        <p:inputMask id="fechaNacimiento" value="#{dependiente.fechaNacimiento}" locale="es" mask="99/99/9999">
                            <f:convertDateTime type="date" dateStyle="short" pattern="dd/MM/yyyy"/>
                        </p:inputMask>
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="sexo" value="#{msg.field_sexo}:" />
                        <p:autoComplete id="sexo" value="#{dependiente.sexo}" dropdown="true"
                            completeMethod="#{dependienteBean.completeSexo}" />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="direccion" value="#{msg.field_direccion}:" />
                        <p:inputText id="direccion" value="#{dependiente.direccion}" />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="codigoPostal" value="#{msg.field_codigo_postal}:" />
                        <p:inputText id="codigoPostal" value="#{dependiente.codigoPostal}" />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="poblacion" value="#{msg.field_poblacion}:" />
                        <p:inputText id="poblacion" value="#{dependiente.poblacion}" />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="nacionalidad" value="#{msg.field_nacionalidad}:" />
                        <p:inputText id="nacionalidad" value="#{dependiente.nacionalidad}" />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="telefono" value="#{msg.field_telefono}:" />
                        <p:inputText id="telefono" value="#{dependiente.telefono}" />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="centro" value="#{msg.field_centro}:" />
                        <p:inputText id="centro" value="#{dependiente.derived.centroAsignado}" disabled="true" />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="grado" value="#{msg.field_grado}:" />
                        <p:autoComplete id="grado" value="#{dependiente.derived.grado}" dropdown="true"
                            completeMethod="#{dependienteBean.completeGrado}" disabled="true" />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="nivel" value="#{msg.field_nivel}:" />
                        <p:autoComplete id="nivel" value="#{dependiente.derived.nivel}" dropdown="true"
                            completeMethod="#{dependienteBean.completeNivel}" disabled="true" />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="exitus" value="#{msg.field_exitus}:" />
                        <p:selectBooleanCheckbox id="exitus" value="#{dependiente.exitus}" />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="desproteccion" value="#{msg.field_desproteccion}:" />
                        <p:selectBooleanCheckbox id="desproteccion" value="#{dependiente.desproteccion}" />
                    </h:panelGroup>

                    <h:panelGroup>
                        <h:outputLabel for="urgente" value="#{msg.field_urgente}" />
                        <p:selectBooleanCheckbox id="urgente" value="#{dependiente.derived.urgente}" />
                    </h:panelGroup>
                </h:panelGrid>

                <p:outputPanel styleClass="warning_panel" rendered="#{dependienteBean.message() != null}">
                    <!-- style="display:block"  > -->
                    <div>
                        <h:outputText value="Información: " styleClass="warning_title">
                        </h:outputText>
                        <h:outputText value="Tiene recursos incompatibles asignados." styleClass="warning_text">
                        </h:outputText>
                    </div>
                    <div>
                        <h:outputText value="Prestaciones municipales y recursos asignados" styleClass="warning_info"></h:outputText>
                    </div>
                    <div>
                        <h:outputText value="#{dependienteBean.message()}" styleClass="warning_info"></h:outputText>
                    </div>
                </p:outputPanel>

                <p:outputPanel style="display:block" styleClass="center_panel">
                    <h:outputLabel for="observaciones" value="#{msg.field_observaciones}:" />
                    <p:editor id="observaciones" widgetVar="editorWidget" value="#{dependiente.observaciones}" />
                </p:outputPanel>

                <!--
                <p:panel id="prestacionesPanel" toggleable="true" toggleSpeed="500" closeSpeed="500" styleClass="checkbox_panel">
                    <p:selectManyCheckbox id="prestaciones" value="#{dependienteBean.selectedPrestacionesMunicipales}" layout="grid"
                        columns="3" converter="#{prestacionMunicipalConverter}">
                        <f:selectItems value="#{prestacionMunicipalBean.getActivos()}" var="prestacion" itemValue="#{prestacion}"
                            itemLabel="#{prestacion.descripcion}" />
                    </p:selectManyCheckbox>
                </p:panel>
                -->

                <h:panelGrid columns="2" cellspacing="20">

                    <p:dataTable id="solicituds" value="#{solicitudBean.getSolicitudsByDependienteId(dependiente.id)}" var="solicitud"
                        resizableColumns="false" scrollable="true" scrollWidth="98%" scrollHeight="150">

                        <f:facet name="header">
                            #{msg.entity_solicitud_pl}
                            <sec:authorize access="!hasRole('ROLE_CONSULTA')">
                            <p:commandButton id="createSolicitudButton" icon="ui-icon-circle-plus" update=":dataForm:data"
                                oncomplete="PF('createSolicitudDialogWidget').show()" title="#{msg.label_create}" />
                                </sec:authorize>
                        </f:facet>


                        <p:column headerText="#{applicationBean.getColumnName('numeroSolicitud')}" colspan="1"
                            sortBy="#{solicitud.numeroSolicitud}">
                            <h:outputText value="#{solicitud.numeroSolicitud}" />
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaSolicitud')}" colspan="1"
                            sortBy="#{solicitud.fechaSolicitud}">
                            <h:outputText value="#{solicitud.fechaSolicitud}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('direccion')}" colspan="6" sortBy="#{solicitud.direccion}">
                            <h:outputText value="#{solicitud.direccion}" />
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('codigoPostal')}" colspan="1"
                            sortBy="#{solicitud.codigoPostal}">
                            <h:outputText value="#{solicitud.codigoPostal}" />
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('poblacion')}" colspan="1" sortBy="#{solicitud.poblacion}">
                            <h:outputText value="#{solicitud.poblacion}" />
                        </p:column>
                        <p:column headerText="#{msg.label_actions}" colspan="1" styleClass="actions_column">
                            <p:commandButton id="editSolicitudButton" icon="ui-icon-pencil"
                                update=":editSolicitudForm:editSolicitudPanelGrid" action="#{solicitudBean.onEdit}"
                                oncomplete="PF('editSolicitudDialogWidget').show()" title="#{msg.label_edit}">
                                <f:setPropertyActionListener value="#{solicitud}" target="#{solicitudBean.solicitud}" />
                            </p:commandButton>
                            <p:tooltip for="editSolicitudButton" value="#{msg.label_edit}" showEffect="fade" hideEffect="fade" />
                            <sec:authorize access="!hasRole('ROLE_CONSULTA')">
                            <p:commandButton id="deleteSolicitudButton" icon="ui-icon-trash"
                                oncomplete="PF('deleteSolicitudDialogWidget').show()" title="#{msg.label_delete}">
                                <f:setPropertyActionListener value="#{solicitud}" target="#{solicitudBean.solicitud}" />
                            </p:commandButton>
                            <p:tooltip for="deleteSolicitudButton" value="#{msg.label_delete}" showEffect="fade" hideEffect="fade" />
                            </sec:authorize>
                        </p:column>

                    </p:dataTable>

                    <p:dataTable id="pias" value="#{piaBean.getPiasByDependiente(dependiente.id)}" var="pia" resizableColumns="false"
                        scrollable="true" scrollWidth="98%" scrollHeight="150">


                        <f:facet name="header">
                            #{msg.entity_pia_pl}
                            <sec:authorize access="!hasRole('ROLE_CONSULTA')">      
                            <p:commandButton id="createPiaButton" icon="ui-icon-circle-plus" update=":dataForm:data"
                                oncomplete="PF('createPiaDialogWidget').show()" title="#{msg.label_create}" />
                                </sec:authorize>
                        </f:facet>


                        <p:column headerText="#{applicationBean.getColumnName('fechaEntrada')}" colspan="2" sortBy="#{pia.fechaEntrada}">
                            <h:outputText value="#{pia.fechaEntrada}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaSalida')}" colspan="2" sortBy="#{pia.fechaSalida}">
                            <h:outputText value="#{pia.fechaSalida}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaResolucion')}" colspan="2"
                            sortBy="#{pia.fechaResolucion}">
                            <h:outputText value="#{pia.fechaResolucion}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaRevision')}" colspan="2" sortBy="#{pia.fechaRevision}">
                            <h:outputText value="#{pia.fechaRevision}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="Grado" colspan="1" sortBy="#{pia.grado}">
                            <h:outputText value="#{pia.grado}" />
                        </p:column>

                        <p:column headerText="#{msg.label_actions}" colspan="1" styleClass="actions_column">
                            <p:commandButton id="editPiaButton" icon="ui-icon-pencil" update=":editPiaForm:editPiaPanelGrid"
                                action="#{piaBean.onEdit}" oncomplete="PF('editPiaDialogWidget').show()" title="#{messages.label_edit}">
                                <f:setPropertyActionListener value="#{pia}" target="#{piaBean.pia}" />
                            </p:commandButton>
                            <p:tooltip for="editPiaButton" value="#{messages.label_edit}" showEffect="fade" hideEffect="fade" />
                            <sec:authorize access="!hasRole('ROLE_CONSULTA')">
                            <p:commandButton id="deletePiaButton" icon="ui-icon-trash" oncomplete="PF('deletePiaDialogWidget').show()"
                                title="#{messages.label_delete}">
                                <f:setPropertyActionListener value="#{pia}" target="#{piaBean.pia}" />
                            </p:commandButton>
                            <p:tooltip for="deletePiaButton" value="#{messages.label_delete}" showEffect="fade" hideEffect="fade" />
                            </sec:authorize>
                        </p:column>

                    </p:dataTable>

                    <p:dataTable id="informeEntornoes" value="#{informeEntornoBean.getInformeEntornoesByDependienteId(dependiente.id)}"
                        var="informeEntorno" resizableColumns="false" scrollable="true" scrollWidth="98%" scrollHeight="150">


                        <f:facet name="header">
                            #{msg.entity_informe_entorno_pl}
                            <sec:authorize access="!hasRole('ROLE_CONSULTA')">      
                            <p:commandButton id="createInformeEntornoButton" icon="ui-icon-circle-plus" update=":dataForm:data"
                                oncomplete="PF('createInformeEntornoDialogWidget').show()" title="#{msg.label_create}" />
                                </sec:authorize>
                        </f:facet>


                        <p:column headerText="Centro" colspan="2" sortBy="#{informeEntorno.centroAsignado}">
                            <h:outputText value="#{informeEntorno.centroAsignado}" />
                        </p:column>

                        <p:column headerText="Estado" colspan="1" sortBy="#{informeEntorno.estado}">
                            <h:outputText value="#{informeEntorno.estado}" />
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaEntrada')}" colspan="1"
                            sortBy="#{informeEntorno.fechaEntrada}">
                            <h:outputText value="#{informeEntorno.fechaEntrada}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaSalida')}" colspan="1"
                            sortBy="#{informeEntorno.fechaSalida}">
                            <h:outputText value="#{informeEntorno.fechaSalida}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaRevision')}" colspan="1"
                            sortBy="#{informeEntorno.fechaRevision}">
                            <h:outputText value="#{informeEntorno.fechaRevision}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('observaciones')}" colspan="6"
                            sortBy="#{informeEntorno.observaciones}">
                            <h:outputText value="#{informeEntorno.observaciones}" />
                        </p:column>

                        <p:column headerText="#{msg.label_actions}" colspan="1" styleClass="actions_column">
                            <p:commandButton id="editInformeEntornoButton" icon="ui-icon-pencil"
                                update=":editInformeEntornoForm:editInformeEntornoPanelGrid" action="#{informeEntornoBean.onEdit}"
                                oncomplete="PF('editInformeEntornoDialogWidget').show()" title="#{msg.label_edit}">
                                <f:setPropertyActionListener value="#{informeEntorno}" target="#{informeEntornoBean.informeEntorno}" />
                            </p:commandButton>
                            <p:tooltip for="editInformeEntornoButton" value="#{msg.label_edit}" showEffect="fade" hideEffect="fade" />
                            <sec:authorize access="!hasRole('ROLE_CONSULTA')">
                            <p:commandButton id="deleteInformeEntornoButton" icon="ui-icon-trash"
                                oncomplete="PF('deleteInformeEntornoDialogWidget').show()" title="#{msg.label_delete}">
                                <f:setPropertyActionListener value="#{informeEntorno}" target="#{informeEntornoBean.informeEntorno}" />
                            </p:commandButton>
                            <p:tooltip for="deleteInformeEntornoButton" value="#{msg.label_delete}" showEffect="fade" hideEffect="fade" />
                            </sec:authorize>
                        </p:column>

                    </p:dataTable>

                    <p:dataTable id="informeValoracions"
                        value="#{informeValoracionBean.getInformeValoracionsByDependienteId(dependiente.id)}" var="informeValoracion"
                        resizableColumns="false" scrollable="true" scrollWidth="98%" scrollHeight="150">

                        <f:facet name="header">
                            #{msg.entity_informe_valoracion_pl}
                            <sec:authorize access="!hasRole('ROLE_CONSULTA')">      
                            <p:commandButton id="createInformeValoracionButton" icon="ui-icon-circle-plus" update=":dataForm:data"
                                oncomplete="PF('createInformeValoracionDialogWidget').show()" title="#{msg.label_create}" />
                                </sec:authorize>
                        </f:facet>


                        <p:column headerText="Centro" colspan="2" sortBy="#{informeValoracion.centroAsignado}">
                            <h:outputText value="#{informeValoracion.centroAsignado}" />
                        </p:column>

                        <p:column headerText="Estado" colspan="1" sortBy="#{informeValoracion.estado}">
                            <h:outputText value="#{informeValoracion.estado}" />
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaEntrada')}" colspan="1"
                            sortBy="#{informeValoracion.fechaEntrada}">
                            <h:outputText value="#{informeValoracion.fechaEntrada}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaSalida')}" colspan="1"
                            sortBy="#{informeValoracion.fechaSalida}">
                            <h:outputText value="#{informeValoracion.fechaSalida}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaRevision')}" colspan="1"
                            sortBy="#{informeValoracion.fechaRevision}">
                            <h:outputText value="#{informeValoracion.fechaRevision}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('observaciones')}" colspan="6"
                            sortBy="#{informeValoracion.observaciones}">
                            <h:outputText value="#{informeValoracion.observaciones}" />
                        </p:column>

                        <p:column headerText="#{msg.label_actions}" colspan="1" styleClass="actions_column">
                            <p:commandButton id="editInformeValoracionButton" icon="ui-icon-pencil"
                                update=":editInformeValoracionForm:editInformeValoracionPanelGrid" action="#{informeValoracionBean.onEdit}"
                                oncomplete="PF('editInformeValoracionDialogWidget').show()" title="#{msg.label_edit}">
                                <f:setPropertyActionListener value="#{informeValoracion}" target="#{informeValoracionBean.informeValoracion}" />
                            </p:commandButton>
                            <p:tooltip for="editInformeValoracionButton" value="#{msg.label_edit}" showEffect="fade" hideEffect="fade" />
                            <sec:authorize access="!hasRole('ROLE_CONSULTA')">
                            <p:commandButton id="deleteInformeValoracionButton" icon="ui-icon-trash"
                                oncomplete="PF('deleteInformeValoracionDialogWidget').show()" title="#{msg.label_delete}">
                                <f:setPropertyActionListener value="#{informeValoracion}" target="#{informeValoracionBean.informeValoracion}" />
                            </p:commandButton>
                            <p:tooltip for="deleteInformeValoracionButton" value="#{msg.label_delete}" showEffect="fade" hideEffect="fade" />
                            </sec:authorize>
                        </p:column>

                    </p:dataTable>

                    <p:dataTable id="informeTecnicoes" value="#{informeTecnicoBean.getInformeTecnicoesByDependienteId(dependiente.id)}"
                        var="informeTecnico" resizableColumns="false" scrollable="true" scrollWidth="98%" scrollHeight="150">                       
                        <f:facet name="header">                     
                            #{msg.entity_informe_tecnico_pl}
                            <sec:authorize access="!hasRole('ROLE_CONSULTA')">  
                            <p:commandButton id="createInformeTecnicoButton" icon="ui-icon-circle-plus" update=":dataForm:data"
                                oncomplete="PF('createInformeTecnicoDialogWidget').show()" title="#{msg.label_create}" />
                                </sec:authorize>
                        </f:facet>


                        <p:column headerText="Centro" colspan="2" sortBy="#{informeTecnico.centroAsignado}">
                            <h:outputText value="#{informeTecnico.centroAsignado}" />
                        </p:column>

                        <p:column headerText="Estado" colspan="1" sortBy="#{informeTecnico.estado}">
                            <h:outputText value="#{informeTecnico.estado}" />
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaEntrada')}" colspan="1"
                            sortBy="#{informeTecnico.fechaEntrada}">
                            <h:outputText value="#{informeTecnico.fechaEntrada}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaSalida')}" colspan="1"
                            sortBy="#{informeTecnico.fechaSalida}">
                            <h:outputText value="#{informeTecnico.fechaSalida}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaRevision')}" colspan="1"
                            sortBy="#{informeTecnico.fechaRevision}">
                            <h:outputText value="#{informeTecnico.fechaRevision}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('observaciones')}" colspan="6"
                            sortBy="#{informeTecnico.observaciones}">
                            <h:outputText value="#{informeTecnico.observaciones}" />
                        </p:column>

                        <p:column headerText="#{msg.label_actions}" colspan="1" styleClass="actions_column">
                            <p:commandButton id="editInformeTecnicoButton" icon="ui-icon-pencil"
                                update=":editInformeTecnicoForm:editInformeTecnicoPanelGrid" action="#{informeTecnicoBean.onEdit}"
                                oncomplete="PF('editInformeTecnicoDialogWidget').show()" title="#{msg.label_edit}">
                                <f:setPropertyActionListener value="#{informeTecnico}" target="#{informeTecnicoBean.informeTecnico}" />
                            </p:commandButton>
                            <p:tooltip for="editInformeTecnicoButton" value="#{msg.label_edit}" showEffect="fade" hideEffect="fade" />
                            <sec:authorize access="!hasRole('ROLE_CONSULTA')">
                            <p:commandButton id="deleteInformeTecnicoButton" icon="ui-icon-trash"
                                oncomplete="PF('deleteInformeTecnicoDialogWidget').show()" title="#{msg.label_delete}">
                                <f:setPropertyActionListener value="#{informeTecnico}" target="#{informeTecnicoBean.informeTecnico}" />
                            </p:commandButton>
                            <p:tooltip for="deleteInformeTecnicoButton" value="#{msg.label_delete}" showEffect="fade" hideEffect="fade" />
                            </sec:authorize>
                        </p:column>

                    </p:dataTable>

                    <p:dataTable id="informeSeguimientoes"
                        value="#{informeSeguimientoBean.getInformeSeguimientoesByDependienteId(dependiente.id)}" var="informeSeguimiento"
                        resizableColumns="false" scrollable="true" scrollWidth="98%" scrollHeight="150">

                        <f:facet name="header">
                            #{msg.entity_informe_seguimiento_pl}
                            <sec:authorize access="!hasRole('ROLE_CONSULTA')">  
                            <p:commandButton id="createInformeSeguimientoButton" icon="ui-icon-circle-plus" update=":dataForm:data"
                                oncomplete="PF('createInformeSeguimientoDialogWidget').show()" title="#{msg.label_create}" />
                                </sec:authorize>
                        </f:facet>

                        <p:column headerText="Centro" colspan="2" sortBy="#{informeSeguimiento.centroAsignado}">
                            <h:outputText value="#{informeSeguimiento.centroAsignado}" />
                        </p:column>

                        <p:column headerText="Estado" colspan="1" sortBy="#{informeSeguimiento.estado}">
                            <h:outputText value="#{informeSeguimiento.estado}" />
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaEntrada')}" colspan="1"
                            sortBy="#{informeSeguimiento.fechaEntrada}">
                            <h:outputText value="#{informeSeguimiento.fechaEntrada}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaSalida')}" colspan="1"
                            sortBy="#{informeSeguimiento.fechaSalida}">
                            <h:outputText value="#{informeSeguimiento.fechaSalida}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('fechaRevision')}" colspan="1"
                            sortBy="#{informeSeguimiento.fechaRevision}">
                            <h:outputText value="#{informeSeguimiento.fechaRevision}">
                                <f:convertDateTime type="date" pattern="dd/MM/yyyy" />
                            </h:outputText>
                        </p:column>

                        <p:column headerText="#{applicationBean.getColumnName('observaciones')}" colspan="6"
                            sortBy="#{informeSeguimiento.observaciones}">
                            <h:outputText value="#{informeSeguimiento.observaciones}" />
                        </p:column>

                        <p:column headerText="#{msg.label_actions}" colspan="1" styleClass="actions_column">
                            <p:commandButton id="editInformeSeguimientoButton" icon="ui-icon-pencil"
                                update=":editInformeSeguimientoForm:editInformeSeguimientoPanelGrid" action="#{informeSeguimientoBean.onEdit}"
                                oncomplete="PF('editInformeSeguimientoDialogWidget').show()" title="#{msg.label_edit}">
                                <f:setPropertyActionListener value="#{informeSeguimiento}" target="#{informeSeguimientoBean.informeSeguimiento}" />
                            </p:commandButton>
                            <p:tooltip for="editInformeSeguimientoButton" value="#{msg.label_edit}" showEffect="fade" hideEffect="fade" />
                            <sec:authorize access="!hasRole('ROLE_CONSULTA')">
                            <p:commandButton id="deleteInformeSeguimientoButton" icon="ui-icon-trash"
                                oncomplete="PF('deleteInformeSeguimientoDialogWidget').show()" title="#{msg.label_delete}">
                                <f:setPropertyActionListener value="#{informeSeguimiento}" target="#{informeSeguimientoBean.informeSeguimiento}" />
                            </p:commandButton>
                            <p:tooltip for="deleteInformeSeguimientoButton" value="#{msg.label_delete}" showEffect="fade" hideEffect="fade" />
                            </sec:authorize>
                        </p:column>

                    </p:dataTable>

                </h:panelGrid>
            </p:panel>
        </h:form>

        <p:dialog id="createSolicitudDialog" header="#{msg.label_create} #{msg.entity_solicitud}" modal="true"
            widgetVar="createSolicitudDialogWidget" dynamic="true" visible="#{solicitudBean.createDialogVisible}"
            resizable="true" maximizable="true" showEffect="fade" hideEffect="explode">
            <p:ajax event="close" update=":dataForm:data" listener="#{solicitudBean.handleDialogClose}" />
            <p:outputPanel id="createSolicitudPanel">
                <h:form id="createSolicitudForm" enctype="multipart/form-data">
                    <h:panelGrid id="createSolicitudPanelGrid" columns="3" binding="#{solicitudBean.createPanelGridWithDependiente}"
                        styleClass="dialog" columnClasses="col1,col2,col3" />
                    <p:commandButton id="createSolicitudSaveButton" value="#{msg.label_save}" action="#{solicitudBean.persist}"
                        update="createSolicitudPanelGrid :growlForm:growl" />
                    <p:commandButton id="createSolicitudCloseButton" value="#{msg.label_close}"
                        onclick="PF('createSolicitudDialogWidget').hide()" type="button" />
                </h:form>
            </p:outputPanel>
        </p:dialog>





    </ui:define>
</ui:composition>
</html>

If I delete the datatables in the , performance is good. As I add more datatables, pressing the Edit or New buttons, the performance worsens a hundred times what it took with a single datatable. I do not know if it's because of the amount of components or if I have some error somewhere.

JSF 2.2.2

Is it possible to make a page with these components with a better performance?

UPDATE

Solved the main problem, there's a request that still lasts about 8sec, when the "edit" or "new" buttons are pressed.

The request is:

<partial-response id="j_id1">
<changes>
<update id="messages"> <span id="messages" class="ui-growl-pl" data-widget="growlMessages" data-global="data-global" data-detail="data-detail" data-severity="all,error" data-redisplay="true"></span><script id="messages_s" type="text/javascript">$(function(){PrimeFaces.cw('Growl','growlMessages',{id:'messages',sticky:true,life:6000,escape:true,msgs:[]});});</script>
</update>
<update id="j_id1:javax.faces.ViewState:0" >
-3678468041119945888:-2864750922368241957
</update>
</changes>
</partial-response>

Why is this request performed? Can I avoit it?

Alfonso Tienda
  • 3,442
  • 1
  • 19
  • 34
  • Displaying many items at once (as it appears) most likely involves too many SQL queries on the back-end side. In most cases, performance implication involves non-optimized SQL queries and eager loading on the database side. – Tiny Jun 13 '17 at 14:46
  • Hy Tiny, thanks for your comment. Page load is not the problem. Problem is when i try to call the bean, when all data is loaded (rendering the dialogs, for example). data loading time is milisec. – Alfonso Tienda Jun 13 '17 at 15:12
  • You mainly have outputs, right? Can you use a phaselistener to see where the time is spent? See http://balusc.omnifaces.org/2006/09/debug-jsf-lifecycle.html And off-topic: don't use `prependId="false"`, it breaks ajax: http://stackoverflow.com/questions/7415230/uiform-with-prependid-false-breaks-fajax-render – Kukeltje Jun 13 '17 at 15:27
  • And what do the method like `#{informeSeguimientoBean.getInformeSeguimientoesByDependienteId(dependiente.id)}` do? How are they implemented? 'lazy'? See https://stackoverflow.com/questions/2090033/why-jsf-calls-getters-multiple-times – Kukeltje Jun 13 '17 at 15:35
  • And does performance increase if you replace all PrimeFaces tags with the jsf counterparts where possible? And what if you add `process="this"` to the commandButton? – Kukeltje Jun 13 '17 at 15:57
  • I'll try some of your solutions. thank you – Alfonso Tienda Jun 13 '17 at 16:05
  • thanks, @Kukeltje Ok, I delete the prependId="false" and the second call that lasted 15seg now lasts only 230ms. Amazing. I don't really understand what prependId=false does, is part of the roo generated code. Now, the first call lasts about 8sec, but only when "new button" is pressed. The request is in an update of my question. – Alfonso Tienda Jun 13 '17 at 16:52
  • It is an ajax **response** – Kukeltje Jun 13 '17 at 21:45
  • All my other comments are still valid btw... and regarding prependId=false, search the internet (and the link I gave you) – Kukeltje Jun 13 '17 at 21:52

1 Answers1

1

Thanks to @Kukelje I have a response:

My main problem is I'm using prependId="false", causing breaks on ajax:

UIForm with prependId="false" breaks <f:ajax render>

All the other posibilities mentioned in the comments by @kukelje are also good answers for better performance:

  • Replace all PrimeFaces tags with the jsf counterparts where possible
  • Add process="this" to the commandButton?
Alfonso Tienda
  • 3,442
  • 1
  • 19
  • 34
  • This is not a real full/good answer.. Your first bullet is for rendering delay, not submission delay. The process="@this" is useful if you have lots and lots of rows in the datatable. You could have tested and mentioned this. Instead you 'just' mentioned adding more datatables... So maybe you can improve your answer with more detail – Kukeltje Jun 14 '17 at 09:05