以下のコードのアイデアは、遅延ロードされたパネルがロードされたときにブラウザーにダウンロード ダイアログを表示することです。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.wicket.Component;
import org.apache.wicket.extensions.ajax.markup.html.AjaxLazyLoadPanel;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
import org.apache.wicket.request.resource.ContentDisposition;
import org.apache.wicket.util.resource.AbstractResourceStreamWriter;
public class LazyLoadedPage extends WebPage {
public LazyLoadedPage() {
add(new Label("text", "waiting..."));
add(new AjaxLazyLoadPanel("lazy") {
@Override
public Component getLazyLoadComponent(final String id) {
try {
Thread.sleep(2000);
} catch (final InterruptedException e) {
throw new RuntimeException(e);
}
final ResourceStreamRequestHandler handler = new ResourceStreamRequestHandler(new Resource(),
"test2.txt");
// handler.setContentDisposition(ContentDisposition.ATTACHMENT);
getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);
return new EmptyPanel(id);
}
});
}
class Resource extends AbstractResourceStreamWriter {
@Override
public void write(final OutputStream output) throws IOException {
final File tempFile = File.createTempFile("test", "txt");
final FileOutputStream fos = new FileOutputStream(tempFile);
fos.write("text".getBytes());
fos.close();
final FileInputStream fis = new FileInputStream(tempFile);
final byte[] buff = new byte[10];
final int cnt = fis.read(buff);
output.write(buff, 0, cnt);
}
}
}
しかし、試してみると、Wicket Ajax デバッグ ウィンドウに次のエラーが表示されます。
ERROR: Wicket.Ajax.Call.failure: Error while parsing response: Error: Invalid XML: text
コードを修正するにはどうすればよいですか (おそらく別のアプローチを使用して)?