tutorial quickstart example deporte java download wicket

java - quickstart - wicket manual



¿Cómo usar el enlace de descarga de Wicket con un archivo generado sobre la marcha? (2)

DownloadLink es agradable y útil para crear un botón / enlace para descargar un archivo, en este sentido:

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

y

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

Sin embargo, me gustaría activar la generación del archivo para descargar solo cuando se hace clic en el botón / enlace . En otras palabras, al hacer clic, llamaría a un método que genera el archivo (un informe Pentaho en nuestro caso), lo coloca en un lugar temporal y devuelve un File señala. Luego le diría a DownloadLink que use ese File . La pregunta es, ¿ es esto posible de alguna manera ?

Actualmente tenemos algo como el siguiente código, que funciona, pero me interesa saber si se puede usar DownloadLink su lugar.

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")); } });

(Wicket 1.4.18, si hace una diferencia.)


¿No puedes usar el constructor que toma un Model como argumento? Y haga que el Model genere el File en su getObject() . Un LoadableDetachableModel es una buena opción, dado que load() , y por lo tanto la generación de archivos, se invocará solo una vez.

Si el archivo se debe generar cada vez que se hace clic en el enlace, use DownloadLink.setDeleteAfterDownload(true) para asegurarse de que el archivo se elimine automáticamente una vez que se sirva.

No uso 1.4, pero el código fuente en 1.3 muestra que el File se recupera por medio de getModelObject() en el método onClick() del Link .

IModel fileModel = new AbstractReadOnlyModel(){ public Object getObject() { return generateFile(); } }; DownloadLink link = new DownloadLink(linkId, fileModel, "report.pdf");

Código fuente de 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 */...); }


Utilice org.apache.wicket.markup.html.link.ResourceLink en su lugar.