Oracle ADF:下载文件后关闭弹出窗口
Oracle ADF: Close popup after downloading file
事情是这样的。我有一个带有按钮的弹出窗口,按钮本身有一个 fileDownloadActionListener,这个负责下载 excel 文件。所以我基本上需要的是在生成文件后立即隐藏弹出窗口。
这是我的 .jspx 文件(只是弹出窗口)
<af:popup childCreation="deferred" autoCancel="enabled"
id="myPopUp"
contentDelivery="lazyUncached"
binding="#{viewScope.mbMyBean.myPopUp}"
partialTriggers="b17">
<af:dialog id="d16" type="cancel"
title="Do you wish to download a file?"
inlineStyle="width:400px;">
<af:panelGroupLayout id="pgl32"
inlineStyle="max-width: 200px;">
<af:outputText value="You're about to download a file. Ready?" id="ot45"
/>
</af:panelGroupLayout>
<f:facet name="buttonBar">
<af:button text="GO" id="b17"
<af:fileDownloadActionListener contentType="excelHTML"
filename="#{viewScope.mbMyBean.FileName}"
method="#{viewScope.mbMyBean.GenerateEmptyExcel}"
/>
</af:button>
</f:facet>
</af:dialog>
</af:popup>
这里是 java 方法:
public void GenerateEmptyExcel(FacesContext facesContext, OutputStream outputStream) {
try {
HSSFWorkbook wb1 = generateEmptyExcelFile();
wb1.write(outputStream);
outputStream.flush();
outputStream.close();
this.myPopUp.hide();
AdfFacesContext.getCurrentInstance().addPartialTarget(this.myPopUp);
System.gc();
} catch (Exception e) {
e.printStackTrace();
}
}
问题
弹出窗口不会隐藏。
注释
- 弹出窗口在 bean 中正确绑定
- 我不拥有此代码,我正在进行维护。
- 我不知道为什么程序员使用 System.gc() 因为我认为这是一种不好的做法。 Here's a good reason
理想情况下 this.myPopUp.hide();
应该关闭弹出窗口,但如果由于某种原因它不起作用,您可以尝试使用 javascript 关闭弹出窗口,例如:
public static void hidePopup(String popupId){
if (popupId != null)
{
ExtendedRenderKitService service =
Service.getRenderKitService(FacesContext.getCurrentInstance(),
ExtendedRenderKitService.class);
StringBuffer hidePopup = new StringBuffer();
hidePopup.append("var popupObj=AdfPage.PAGE.findComponent('" + popupId +
"'); popupObj.hide();");
service.addScript(FacesContext.getCurrentInstance(), hidePopup.toString());
}
}
您可以获得可以传递给 hidePopup 的弹出窗口 clientId:this.myPopUp.getClientId(FacesContext.getCurrentInstance());
我在下载文件后遇到了同样的问题,你应该试试这个:
使用资源类型java脚本触发 commandButton 中的事件点击
<af:resource type="javascript">
function customHandler(evt) {
console.log(evt);
var exportCmd = AdfPage.PAGE.findComponentByAbsoluteId("pt1:b17");
console.log(exportCmd);
var actionEvent = new AdfActionEvent(exportCmd);
console.log(actionEvent);
actionEvent.forceFullSubmit();
actionEvent.noResponseExpected();
actionEvent.queue(false);
setTimeout(function(){hidePopup();}, 1000);
}
function hidePopup() {
var popup = AdfPage.PAGE.findComponent("pt1:popupAceptarDescargarPlantilla::content");
popup.hide();
}
</af:resource>
您应该有以下按钮:
<af:commandButton text="Aceptar" id="b17" visible="false" clientComponent="true" partialSubmit="true">
<af:fileDownloadActionListener contentType="excelHTML" filename="#{viewScope.mbGestionArchivos.nombre_archivo}" method="#{viewScope.mbGestionArchivos.generateExcelVacio}"/>
</af:commandButton>
<af:button text="Aceptar" id="botonPrueba" actionListener="#{viewScope.mbInformeDetalle.prepareForDownloadAction}" clientComponent="true" partialSubmit="true"></af:button>
这是按钮调用的java方法:
public void prepareForDownloadAction(ActionEvent act) {
FacesContext context = FacesContext.getCurrentInstance();
ExtendedRenderKitService erks =
Service.getService(context.getRenderKit(),
ExtendedRenderKitService.class);
erks.addScript(context, "customHandler();");
}
隐藏按钮是使用javaADF方法脚本触发的,魔法发生在setTimeout中,当执行这个函数时,我们暂时避免提交,但请求传输到服务器,在这里我们可以观察文件是如何启动的。
事情是这样的。我有一个带有按钮的弹出窗口,按钮本身有一个 fileDownloadActionListener,这个负责下载 excel 文件。所以我基本上需要的是在生成文件后立即隐藏弹出窗口。
这是我的 .jspx 文件(只是弹出窗口)
<af:popup childCreation="deferred" autoCancel="enabled"
id="myPopUp"
contentDelivery="lazyUncached"
binding="#{viewScope.mbMyBean.myPopUp}"
partialTriggers="b17">
<af:dialog id="d16" type="cancel"
title="Do you wish to download a file?"
inlineStyle="width:400px;">
<af:panelGroupLayout id="pgl32"
inlineStyle="max-width: 200px;">
<af:outputText value="You're about to download a file. Ready?" id="ot45"
/>
</af:panelGroupLayout>
<f:facet name="buttonBar">
<af:button text="GO" id="b17"
<af:fileDownloadActionListener contentType="excelHTML"
filename="#{viewScope.mbMyBean.FileName}"
method="#{viewScope.mbMyBean.GenerateEmptyExcel}"
/>
</af:button>
</f:facet>
</af:dialog>
</af:popup>
这里是 java 方法:
public void GenerateEmptyExcel(FacesContext facesContext, OutputStream outputStream) {
try {
HSSFWorkbook wb1 = generateEmptyExcelFile();
wb1.write(outputStream);
outputStream.flush();
outputStream.close();
this.myPopUp.hide();
AdfFacesContext.getCurrentInstance().addPartialTarget(this.myPopUp);
System.gc();
} catch (Exception e) {
e.printStackTrace();
}
}
问题
弹出窗口不会隐藏。
注释
- 弹出窗口在 bean 中正确绑定
- 我不拥有此代码,我正在进行维护。
- 我不知道为什么程序员使用 System.gc() 因为我认为这是一种不好的做法。 Here's a good reason
理想情况下 this.myPopUp.hide();
应该关闭弹出窗口,但如果由于某种原因它不起作用,您可以尝试使用 javascript 关闭弹出窗口,例如:
public static void hidePopup(String popupId){
if (popupId != null)
{
ExtendedRenderKitService service =
Service.getRenderKitService(FacesContext.getCurrentInstance(),
ExtendedRenderKitService.class);
StringBuffer hidePopup = new StringBuffer();
hidePopup.append("var popupObj=AdfPage.PAGE.findComponent('" + popupId +
"'); popupObj.hide();");
service.addScript(FacesContext.getCurrentInstance(), hidePopup.toString());
}
}
您可以获得可以传递给 hidePopup 的弹出窗口 clientId:this.myPopUp.getClientId(FacesContext.getCurrentInstance());
我在下载文件后遇到了同样的问题,你应该试试这个:
使用资源类型java脚本触发 commandButton 中的事件点击
<af:resource type="javascript">
function customHandler(evt) {
console.log(evt);
var exportCmd = AdfPage.PAGE.findComponentByAbsoluteId("pt1:b17");
console.log(exportCmd);
var actionEvent = new AdfActionEvent(exportCmd);
console.log(actionEvent);
actionEvent.forceFullSubmit();
actionEvent.noResponseExpected();
actionEvent.queue(false);
setTimeout(function(){hidePopup();}, 1000);
}
function hidePopup() {
var popup = AdfPage.PAGE.findComponent("pt1:popupAceptarDescargarPlantilla::content");
popup.hide();
}
</af:resource>
您应该有以下按钮:
<af:commandButton text="Aceptar" id="b17" visible="false" clientComponent="true" partialSubmit="true">
<af:fileDownloadActionListener contentType="excelHTML" filename="#{viewScope.mbGestionArchivos.nombre_archivo}" method="#{viewScope.mbGestionArchivos.generateExcelVacio}"/>
</af:commandButton>
<af:button text="Aceptar" id="botonPrueba" actionListener="#{viewScope.mbInformeDetalle.prepareForDownloadAction}" clientComponent="true" partialSubmit="true"></af:button>
这是按钮调用的java方法:
public void prepareForDownloadAction(ActionEvent act) {
FacesContext context = FacesContext.getCurrentInstance();
ExtendedRenderKitService erks =
Service.getService(context.getRenderKit(),
ExtendedRenderKitService.class);
erks.addScript(context, "customHandler();");
}
隐藏按钮是使用javaADF方法脚本触发的,魔法发生在setTimeout中,当执行这个函数时,我们暂时避免提交,但请求传输到服务器,在这里我们可以观察文件是如何启动的。