JSF + Primefaces 在复杂页面上速度太慢

JSF + Primefaces too slow on complex page

我使用 Spring Roo 1.X + JSF 插件进行开发。

我有下一页,一个非常长且复杂的页面,有 5 个数据表(下一个版本是简化的,我只显示一些对话框:

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

如果我删除 中的数据表,性能会很好。当我添加更多数据表时,按下“编辑”或“新建”按钮,性能会比使用单个数据表时恶化一百倍。我不知道是不是因为组件的数量或者我在某处有一些错误。

JSF 2.2.2

是否可以用这些组件制作出性能更好的页面?

更新

解决了主要问题,当按下 "edit" 或 "new" 按钮时,有一个请求仍然持续约 8 秒。

请求是:

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

为什么执行这个请求?我可以避免吗?

感谢@Kukelje 我得到了回复:

我的主要问题是我正在使用 prependId="false",导致 ajax 中断:

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

@kukelje 评论中提到的所有其他可能性也是提高性能的好答案:

  • 尽可能将所有 PrimeFaces 标签替换为 jsf 对应标签
  • 添加 process="this" 到 commandButton?