当前位置: 首页 > 面试题库 >

如何将Wicket的DownloadLink与动态生成的文件一起使用?

燕星鹏
2023-03-14
问题内容

DownloadLink
沿以下几行创建用于下载文件的按钮/链接非常方便:

add(new DownloadLink("downloadButton", getReportFile(), "report.pdf"));

<input type="button" wicket:id="downloadButton" value="Download" />

但是,我想 触发仅在单击按钮/链接时下载文件的生成
。换句话说,单击后,我将调用一个方法来生成文件(在本例中为Pentaho报告),将其放置在临时位置并返回File指向该文件的指针。然后我告诉那个DownloadLink使用它File。问题是,
这有可能 吗?

目前,我们有类似下面的代码,可以正常工作,但是我对是否DownloadLink可以代替它感兴趣。

add(new Link<Void>("downloadButton") {
  @Override
  public void onClick() {
    IResourceStream resourceStream = new AbstractResourceStreamWriter() {
      @Override 
      public void write(OutputStream output) {
        try {
          reportService.generateReport(output, report);
        } catch (IOException e) {
          // ...
        }
      }

      @Override
      public String getContentType() {                        
        return CONTENT_TYPE_PDF;
      }
    };

    getRequestCycle()
      .setRequestTarget(new ResourceStreamRequestTarget(resourceStream)
      .setFileName("report.pdf"));
  }
});

(如果有区别,请参见1.4.18节。)


问题答案:

您不能使用以Modelas作为参数的构造函数吗?并且使Model产生File在其getObject()LoadableDetachableModel鉴于load(),因此文件生成将仅被调用一次,因此A
是一个不错的选择。

如果要在每次单击链接时重新生成文件,请使用,DownloadLink.setDeleteAfterDownload(true)以确保在提供文件后自动将其删除。

我没有使用1.4,但是1.3中的源代码显示File通过getModelObject()onClick()方法检索到Link

IModel fileModel = new AbstractReadOnlyModel(){
    public Object getObject() { 
        return generateFile();
    }
};

DownloadLink link = new DownloadLink(linkId, fileModel, "report.pdf");

源代码
DownloadLink.onClick()

public void onClick()
{
    final File file = (File)getModelObject();
            ...
    IResourceStream resourceStream = new FileResourceStream(
            new org.apache.wicket.util.file.File(file));
    getRequestCycle().setRequestTarget(.../* uses resourceStream */...);
}


 类似资料:
  • 问题内容: 我有一个自定义插件,可以在(请注意此处没有工具名)下生成源。所以我得到像…等的资源。 此格式完全不能更改,因此我将能够配置Intellij将其添加为源文件夹。到目前为止,我可以看到Intellij已添加为源文件夹。 请注意,我没有配置插件的选项! 更新1 :我不同意我必须将生成的源放置在工具名称文件夹下的事实。这可能是一个很好的约定,但是如果我只有一个生成器,是否不需要我将其放置在那里

  • 我必须在运行时动态生成一个xml文件。请帮助我使用PHP动态生成下面的XML文件。 null

  • 问题内容: 我正在构建一个Wicket Web应用程序,它将必须处理很多同时请求。我已经设置了一个测试环境和一些jmeter脚本来进行负载测试,并且我注意到,如果我将大多数页面设置为无状态,则可以减少应用程序的CPU和内存占用。 我已将代码添加到最大页面的onBeforeRender()方法中,以向我显示哪些组件导致页面变为有状态。这是我用于检测的代码: 在输出中,我看到有状态行为是由页面中某些现

  • 问题内容: 我正在使用Spring,Spring Data JPA,Spring Security,Primefaces的项目中工作… 在本教程中,你只能在预定义的数据源之间实现动态数据源切换。 这是我的代码的片段: springContext-jpa.xml 我想做的就是使targetDataSources映射也与其元素一样动态。 换句话说,我想获取某个数据库表,使用存储在该表中的属性创建我的数

  • 我在一个使用Spring、Spring数据JPA、Spring Security、Primefaces的项目中工作。。。 我正在学习关于spring动态数据源路由的教程。 在本教程中,您只能在预定义的数据源之间实现动态数据源切换。 以下是我的代码片段: springContext jpa。xml 我想做的是使targetDataSources映射与它的元素一样动态。 换句话说,我想获取一个特定的数

  • 我想启动一个反序列化动态创建的类的流。这个Bean是使用反射和URLCLassLOader创建的,参数为给定的字符串类,但是KafkaStreams API不识别我的新类。 流与预创建的Beans完美配合,但使用动态Beans时会自动关闭。反倾销者是和杰克逊一起创造的,也是单独工作的。 下面是类解析器代码 首先,我实例化接收类作为参数的serde 然后启动使用此Serdes的流拓扑 流拓扑应该正常