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}: #{dependiente.apellidos}, #{dependiente.nombre} (#{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?
我使用 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}: #{dependiente.apellidos}, #{dependiente.nombre} (#{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?