南米からこんにちは。(jasper レポートを使用して) レポートを生成しているので、このプロセスが発生している間、適切なメッセージを表示するページをブロックしたいと考えています。レポートは、次のコード行でアクションを完全に実行します。
<p:commandButton id="pago" actionListener="#{transaccionBncController.reporteGeneral}" value="Reporte General " ajax="false"/>
注: ajax="false" 属性を使用することは必須です。そうしないと、すべてがうまくいかず、レポートを生成できなくなります。
ここで、ページをブロックし、(レポートの生成中に) 適切なメッセージを表示するために Primefaces blockUI コンポーネントを追加しようとすると、次のコードを使用しています。
<p:blockUI block="panelGrid" trigger="pago">
Generando Reporte...<br />
<h:graphicImage library="images" name="ajaxloading.gif"/>
</p:blockUI>
blockUI コンポーネントは正常に機能しますが、レポートは機能しなくなりました。私はすべてを試しましたが、問題は ajax="false" 属性とページのブロックに関して常に同じです。
以下は、私が取り組んでいるソース全体です。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org /TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="/template.xhtml">
<ui:define name="content" >
<fieldset id="fieldsetgenerico" >
<legend> Reporte General </legend>
<h:form id="formreporte">
<p:growl autoUpdate="true" life="3000" id="growl" />
<h:panelGrid columns="3" id="panelGrid" >
<h:outputLabel value="Fecha inicial: " for="fechaInicial" />
<p:calendar id="fechaInicial" value="# {transaccionBncController.fechaInicial}" pattern="dd/MM/yyyy" locale="es" required="true" requiredMessage="Fecha Inicial Requerida" navigator="true" effect="fadeIn" effectDuration="100"/>
<h:outputLabel value="" />
<h:outputLabel value="Fecha Final: " for="fechaFinal"/>
<p:calendar id="fechaFinal" value="# {transaccionBncController.fechaFinal}" pattern="dd/MM/yyyy" locale="es" required="true" requiredMessage="Fecha Final Requerida" navigator="true" effect="fadeIn" effectDuration="300"/>
<p:tooltip for="fechaFinal" value="Campo Requerido. No puede ser anterior a la Fecha Inicial" showEffect="clip" hideEffect="clip" />
<h:outputLabel value="Estado: " for="estado" />
<h:selectOneMenu id="estado" value="#{transaccionBncController.estTra}" >
<f:selectItems value="#{estadoTransaccionBncController.itemsAvailableSelectOne}" />
</h:selectOneMenu>
<h:outputLabel value="" />
<h:outputLabel value="Tipo Transaccion: " for="tipoTransaccion"/>
<h:selectOneMenu id="tipoTransaccion" value="#{transaccionBncController.tipTra}"
valueChangeListener="#{transaccionBncController.defineTipoTransaccion}" >
<f:selectItems value="#{tipoTransaccionBncController.itemsAvailableSelectOne}"/>
<f:ajax execute="@all" render="panelGrid1" immediate="true"></f:ajax>
</h:selectOneMenu>
<h:outputLabel value="" />
<h:outputLabel value="Entidad Financiera: " for="entidadFinanciera" />
<h:selectOneMenu id="entidadFinanciera" value="#{transaccionBncController.cliente}"
valueChangeListener="#{transaccionBncController.actualizaAgencias}" >
<f:selectItems value="#{clienteBncController.itemsAvailableSelectOne}"/>
<f:ajax execute="@form" render="panelGrid" ></f:ajax>
</h:selectOneMenu>
<h:outputLabel value="" />
<h:outputLabel value="Agencia: " for="agencia" />
<h:selectOneMenu id="agencia" value="#{transaccionBncController.ag}" >
<f:selectItems value="#{transaccionBncController.itemsAvailableSelectOneAgencia}"/>
</h:selectOneMenu>
<h:outputLabel value="" />
<h:outputLabel value="Código Financiero: " for="codFinanciero" />
<h:selectOneMenu id="codFinanciero" value="#{transaccionBncController.codigoFinanciero}" >
<f:selectItems value="#{productoBncController.itemsAvailableSelectOneC}"/>
</h:selectOneMenu>
<h:outputLabel value="" />
</h:panelGrid>
<br/>
<h:panelGrid columns="2" id="panelGrid1">
<p:commandButton id="pago" icon="ui-icon-check" actionListener="#{transaccionBncController.reporteGeneral}" value="Reporte General " rendered="#{transaccionBncController.tipTransaccion != 'ANULACION' }" update="growl" style="margin:0" />
<p:blockUI block="panelGrid" trigger="pago" >
Generando Reporte<br />
<h:graphicImage library="images" name="ajaxloading.gif"/>
</p:blockUI>
</h:panelGrid>
</h:form>
</fieldset>
</ui:define>
</ui:composition>
</html>
この問題の根本原因は ajax インタラクションにあると思います。なぜなら、レポートの生成 (blockui コードなし) が驚くほどうまくいくからです。これは、レポートを取得しているソース コードです。
public void reporteGeneral(ActionEvent actionEvent) throws JRException, IOException, SQLException {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@170.25.18.38:1521:xxx", "xxx", "xxx");
Map<String, Object> parametros = new HashMap<String, Object>();
parametros.put("fechaInicial", fInicial);
parametros.put("fechaFinal", fFinal);
parametros.put("query", query);
String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/reportes/report4.jasper");
jasperPrint = JasperFillManager.fillReport(reportPath, parametros, conn);
//jasperPrint=JasperFillManager.fillReport(reportPath, new HashMap(),conn);
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd-MM-yyyy");
String fi = sdf.format(fInicial);
String ff = sdf.format(fFinal);
String fecha = fi.toString() + "_" + ff.toString();
httpServletResponse.addHeader("Content-disposition", "attachment; filename=reporte_" + fecha + ".pdf");
ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
FacesContext.getCurrentInstance().responseComplete();
}
どうもありがとうございました。質問が非常に初心者である場合は申し訳ありませんが、インターネットでこのトピックについて何かを見つけられなかったので、学ぶ良い機会だと思います. 繰り返しますが、あなたの助けに感謝します。サンティアゴ