单击ItemNode后下载文件

时间:2017-10-26 13:48:55

标签: java oracle-adf jdeveloper

我通过xml菜单模型使用oracle-adf。现在我想在itemNode之一上启动下载文件而不重定向。我尝试用方法定义action属性,该方法通过javascript调用隐藏按钮的方法(此按钮具有内部fileDownloadActionListener)。但它不起作用。这是对的吗?还是有其他方法来决定这个问题?或者可能根本不可能?

隐藏按钮代码:

<itemNode id="userInstructionsDownloadFlow" label="Инструкции пользователя"
              focusViewId="#"
              action="#{pageFlowScope.vocsReportsRegionController.invokeInstructionDownload}"
              partialSubmit="true"
              clientComponent="true"/>

项目节点代码:

function handleInstructionsDownload(event) {
    event.preventUserInput();
    var source = event.getSource().getParent();
    var downloadBtn = source.findComponent("downloadInstructionsBtn");
    var actionEvent = new AdfActionEvent(downloadBtn);
    actionEvent.preventUserInput();
    actionEvent.queue();
}

Javascript cut:

public void invokeInstructionDownload(){
    FacesContext context = FacesContext.getCurrentInstance();
    ExtendedRenderKitService erks =
            Service.getService(context.getRenderKit(),
                    ExtendedRenderKitService.class);

    erks.addScript(context, "handleInstructionsDownload();");
}

public void instructionsDownload(FacesContext context,
                                 OutputStream out) throws IOException{
    File f = new File("C:\\Users\\apozdnyakov\\Downloads\\Типы_контроля_время.xlsx");
    FileInputStream fis;
    byte[] b;
    try {
        fis = new FileInputStream(f);

        int n;
        while ((n = fis.available()) > 0) {
            b = new byte[n];
            int result = fis.read(b);
            out.write(b, 0, b.length);
            if (result == -1)
                break;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    out.flush();
}

方法&#39;描述:

side = 4
for i in range(side):
    for j in range(i):
        if i%2==0:
            print("#",end="")
        else:
            print("$",end="")
    print()

1 个答案:

答案 0 :(得分:0)

我认为你的问题有几个可能的原因。

由于jsf代码的层次结构,

1- handleInstructionsDownload javascript函数无法找到该组件。您可以添加登录javascript函数,以便了解它。

function handleInstructionsDownload(event) {
  event.preventUserInput();
  var source = event.getSource().getParent();
  var downloadBtn = source.findComponent("downloadInstructionsBtn");
  if (downloadBtn == null) {
    console.log('The component is null!');
  }
  var actionEvent = new AdfActionEvent(downloadBtn);
  actionEvent.preventUserInput();
  actionEvent.queue();
}

如果您在javascript控制台中看到此日志,则应控制jsf代码的层次结构。您应该按真实组件ID访问按钮。

2- invokeInstructionDownload java方法无法找到或调用javascript handleInstructionsDownload 函数。您可以在javascript函数的第一行添加日志:

function handleInstructionsDownload(event) {
  console.log('The js function fired!');
  event.preventUserInput();
  var source = event.getSource().getParent();
  var downloadBtn = source.findComponent("downloadInstructionsBtn");
  var actionEvent = new AdfActionEvent(downloadBtn);
  actionEvent.preventUserInput();
  actionEvent.queue();
}

如果有这个登录控制台,你应该改变你的javascript方法调用。但我认为你的Java方法是正确的:)

3-如果这些不是你问题的解决方案,你可以改变你那样的隐藏按钮。

隐藏按钮代码:

<af:commandButton text="NONE" 
                  id="downloadInstructionsBtn" action=" "
                  visible="false"
                  clientComponent="true"
                  partialSubmit="false"
                  binding="#{pageFlowScope.vocsReportsRegionController.downloadInstructionsBtn}">
   <af:fileDownloadActionListener filename="Инструкции пользователя"
                  contentType="application/vnd.openxmlformats officedocument.spreadsheetml.sheet"
                  method="#{pageFlowScope.vocsReportsRegionController.instructionsDownload}"/> 
</af:commandButton>

ManagedBean代码:

private RichButton downloadInstructionsBtn;

public RichButton getDownloadInstructionsBtn() {
  return downloadInstructionsBtn;
}

public void setDownloadInstructionsBtn(RichButton downloadInstructionsBtn) {
  this.downloadInstructionsBtn = downloadInstructionsBtn;
}

public void invokeInstructionDownload(){
  ActionEvent actionEvent = new ActionEvent((UIComponent) downloadInstructionsBtn);
  actionEvent.queue();
}